我想构建一种回测软件,该软件可以读取不同来源的报价和报价。应该有两种模式。
例如,一个数据来自Yahoo,另一数据源是CSV文件。实时明确实施。先进先出,从源#1滴答,从源#2滴答,依此类推。历史模式有点棘手。看起来这是使用复杂事件处理按时间同步时间序列的好地方。
来源
var T1 = [ 1, 2, 3, 4, 15, 20, 21, 22 ];
var T2 = [ 3, 4, 5, 6, 10, 13, 50, 51 ];
期望
不应一次性读取和排序系列,因为它们可能很大,不利于存储。它应该逐步发生,从T1读取值,从T2读取值,等等。
Print 1 (T1)
Print 2 (T1)
Print 3 (T1)
Print 3 (T2)
Print 4 (T1)
Print 4 (T2)
Print 5 (T2)
Print 6 (T2)
Print 10 (T2)
Print 13 (T2)
Print 15 (T1)
Print 20 (T1)
Print 21 (T1)
Print 22 (T1)
Print 50 (T2)
Print 51 (T2)
问题
因此,我们需要在来源#2的第一个日期之前显示来源#1的价格变动。另外,某些时间序列中可能会缺少一些值。目前,我正在考虑这种实现方式,但是看起来都太复杂了。
Accounts = new Dictionary<string, IAccount>();
var queue = new ConcurrentDictionary<string, List<ITick>>();
// Get first tick for each timeseries as a start point
Parallel.ForEach(Accounts, (account) =>
{
queue[account.Key] = new List<ITick> { account.Value.GetFirstTick() };
});
Parallel.ForEach(Accounts, (account) =>
{
// Sibscribe to each source and start receiving ticks simultaneously
account.Value.EventProcessTick += (ITick item) =>
{
// Save incoming tick to the queue for the future analysis
queue[account.Key].Add(item);
// Find the latest time among all ticks in the queue
var stepTime = queue.Values.Max(o => o.LastOrDefault()).Time;
Parallel.ForEach(queue.Values, (queueItems) =>
{
queueItems.ForEach((v) =>
{
// If any tick in the queue crossed time check point, output it and remove from the queue
if (v.Time <= stepTime)
{
OnTickProcessed(v);
queue[account.Key].Remove(item);
}
});
});
};
account.Value.Run();
});
问题
有没有用于这种任务的算法,是否有可能使它更简单或更可靠?