Я пытаюсь построить данные гистограммы фондового рынка во время выполнения, используя тиковые данные. Мой провайдер данных акций предоставляет доступ к данным уровня тиков, где у меня есть событие 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();
}
Вопросы:
- Какой подход требует более интенсивной обработки?
- Какой подход требует больше памяти?
Опять же, если у кого-то есть предложение об альтернативном подходе, я весь в ушах.