使用股票报价数据构建基于时间的柱
Posted
技术标签:
【中文标题】使用股票报价数据构建基于时间的柱【英文标题】:Build time based bars using stock tick data 【发布时间】:2011-11-29 09:35:40 【问题描述】:我正在尝试使用报价数据在运行时构建股票市场条形图(快照)数据。我的股票数据提供者提供对分时级别数据的访问,其中我有一个名为 OnTick 的事件,只要数据提供者发送新分时,就会触发该事件。我希望做以下两个之一,或者如果有人可以提出一个好的选择:
选项 1:
在这个选项中,我维护一个 Bar 对象,并在每次得到一个刻度时更新它。 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();
问题:
哪种方法处理更密集? 哪种方法需要更多内存?同样,如果有人对替代方法有建议,我会全力以赴。
【问题讨论】:
【参考方案1】:您不需要在栏完成之前显示或访问栏吗?如果选项 2 似乎无法实现这一点。选项 1 我永远无法想象会成为性能障碍。而且它会使用更少的内存,因为您似乎没有将刻度数据保存到任何变量中。
【讨论】:
即使选项 1 没有达到您的建议,它会在时间完成后发布。但是你说得对,我们最终选择了 1,即使代码并不像这里看起来那么简单。【参考方案2】:我认为最好的方法是第二种。 当您在第一次接近时重置柱线时,最低价格永远不会小于零,因此,柱线的最低价格将始终为零。
【讨论】:
同意 - 代码中存在逻辑错误,以下行应在重置时将 Max Number 设置为低。酒吧 = 新酒吧(0,0,0,0);然而,从性能角度提出了更多问题,我们选择了选项 1。【参考方案3】:Trade link 是一个很好的例子,说明它是如何完成的。他们的教程涵盖了这一点。此外,由于它是开源的,您可以了解它是如何完成的。 The getting started tutorial is here.
【讨论】:
谢谢,我会看看 trade-link 遵循什么方法,但是我必须补充一点,我的查询的关键是讨论不同选项的权衡和好处。贸易链接所遵循的方法可能不是我系统的最佳方法。以上是关于使用股票报价数据构建基于时间的柱的主要内容,如果未能解决你的问题,请参考以下文章