2011-11-29 68 views
2

我试图在运行时使用tick数据建立股票市场酒吧(快照)数据。我的股票数据提供者提供对tick价格数据的访问权限,在该数据中我有一个名为OnTick的事件,每当数据提供者发送新的刻度时都会触发该事件。我希望做下面的两个中的一个,或者如果有人能提出一个很好的选择:使用股票价格数据建立基于时间的酒吧

选项1:

在这个选项我保持一个酒吧对象,每次更新它,我得到一个蜱。 OnBar()事件可以附加到一个计时器已过去的事件(1分钟1分钟等)。

//TickMsg = double price, DateTime dttm 
public void OnTick(TickMsg newTick) 
{ 
    TaskFactory.StartNew(){UpdateBar(newTick)};//Syntax not specific 
} 

UpdateBar() 
{ 
      //nextBar is a Bar object thats intialized to Open = 0, High = 0, Low = 0, Close = 0 
    if(nextBar.Open==0) 
     nextBar.Open = newTick.price; 

    if(newTick.price>nextBar.High) 
     nextBar.High = newTick.price; 

    if(newTick.price<nextBar.Low) 
     nextBar.Low = newTick.price; 

     nextBar.Close = newTick.price; 

} 

public void OnBar(Bar bar) 
{ 
    //Process the bar..perform calculations etc 
    bar = new Bar(0,0,0,0);//Reset the bar 
} 

选项2:

在这个选项中,我只是将蜱蜱的列表,并进行计算时的OnBar被调用。 OnBar()事件可以附加到一个计时器已过去的事件(1分钟1分钟等)。

List <TickMsg> TickList; 
public void OnTick(TickMsg newTick) 
{ 
    TickList.Add(newTick); 
} 

public void OnBar()//called on a timer 
{ 
    var low = TickList.Min(); 
    var high = TickList.Max(); 
    var close = (from entry in TickList orderby entry.TickMsg.dttm ascending).Last(); 
    var open = (from entry in TickList orderby entry.TickMsg.dttm ascending).First(); 

    TickList.Empty(); 
} 

问题:

  • 哪种方法更密集的处理?
  • 哪种方法需要更多的内存?

再说一遍,如果有人对另一种方法有什么建议,我就会全神贯注。

回答

0

Trade link就是这样做的一个很好的例子。他们的教程涵盖了这一点。另外,由于它是开源的,你可以窥探它是如何完成的。 The getting started tutorial is here.

+0

谢谢,将检查交易链接遵循什么方法,但我必须补充说,我的查询的关键是讨论不同选项的权衡和好处。交易链接所采用的方法可能不是我系统的最佳方法。 – Aziz

1

在完成之前是否需要显示或访问栏?如果选项2似乎不能实现这一点。选项1我永远无法想象会是一场表演障碍。它会使用更少的内存,因为您似乎不会将刻度数据保存到任何变量中。

+0

即使选项1没有达到您的建议,它会在完成时间后发布。然而,你是对的,我们最终与1一起,即使代码不像它看起来那么简单。 – Aziz

1

我认为这是第二种最好的方法。 当您在第一次进场时重置钢筋时,最低价格永远不会低于零,因此钢筋低价始终为零。

+0

同意 - 代码中存在逻辑错误,下面的行应该将最大数设置为低,同时重置。 bar = new Bar(0,0,0,0); 然而,从性能的角度来看问题更多,我们选择了1。 – Aziz