網頁

2019年7月27日 星期六

群益API python 下單範例

今天來示範下單, 請務必搞懂每個參數後在下單喔
我自己不放心所以去申請了模擬平台帳號,在來試試看下單的功能,不過模擬帳號目前沒有提供夜盤的功能,就加減用吧!! 之前介紹模擬平台的文章,大家參考一下囉
模擬平台有練功跟競賽兩種帳號,我沒有研究,隨便拿一個來用



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
from comtypes.client import GetModule, CreateObject, GetEvents
GetModule('C:\\skcom\\CapitalApi_2.13.17\\x64\\SKCOM.dll')
import comtypes.gen.SKCOMLib as sk
from datetime import datetime
import getpass

#建立物件,避免重複 createObject
#登錄物件
if 'skC' not in globals(): skC=CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
#下單物件
if 'skO' not in globals(): skO=CreateObject(sk.SKOrderLib , interface=sk.ISKOrderLib)   
#回報物件
if 'skR' not in globals(): skR=CreateObject(sk.SKReplyLib , interface=sk.ISKReplyLib)   

#輸入身分證與密碼

ID=''
PW=''
print(datetime.now(), 'ID & PW')

#建立事件類別             
class skO_events:
    def __init__(self):
        self.TFAcc=[]
        
    def OnAccount(self, bstrLogInID, bstrAccountData):
        strI=bstrAccountData.split(',')
        #找出期貨帳號
        if len(strI) > 3 :
            if strI[0] == 'TF' :
                self.TFAcc = strI[1]+strI[3]
            
class skR_events:        
    def OnReplyMessage(self, bstrUserID, bstrMessage, sConfirmCode=0xFFFF):
        '''API 2.13.17 一定要返回 sConfirmCode=0xFFFF'''
        print('skR_OnReplyMessage', bstrMessage)
        return sConfirmCode
    
    def OnData(self, bstrUserID, bstrData):
         #成交回報
        self.bstrOnData.append(datetime.now().strftime('%H:%M:%S,') + bstrData)
        strI = bstrData.split(",")
        print("skR_OnData", strI)
                        
    def OnNewData(self, bstrUserID , bstrData):
        print('skR_OnNewData', bstrData)

#Event sink, 事件實體
EventO=skO_events()
EventR=skR_events()

#make connection to event sink
ConnO = GetEvents(skO, EventO) 
ConnR = GetEvents(skR, EventR) 

print(datetime.now(), 'Making event objects')

%matplotlib auto
#登入模擬帳號
nCode=skC.SKCenterLib_ResetServer ("morder1.capital.com.tw")
print('set server to morder1.capital.com.tw', skC.SKCenterLib_GetReturnCodeMessage(nCode))

#login
nCode=skC.SKCenterLib_Login(ID,PW)
print('Login', skC.SKCenterLib_GetReturnCodeMessage(nCode))

#初始 Order 物件
nCode=skO.SKOrderLib_Initialize()
print("Initialize ", skC.SKCenterLib_GetReturnCodeMessage(nCode))

#初始 Cert by ID 物件,模擬平台不需要這個,會出現錯誤
nCode=skO.ReadCertByID(ID)
print("ReadCertByID ", skC.SKCenterLib_GetReturnCodeMessage(nCode))

#Get User TF Account
nCode=skO.GetUserAccount()
print("GetUserAccount ", skC.SKCenterLib_GetReturnCodeMessage(nCode), EventO.TFAcc)

#設定期貨單參數,請自行調整囉,注意參數的資料型別,例如 bstr開頭的是要輸入文字型態
#以下請再jupyter 裡用另外一個cell 跑
fo=sk.FUTUREORDER()
fo.bstrFullAccount=EventO.TFAcc      #TF 帳號
fo.bstrStockNo='MTX00'
fo.sBuySell=0                         #0 buy, 1 sell
fo.bstrPrice='10700'               #委託價格,「M」表示市價,{移動停損、MIT皆無須價格}
fo.nQty=1                              #交易口數
fo.sDayTrade=0                     #當沖0:否 1:是,可當沖商品請參考交易所規定。 
fo.sNewClose=2                     #新平倉,0:新倉 1:平倉 2:自動{新期貨、選擇權使用}
fo.sTradeType=1                    #0:ROD  1:IOC  2:FOK
fo.sReserved=0                     #盤別,0:盤中(T盤及T+1盤);1:T盤預約{新期貨、停損單使用}

#下單
nCode=skO.SendFutureOrder(ID, False, fo)
print(nCode)

6 則留言:

  1. Hi Eason大大
    不同部委託你有成功使用出來嗎?!
    我這邊使用的結果怪怪的
    結果如下
    如果用False,
    nCode得到如下
    Future Order Failed, 5, Number:0001 預約單委託完成,請查詢委託狀況。[0808033000139]
    OnAsyncOrder得到如下
    []

    如果用True,
    nCode得到如下
    Future Order Success, 0, Number:4052
    OnAsyncOrder得到如下
    [4052,5,0001 預約單委託完成,請查詢委託狀況。[0808033000140]]

    想知道你那邊下單測試的結果跟我一樣嗎?!

    回覆刪除
    回覆
    1. 我好像知道他同步跟不同步設計的模式了
      同步是用SKCenterLib_GetLastLogInfo()回傳結果
      不同步是用OnAsyncOrder回傳

      沒事了~~3Q

      刪除
    2. 讚喔! 我沒試過不同步,有問題再請教你

      刪除
    3. 好的好的~~我有加入FB的群組。也是看Eason大的文章學習的
      <(_ _)>受益良多

      感謝感謝

      刪除
  2. 大大你好,最近在寫交易程序,但是我不管怎麼寫,OnNewData就是沒反應,我也使用了pythoncom.PumpWaitingMessages()一樣沒有回報任何東西,但是我有確定有委託成功,還是OnNewData委託程成功是不回報的??
    因為現在沒有模擬帳號可以測試盤中測試非常困難,不知道E大這邊有沒有遇到一樣的問題可以為我解惑一下,感謝

    回覆刪除
    回覆
    1. 我測試了一下,沒什麼問題耶,不知道你的問題在哪裡。你有連接 SKReply server 嗎? 或是你要的其實不是用 OnNewData 回報? 我弄了個範例你參考一下 參考連結

      刪除