alexliou 發表於 17-8-30 23:57

alexliou 發表於 17-7-16 18:20
我錯了, 兩個版本的傳輸速度差異未達百倍, 只有50倍
根據我昨日(7/15)下午的測試:
2.13.5 (無T+1盤資料,...

剛Download 了新版API(2.13.7) 小測了一下
傳輸速度回來了   應該是比2.13.5版還快
關鍵在於 2.13.7版 的傳輸間隔是一毫秒

lawlu 發表於 17-8-31 18:53


Alex大大您好:

之前有向您請教關於台指期成交均價及內外盤量的計算,不知我在excel VBA寫的下列程式,是否正確


Private Sub skQ_OnNotifyHistoryTicks(ByVal sMarketNo As Integer, ByVal sStockIdx As Integer, ByVal nPtr As Long, ByVal nTimehms As Long, ByVal nTimemillismicros As Long, ByVal nBid As Long, ByVal nAsk As Long, ByVal nClose As Long, ByVal nQty As Long, ByVal nSimulate As Long)

   Dim c As Long

      c = 0
      d = 0
      e = 0


         a = nClose
         b = nQty
         c = c + (a * b / 100)
         d = d + b
         e = c / d


      Sheet1. = nTimehms
      Sheet1. = nBid / 100
      Sheet1. = nAsk / 100
      Sheet1. = nClose / 100
      Sheet1. = nQty

      Sheet1. = c
      Sheet1. = d
      Sheet1. = e



End Sub


chang91348 發表於 17-9-1 16:00

請教版主 2.13.7版要重新註册元件嗎?我下載回來執行,出了一堆錯誤碼

alexliou 發表於 17-9-2 22:52

本帖最後由 alexliou 於 17-9-2 22:57 編輯

lawlu 發表於 17-8-31 18:53
Alex大大您好:

之前有向您請教關於台指期成交均價及內外盤量的計算,不知我在excel VBA寫的下列程式, ...
邏輯是OK的
但要注意的是
1. 需排除試搓(Simulate)的價格
2. 考慮如何與即時價格合併計算(local 變數可能不足應付)
3. 價格分母這裡用固定數字(100), 雖然是正確的, 但不同商品可能有不同的價格分母, 如果考慮更彈性.更一般性的作法時
可事先用GetStockByNo()取得小數位數的資訊

alexliou 發表於 17-9-2 22:55

chang91348 發表於 17-9-1 16:00
請教版主 2.13.7版要重新註册元件嗎?我下載回來執行,出了一堆錯誤碼

需要. 但重新註冊後,就換原先根據舊版API所寫的程式出錯了, 需因應修改

lawlu 發表於 17-9-3 11:02

謝謝Alex大大回復:


1.該程式經測試,並無法累加計算出成交均價,想要計算該值最主要是認為成交均價在短線當沖上,可以當作進出場的依據,當成交價格跌破均價時,可以考慮進場放空,突破時可以進場作空,如下圖群益的台指分時走勢圖

2.另外我修改了一下程式,如excel副檔,但是還時無法計算出想要的成交均價,不知Alex大大可否幫忙看一下,提供修改意見

Private Sub skQ_OnNotifyHistoryTicks(ByVal sMarketNo As Integer, ByVal sStockIdx As Integer, ByVal nPtr As Long, ByVal nTimehms As Long, ByVal nTimemillismicros As Long, ByVal nBid As Long, ByVal nAsk As Long, ByVal nClose As Long, ByVal nQty As Long, ByVal nSimulate As Long)

    Dim rng As Range
    Dim yen1 As Long
    Dim yen2 As Long
    Dim yen3 As Long
   
    yen1 = 0
    yen2 = 0
         
    .ClearContents
      
   
   
    For Each rng In

   
    If nTimehms >= 84500 & nTimehms <= 134500 Then
   
      yen1 = yen1 + nClose * nQty / 100
      yen2 = yen2 + nQty
      yen3 = yen1 / yen2
      
      Sheet1. = nTimehms
      Sheet1. = nBid / 100
      Sheet1. = nAsk / 100
      Sheet1. = nClose / 100
      Sheet1. = nQty
      Sheet1. = yen1
      Sheet1. = yen2
      Sheet1. = yen3

         
    End If

    Next
      
End Sub

alexliou 發表於 17-9-3 15:21

lawlu 發表於 17-9-3 11:02
謝謝Alex大大回復:




Sorry,昨晚匆忙回覆,回答沒有很正確完整,原先程式的問題如下:

1. 變數名稱使用a,b,c...並非好的practice,使用能望文生義的名稱(如accumulatedPrice, accumulatedVolume,...)會大幅題高可讀性與可維護性。

2. 某些累積功能的變數不該是local variables,OnNotifyHistoryTicks()在每次接收到tick時都會執行,所以當每一根tickinformation傳進來時,這些變數都會被設為0,無法達到累計的目的。累積功能的變數應該設為global variable,在呼叫RequestTicks() 的 module中初始為0。

3. 可利用nSimulate參數判定是否為試搓tick。

lawlu 發表於 17-9-3 20:57

感謝Alex大回復:

1.經修改變數名稱及定義在全域變數位置,目前已可跑出累積功能了(如圖程式)

2.但是OnNotifyHistoryTicks()得到的ticks似乎有少,且計算出來的累積成交量及均價都不正確(如excel畫面)

alexliou 發表於 17-9-4 10:22

lawlu 發表於 17-9-3 20:57
感謝Alex大回復:

1.經修改變數名稱及定義在全域變數位置,目前已可跑出累積功能了(如圖程式)


看起來像是OnNotifyHistoryTicks()沒有收到所有的historical ticks,
據我所了解,OnNotifyHistoricalTicks()的behavior 會因為是不是首次呼叫 RequestTicks()及是否取消了前一次的 request 而有所不同(你可用nPtr觀察傳回的起始tick是第幾根tick),但每一版的API似乎也有差異。建議你可在呼叫RequestTicks前,先用頁碼50取消原先的request。我記得在2.13.5版,取消之後再request就會從第一根傳起了。

alexliou 發表於 17-9-4 10:35

lawlu 發表於 17-9-3 20:57
感謝Alex大回復:

1.經修改變數名稱及定義在全域變數位置,目前已可跑出累積功能了(如圖程式)


另外要注意 accumulatedPrice是否有可能超過long 所允許的最大值

lawlu 發表於 17-9-4 22:40

感謝Alex大回復:

1.經加入位址nPtr顯示資料後,發現從時間091753後,ticks數目就開始遺漏了(如圖一)

2. 經查,long長整數的最大允許值是4Bytes,-2,147,483,648 到 2,147,483,647,如果以20萬口單價10500來計算,達21億,所以尚未超過(如圖二)

3. 2.13.5版一個Page僅能索取一檔,我在程式中也僅索取"Tx00",一檔資料而已,所以真不知原因在哪

以上煩請Alex大大若有空,再幫忙釋疑一下,謝謝您

alexliou 發表於 17-9-5 06:28

lawlu 發表於 17-9-4 22:40
感謝Alex大回復:

1.經加入位址nPtr顯示資料後,發現從時間091753後,ticks數目就開始遺漏了(如圖一)


從你的附圖看起來,確有tick遺漏的現象,是否有什麼特殊的原因,或是 general case,還待進一步了解(但我人目前在日本東北玩耍,得等到週末回台後才有辦法作測試)。如果是general case,那就得靠把GetTick()包在迴圈裡來取得所有的ticks了(但我直覺上是認為有特殊原因)。

shunyulu 發表於 17-9-6 10:29

lawlu 發表於 17-9-4 22:40
感謝Alex大回復:

1.經加入位址nPtr顯示資料後,發現從時間091753後,ticks數目就開始遺漏了(如圖一)


曾做過測試, 在OnNotifyHistoryTick時將資料丟到陣列. 依樣是有遺漏tick. 而且漏很大.

所以如有回補資料需求還是用GetTick一筆一筆抓比較安全.

我的斷線重連回補作法是:
記錄下OnNotifyTick傳回的第一筆資料的nPtr. 然後用GetTick從0一直抓到nPtr-1.

lawlu 發表於 17-9-6 20:34

1.感謝Alex大於國外旅遊,仍百忙中抽空回復,另外也謝謝shunyulu的建議,因小弟是程式初學者,所以有些問題及建議仍在摸索學習中

2.另外剛剛看了新版的群益2.13.7使用說明,其中本次版本有修改一些TICK報價的問題,這個不知道是不是就是針對之前版本的問題而來的

alexliou 發表於 17-9-9 23:46

lawlu 發表於 17-9-6 20:34
1.感謝Alex大於國外旅遊,仍百忙中抽空回復,另外也謝謝shunyulu的建議,因小弟是程式初學者,所以有些問題 ...

1. 經反覆測試, 並未發現 API 2.13.5版之 OnNotifyHistoryTicks()於盤後傳輸時會發生tick遺漏的現象
無法重製出你所發生的狀況

2. 你如果想要在盤中即時計算成交均價,光靠OnNotifyHistoryTicks()是不夠的,
必須搭配OnNotifyTicks()併同計算才行.(但還是得先解決HistoryTicks不完整的問題)
頁: 1 2 3 4 5 6 [7] 8 9 10 11 12
查看完整版本: 群益API 2.13.5 C#實作