C# 使用股票行情数据构建基于时间的条形图

C# 使用股票行情数据构建基于时间的条形图,c#,algorithmic-trading,C#,Algorithmic Trading,我正在尝试使用tick数据在运行时构建股市条(快照)数据。我的股票数据提供程序提供对滴答级别数据的访问,其中我有一个名为OnTick的事件,该事件在数据提供程序发送新滴答时触发。我希望做以下两项中的一项,或者如果有人能提出一个好的选择: 选项1: 在这个选项中,我维护一个条形图对象,并在每次得到记号时更新它。OnBar()事件可以附加到计时器已用事件(1分钟为1分钟的条形图等) //tickmg=双倍价格,日期时间dttm 公共无效控件(TickMsg newTick) { TaskFactor

我正在尝试使用tick数据在运行时构建股市条(快照)数据。我的股票数据提供程序提供对滴答级别数据的访问,其中我有一个名为OnTick的事件,该事件在数据提供程序发送新滴答时触发。我希望做以下两项中的一项,或者如果有人能提出一个好的选择:

选项1:

在这个选项中,我维护一个条形图对象,并在每次得到记号时更新它。OnBar()事件可以附加到计时器已用事件(1分钟为1分钟的条形图等)

//tickmg=双倍价格,日期时间dttm
公共无效控件(TickMsg newTick)
{
TaskFactory.StartNew(){UpdateBar(newTick)};//语法不特定
}
UpdateBar()
{
//nextBar是一个初始设置为打开=0、高=0、低=0、关闭=0的条形图对象
if(nextBar.Open==0)
nextBar.Open=newTick.price;
如果(新点击价格>下一个高)
nextBar.High=newTick.price;

如果(newTick.price是一个很好的例子。他们的教程涵盖了这一点。而且,由于它是开源的,您可以窥探它是如何完成的。

在它完成之前,您不需要显示或访问该栏吗?以防选项2似乎无法实现这一点。我无法想象选项1将是一个性能阻塞。而且它将使用更少的资源内存,因为您似乎没有将勾号数据保存到任何变量。

我认为最好的方法是第二种。
当您在第一种方法中重置条形图时,最低价格永远不会小于零,因此,条形图上的最低价格将始终为零。

谢谢,我将查看trade link之后的方法,但是我必须补充一点,我的问题的关键是讨论不同选项的权衡和好处。trade link之后的方法可能会对于我的系统来说,这不是最好的方法。即使选项1没有达到您建议的效果,它也会在时间完成后发布。然而,您是对的,我们最终使用了1,即使代码不像这里看起来的那么简单。同意-代码中有一个逻辑错误,下面的一行应该设置为low while rese的最大值tting.bar=新的bar(0,0,0,0);但是问题更多的是从性能角度提出的,我们选择了选项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
}
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(); 
}