2022年5月9日 星期一

群益 skcom api 海期報價、下單及回報範例

群益海期報價跟下單跟api手冊上寫的有點出入,手冊也沒有明確表示下單的流程,經過一番試誤,可以報價也可以下單了。實在是太少碰海期相關的 api,每次想用的時候都重新經歷一次錯誤,因此寫下來留個紀錄好參考。真的很少用,可能有不少地雷,因此僅供參考,也歡迎大家分享曾經遇過的問題。

幾個容易有錯誤的地方

1. 海期商品與交易所的報價代號跟下單代號有些是不同的,請用 GetOverseaProductDetail 來查詢正確代號。

2. 報價代碼寫法是  "交易所代碼1,商品代碼1#交易所代碼2,商品代碼2", 不同商品間以#字號隔開

3. 海期商品連線報價主機後,只會回應 3001,之後即可查詢報價

3. 海期委託單物件填寫商品代碼跟 GetOverseaProductDetail 查詢的稍有出入,需要加工處理。例如微型小道瓊下單代碼為 MYM_202206,填入委託單物件時事拆成兩個參數,要分別填入商品代碼及年月, 如 bstrStockNo = "MYM" 及 bstrYearMonth = "202206"

4. 要能下單要有幾項前置作業, SKOrderLib_Initialize >> ReadCertByID >> GetUserAccount >> SKOrderLib_LoadOSCommodity

5. "期貨API下單同意書"要記得簽,才能進行海期報價,我都用手機掌中財神 app,下方有個同意書專區,把裡面能簽的都簽了。

6. 有網友詢問如何使用 GetOverSeaFutureOpenInterestGW,手冊寫經由 OnOverSeaFutureOpenInterestGW 回報,測試後發現並沒有反應。深查後發現手冊坑人,原來是經由 OnOFOpenInterestGWReport 來做回報,也一併加入本範例供參考。

Notebook 範例版 jupyter notebook 

py 範例版,僅在 spyder IDE 下測試過

25 則留言:

  1. Eason大大,您好,請問那裡有群益的海期的範例呢?及說明文件?謝謝

    回覆刪除
  2. 簡單版的就我上面寫的,我這裡沒有用GUI介面,應該很簡潔了,已經包括報價、下單、回報等功能了。嘗試理解一下怎麼用 comtype 去包 skcomapi,怎麼做 event handler,跟怎麼 pump event,剩下的就去翻 api 手冊。官方版的好像沒有海期的 python 範例,但你可以參考官方的其他範例程式,有附上該呼叫的程式碼,雖然用的程式語言不同,但你還是可參考它呼叫的流程跟副程式有哪些,我自己是交叉比對,慢慢摸索的。有那裡卡住了,也可以留言給我,一起討論囉。

    回覆刪除
  3. Eason大大,您好
    目前有遇到一個想請教您,就是我可以抓出海期的商品, 但要登陸抓取海期商品報價 用 skOSQ.SKOSQuoteLib_RequestStocks(0,"CBT,MYM_202212") 或
    skOSQ.SKOSQuoteLib_RequestStocks(1,"CBOT,MYM2212")
    都沒有print出商品的即時報價,請問可能是那邊出問題了?謝謝

    回覆刪除
  4. 我用 skOSQ.SKOSQuoteLib_RequestStocks(1,"CBOT,MYM2212") 可以拿到報價。是參照我上面的code嗎? 如果一個字都沒有改的話,我猜可能是173行那邊,我原本是要留給大家手動操作的,會斷線報價伺服器,以便不時之需,我現在把他給關了,你可以再試試看。

    回覆刪除
  5. Eason大大,您好
    我的問題已經解決,可以正常報價了,謝謝
    但和173行那邊沒關係,謝謝幫忙

    回覆刪除
  6. Eason大大, 您好
    請問一下,群益海期報價好像沒看到ts的欄位,請問這樣是否就無法將即時報價tick轉分k?
    謝謝

    回覆刪除
    回覆
    1. 還是可以喔,OnNotifyTicksNineDigitLONG 的 nIndex, nPtr, 帶入SKOSQuoteLib_GetTickNineDigitLONG(nIndex, nPtr, pSKTick),再從 pSKTick 取出報價來組分K。這樣有看懂嗎??

      刪除
    2. Eason大大, 您好
      不好意思,有點不太理解,OnNotifyTicksNineDigitLONG 不是像OnNotifyQuoteLONG觸發事件會回報資料?
      我看手冊void OnNotifyTicksNineDigitLONG ([in] LONG nIndex, [in] LONG nPtr, [in] LONG nDate, [in] LONG nTime, [in] LONGLONG nClose, [in] LONG nQty);要帶6個參數
      是否請Eason大大範例說明,謝謝

      刪除
    3. 可以參考一下我台股tick報價那篇,用法類似。群益後來弄了 LONG系列,又多了 nineDigitLONG 我有點搞混了,要花點時間整理

      刪除
    4. 謝謝Eason大大, 我再試試看

      刪除
    5. 弄了個範例,你參考看看 https://easontseng.blogspot.com/2022/11/tick.html?m=1

      刪除
    6. 非常感謝Eason大大幫忙,幫助良多

      刪除
  7. Eason大大,您好
    請問 在訂閱ticks報價時會出現
    Requesting ticks, CBOT,YM2212
    SK_SUBJECT_TICK_STOCK_NOT_FOUND
    請問你也會嗎?謝謝

    回覆刪除
  8. Eason大大,
    不好意思,請忽略上個問題,要請問
    EventOSQ.ticks 在原本的class好像沒有ticks函數,要請問Eason大大這部份怎麼實作,謝謝

    回覆刪除
    回覆
    1. 上面那個連結海期ticks報價範例裡面有,你再看一下

      刪除
  9. Eason大大,您好
    謝謝解惑,已經可以了,感謝

    回覆刪除
  10. Eason大大,您好
    有一事請教一下就是我如果要同時多個海期商品報價的話
    用thread 加上 pythoncom.PumpWaitingMessages(),就接收不到資訊源的報價,想請問是不能這樣使用嗎?謝謝

    回覆刪除
    回覆
    1. 是的, 不能放在 thread 裡面, 要在 main thread 裡

      刪除
  11. Eason大大,您好
    請問如果要同時訂閱多個海期商品報價的話,
    請問有什麼可以建議的嗎?
    謝謝

    回覆刪除
    回覆
    1. 用 井號 將報價代碼分開,我的測試可以報到100檔, 像這樣 skOSQ.SKOSQuoteLib_RequestStocks(1, "CBOT,YM0000#CBOT,YM2303#CBOT,YM2306#CBOT,YM2309#CBOT,YM2303/2306#CBOT,MYM0000#CBOT,MYM2303#CBOT,MYM2306#CBOT,MYM2309#CBOT"), 這樣還不夠嗎?

      刪除
    2. Hi Eason大,
      您好, 我試用
      nCode = skOSQ.SKOSQuoteLib_RequestTicks(1, "CBOT,YM2303#CBOT,YM2306")
      會顯示”SK_SUBJECT_TICK_STOCK_NOT_FOUND”
      我之前試是1個page只能配一個商品,大概是我那邊用錯了
      我再試試,謝謝

      刪除
    3. 報價有兩種,RequestStock跟RequestTicks, 看你需求來使用。RequestTicks 一次只能填一頁一檔,所以你要一檔一檔的去請求。群益有限制請求 Tick 檔數,當你看到有 3027 出現時,表示你目前最大的可以請求檔數,試試下面, strCode 是 list 放一檔一檔的報價商品名,page 放 0 好像系統會自動幫你配,當超過上限時就會出現 3027 錯誤
      strCode = ['CBOT,YM0000', 'CBOT,YM2303', 'CBOT,YM2306', 'CBOT,YM2309', 'CBOT,YM2303/2306', 'CBOT,MYM0000']

      for page, code in enumerate(strCode):
      print(skOSQ.SKOSQuoteLib_RequestTicks(page+1, code))

      刪除
    4. 謝謝Eason大大回覆, 我想請教的是
      如果要幾乎同時計算多商品的分K
      是要用convert_to_kline(query_stock="MYM2303", freq="1T")
      帶入不同的query_stock="MYM2303",在同一個while loop內執行可行?
      謝謝

      刪除
    5. 轉換多商品 tick to kline放在最後,參考一下,不知道符不符合你的需求

      刪除
    6. 謝謝Eason大大,我再試試,謝謝

      刪除