確認有安裝 ipykernel 後,terminal 下移動到新建的虛擬環境資料夾下,例如 my_env_name 執行下列指令:
python -m ipykernel install --user --name=<my_env_name>
確認有安裝 ipykernel 後,terminal 下移動到新建的虛擬環境資料夾下,例如 my_env_name 執行下列指令:
python -m ipykernel install --user --name=<my_env_name>
import pythoncom, time, os from comtypes.client import GetModule, GetEvents, CreateObject from datetime import datetime #第一次使用需要將 SKCOM 包成python 的package #SKCOM.dll 在linux 下,我是放在 ~./home/yi/.wine/driv_c/skcom/x86/SKCOM.dll #但在 wine 下,是放在下列路徑, drive_c 就是windows的C槽 GetModule(r'C:\\skcom\x86\SKCOM.dll') #GetModule會在comtypes.gen 下產生 SKCOMLib package, 之後就用下面方式引用 import comtypes.gen.SKCOMLib as sk #建立COM物件 if 'skC' not in globals(): skC=CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib) if 'skQ' not in globals(): skQ=CreateObject(sk.SKQuoteLib, interface=sk.ISKQuoteLib) if 'skR' not in globals(): skR=CreateObject(sk.SKReplyLib, interface=sk.ISKReplyLib) #輸入身分證與密碼 ID='' PW='' #股票代號 strStock="TX00" print(str(datetime.now())[0:-4], 'ID & PW entered') #建立事件類別 class skQ_events: def OnConnection(self, nKind, nCode): print(datetime.now(), 'OnConnection', nKind, nCode) if nKind == 3003: #nKind==3003 表連線報價主機就緒 print("quoate server connected..., nkind= ", nKind) ncode=skQ.SKQuoteLib_RequestStocks(1, strStock) if ncode==0: print(strStock, 'requested') def OnNotifyQuote(self, sMarket, sIndex): ts=sk.SKSTOCK() skQ.SKQuoteLib_GetStockByIndex(sMarket, sIndex, ts) print(ts.bstrStockName, ts.bstrStockNo, ts.nClose/10**ts.sDecimal) class skR_events: def OnReplyMessage(self, bstrUserID, bstrMessage, sConfirmCode=0xFFFF): print('OnReplyMessage', bstrMessage) return sConfirmCode #Event sink, 事件實體 EventQ=skQ_events() EventR=skR_events() #make connection to event sink ConnectionQ = GetEvents(skQ, EventQ)
ConnectionR = GetEvents(skR, EventR) if __name__=='__main__': #登入 nCode=skC.SKCenterLib_Login(ID, PW) print("Login,", skC.SKCenterLib_GetReturnCodeMessage(nCode)) #連線報價主機 print(f"{datetime.now()}, EnterMonitor,", skC.SKCenterLib_GetReturnCodeMessage(skQ.SKQuoteLib_EnterMonitor())) # Event loop, 持續檢查有沒有event產生 pythoncom.PumpMessages()
OSError: exception: access violation writing 0x000000000000009C
經多方詢問後, 應該是api bug, 下個版本應該就會修正. 目前非官方的解法,創建 skcom 元件的時候,將海期及海選元件同時建立即可。目前測試可以 正常SKOSQuoate_Entermonitor(), 其他的還沒試過,給大家試試看吧。也不知道其他語言會有這個問題嗎?
skOSQ = CreateObject(sk.SKOSQuoteLib, interface=sk.ISKOSQuoteLib)
# 只要多下面這列就可以正常使用了
skOOQ = CreateObject(sk.SKOOQuoteLib, interface=sk.ISKOOQuoteLib)
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)