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