我自己不放心所以去申請了模擬平台帳號,在來試試看下單的功能,不過模擬帳號目前沒有提供夜盤的功能,就加減用吧!! 之前介紹模擬平台的文章,大家參考一下囉
模擬平台有練功跟競賽兩種帳號,我沒有研究,隨便拿一個來用
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)
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]]
想知道你那邊下單測試的結果跟我一樣嗎?!
我好像知道他同步跟不同步設計的模式了
刪除同步是用SKCenterLib_GetLastLogInfo()回傳結果
不同步是用OnAsyncOrder回傳
沒事了~~3Q
讚喔! 我沒試過不同步,有問題再請教你
刪除好的好的~~我有加入FB的群組。也是看Eason大的文章學習的
刪除<(_ _)>受益良多
感謝感謝
大大你好,最近在寫交易程序,但是我不管怎麼寫,OnNewData就是沒反應,我也使用了pythoncom.PumpWaitingMessages()一樣沒有回報任何東西,但是我有確定有委託成功,還是OnNewData委託程成功是不回報的??
回覆刪除因為現在沒有模擬帳號可以測試盤中測試非常困難,不知道E大這邊有沒有遇到一樣的問題可以為我解惑一下,感謝
我測試了一下,沒什麼問題耶,不知道你的問題在哪裡。你有連接 SKReply server 嗎? 或是你要的其實不是用 OnNewData 回報? 我弄了個範例你參考一下 參考連結
刪除