from megaSpeedy.spdOrderAPI import spdOrderAPI
import time, os
#----------------------------------------------------------------------------
# spdQuoteAPI implementation
#----------------------------------------------------------------------------
class testPyOrderAPI(spdOrderAPI):
def __init__(self):
super().__init__()
self.FIsLogon = False
def OnConnected(self):
#implement OnConnected() ...
print('-------------- OnConnected() --------------')
"""
登入證券
self.LogonProxy('身分證字號(大寫字母)', '電子登入密碼', '證券帳號七位數如:[0023456]')
登入期貨
self.LogonProxy('身分證字號(大寫字母)', '電子登入密碼', '期貨帳號七位數如:[0023456]')
登入證期市場逗號分隔
self.LogonProxy('身分證字號(大寫字母)', '電子登入密碼', '證券帳號七位數如:[0023456],期貨帳號七位數如:[0023456]')
登入複委託
self.LogonProxy('身分證字號(大寫字母)', '電子登入密碼', '複委託帳號六位數如:[023456]')
"""
if not self.LogonProxy('A123456789', '1234', '0023456'):
print(f'登入失敗! {self.GetLastErrorMsg()}')
os._exit(1)
def OnDisconnected(self):
#implement OnDisconnected() ...
print('-------------- OnDisconnected() --------------')
self.FIsLogon = False
def OnLogonResponse(self, IsSucceed, ReplyString):
#implement OnLogonResponse() ...
print('-------------- OnLogonResponse() --------------')
print('--- IsSucceed:{0} ReplyString:{1}'.format(IsSucceed, ReplyString))
if IsSucceed == True:
self.FIsLogon = True
#期貨設定下單帳號
#self.SetAccount( 'TAIFEX', 'F030000', '期貨帳號七位數')
self.SetAccount( 'TAIFEX', 'F030000', '0234567')
#證券設定下單帳號
#self.SetAccount( 'TWSE', '分公司別四位數', '證券帳號七位數')
self.SetAccount( 'TWSE', '7000', '0123456')
#複委託設定下單帳號
#self.SetAccount( 'US', '分公司別四位數', '帳號六位數')
self.SetAccount('US', '7000', '023456')
else:
print(f"登入失敗. {ReplyString}")
def OnReplyNewOrder(self, NID, UDD, Symbol, Price, Side, OrderQty, OrderType, TimeInForce, OrderID):
#implement OnReplyNewOrder() ...
print('-------------- OnReplyNewOrder() --------------')
print('--- NID:{0} UDD:{1} Symbol:{2} Price:{3} Side:{4}'.format(NID, UDD, Symbol, Price, Side))
print('--- OrderQty:{0} OrderType:{1} TimeInForce:{2} OrderID:{3}'.format(OrderQty, OrderType, TimeInForce, OrderID))
def OnReplyCancelOrder(self, NID, UDD, Symbol, Price, Side, OrderID):
#implement OnReplyCancelOrder() ...
print('-------------- OnReplyCancelOrder() --------------')
print('--- NID:{0} UDD:{1} Symbol:{2} Price:{3} Side:{4} OrderID:{5}'.format(NID, UDD, Symbol, Price, Side, OrderID))
def OnReplyReplaceOrder(self, NID, UDD, Symbol, Price, Side, OrderQty, OrderType, TimeInForce, OrderID):
#implement OnReplyReplaceOrder() ...
print('-------------- OnReplyNewOrder() --------------')
print('--- NID:{0} UDD:{1} Symbol:{2} Price:{3} Side:{4}'.format(NID, UDD, Symbol, Price, Side))
print('--- OrderQty:{0} OrderType:{1} TimeInForce:{2} OrderID:{3}'.format(OrderQty, OrderType, TimeInForce, OrderID))
def OnRejectOrder(self, NID, UDD, ActionFrom, ErrCode, ErrMsg):
#implement OnRejectOrder() ...
print('-------------- OnRejectOrder() --------------')
print('--- NID:{0} UDD:{1} Actionfrom:{2} ErrCode:{3} ErrMsg:{4}'.format(NID, UDD, ActionFrom, ErrCode, ErrMsg))
pass
def OnFill(self, NID, UDD, OrderID, ReportSequence, FillPrice, FillQty, FillTime):
#implement OnFill() ...
print('-------------- OnFill() --------------')
print('--- NID:{0} UDD:{1} OrderID:{2} ReportSequence:{3}'.format(NID, UDD, OrderID, ReportSequence))
print('--- FillPrice:{0} FillQty:{1} FillTime:{2}'.format(FillPrice, FillQty, FillTime))
pass
#----------------------------------------------------------------------------
# main program
#----------------------------------------------------------------------------
if __name__ == '__main__':
ObjOrder = testPyOrderAPI()
#ObjOrder.EnableMEGACA("憑證檔路徑","身分證字號(大寫字母)","憑證密碼")
result = ObjOrder.EnableMEGACA("A123456789.pfx","A123456789","A123456789")
if result :
print("已成功設定簽章憑證")
else:
print(f"簽章憑證設定失敗! {ObjOrder.GetLastErrorMsg()}")
os._exit(1)
Count = 0
while True:
time.sleep(1)
if Count % 10 == 0:
if ObjOrder.IsConnected() == False:
#ObjOrder.Connect('主機位置', 56789, 設定連線逾時[秒,如設定5為5秒])
ObjOrder.Connect('spapitest.emega.com.tw', 56789, 5)
Count += 1
if ObjOrder.FIsLogon == True:
break
#End while True
while True:
time.sleep(1)
"""
下單、刪單、改單失敗function皆回傳0,成功會回傳nid序號(數字),可對應"新單"委託回報nid序號(數字)
UDD(自訂義字串): 'testUDD_New'、'testUDD_Cancel'、'testUDD_Replace' 會在回報的時候回傳,可設定15位英數字
委託參數說明
[TadingSession] [N:Normal(證券整股、期貨) O:OddLot(證券盤後零股) I:IntradayOdd(證券盤中零股) A:After-Hour Fixed-Price(證券定盤)]
[PositionEffect] [A:Auto(證券下單、期貨自動) D:DayTrade(期貨當沖)]
[TWSEOrdTyp] ["":期貨下單 0:證券一般 3:證券融資 4:證券融劵 A:證券當沖]
"""
NewOrCancel = int(input('[Select function]\n 1:NewOrderEx\n 2:CancelOrderEx\n 3:ReplaceOrderEx\n 4:NewForeignOrder\n 5:CancelForeignOrder\n 6:QueryForeignStockOrder\n 7:fuacc\n 8:stacc\n 9:pw\n 10:foreignacc\n 11:foreigndata\n 12:Quit ->'))
if NewOrCancel == 1:
Market = input('[Market] (fut:futures opt:options tse:stock otc:otc_stock) ->')
Symbol = input('[Symbol] ->')
Price = float(input('[Price] ->'))
Qty = int(input('[Quantity] ->'))
Side = input('[Side] (B:Buy S:Sell) ->')
OrderType = input('[OrderType] (L:Limit M:Market) ->')
Tif = input('[TimeInForce] (R:ROD I:IOC F:FOK) ->')
TS = input('[TadingSession] (N:Normal O:OddLot I:IntradayOdd A:After-Hour Fixed-Price) ->')
PE = input('[PositionEffect] (A:Auto D:DayTrade) ->')
TO = input('[TWSEOrdTyp] (0:現股 3:融資 4:融券 A:現沖) ->')
nid = ObjOrder.SendNewOrderEx(Market, 'testUDD_New', Symbol, Price, Side, Qty, OrderType, Tif, TS, PE, TO )
if nid == 0:
print(f'新單委託失敗! {ObjOrder.GetLastErrorMsg()}')
elif NewOrCancel == 2:
Market = input('[Market] (fut:futures opt:options tse:stock otc:otc_stock) ->')
Symbol = input('[Symbol] ->')
Price = float(input('[Price] ->'))
Side = input('[Side] (B:Buy S:Sell) ->')
OrderID = input('[OrderID] ->')
TS = input('[TadingSession] (N:Normal O:OddLot I:IntradayOdd A:After-Hour Fixed-Price) ->')
TO = input('[TWSEOrdTyp] (0:現股 3:融資 4:融券 A:現沖) ->')
nid = ObjOrder.SendCancelOrderEx(Market, 'testUDD_Cancel', Symbol, Price, Side, OrderID, TS, TO)
if nid == 0:
print(f'刪單委託失敗! {ObjOrder.GetLastErrorMsg()}')
elif NewOrCancel == 3:
Market = input('[Market] (fut:futures opt:options tse:stock otc:otc_stock) ->')
Symbol = input('[Symbol] ->')
Price = float(input('[Price] ->'))
Qty = int(input('[Quantity] ->'))
Side = input('[Side] (B:Buy S:Sell) ->')
OrderID = input('[OrderID] ->')
OrderType = input('[OrderType] (L:Limit M:Market) ->')
Tif = input('[TimeInForce] (R:ROD I:IOC F:FOK) ->')
TS = input('[TadingSession] (N:Normal O:OddLot I:IntradayOdd A:After-Hour Fixed-Price) ->')
TO = input('[TWSEOrdTyp] (0:現股 3:融資 4:融券 A:現沖) ->')
nid = ObjOrder.SendReplaceOrderEx(Market, 'testUDD_Replace', Symbol, OrderID, Side, Price, Qty, OrderType, Tif, TS, TO )
if nid == 0:
print(f'改單委託失敗! {ObjOrder.GetLastErrorMsg()}')
elif NewOrCancel == 4:
Market = input('[Exchange] (US:美股 USS:美股每股) ->')
Symbol = input('[Symbol] ->')
Price = float(input('[Price] ->'))
StopPrice = float(input('[StopPrice] ->'))
Qty = int(input('[Quantity] ->'))
Side = input('[Side] (B:Buy S:Sell) ->')
OrderType = input('[OrderType] (L:Limit M:Market SL:StopLimit) ->')
Tif = input('[TimeInForce] (R:ROD I:IOC F:FOK C:GTC D:GTD) ->')
CS = input('[Currency] (1:TWD 2:NON-TWD) ->')
EI = input('[ExecInst] (G:AON) ->')
nid = ObjOrder.SendNewForeignOrder(Market, 'UDD_ForeignNew', Symbol, Price, StopPrice, Side, Qty, OrderType, Tif, CS, EI)
if nid == 0:
print(f'海外複委託新單失敗! {ObjOrder.GetLastErrorMsg()}')
elif NewOrCancel == 5:
Market = input('[Exchange] (fut:futures opt:options tse:stock otc:otc_stock) ->')
Symbol = input('[Symbol] ->')
Side = input('[Side] (B:Buy S:Sell) ->')
OrderID = input('[OrderID] ->')
nid = ObjOrder.SendCancelForeignOrder(Market, 'CancelForeign', Symbol, Side, OrderID)
if nid == 0:
print(f'海外複委託刪單失敗! {ObjOrder.GetLastErrorMsg()}')
elif NewOrCancel == 6:
branch_id = input('[branch_id] ->')
cust_id = input('[cust_id] ->')
qry_kind = input("[qry_kind] ('0':all '2':new '3':filled '4':partial filled) ->")
query_param = {
'branch_id': branch_id,
'cust_id' : cust_id,
'qry_kind' : qry_kind
}
result = ObjOrder.queryForeignStockOrder(query_param)
print(result)
elif NewOrCancel == 7:
#期貨branch_id皆為098,其他參數依照範例設定即可
query_param = {'branch_id':'098','cust_id':'0234567','type':'0','apcode':''};
print(f"queryMargin= {ObjOrder.queryMargin(query_param)}")
print(f"queryFutUncoverRT= {ObjOrder.queryFutUncoverRT(query_param)}")
print(f"queryFutMatch= {ObjOrder.queryFutMatch(query_param)}")
print(f"queryFutOrder= {ObjOrder.queryFutOrder(query_param)}")
elif NewOrCancel == 8:
query_param = {'branch_id':'7000','cust_id':'0123456','apcode':'0','market':'0','qry_type':'0','nocsint':'N'};
print(f"queryStkMatch= {ObjOrder.queryStkMatch(query_param)}")
print(f"queryStkOrder= {ObjOrder.queryStkOrder(query_param)}")
print(f"makeStockAccountInquriy= {ObjOrder.makeStockAccountInquriy(query_param)}")
elif NewOrCancel == 9:
query_param3 = {'branch_id':'','func':'','cust_id':'A123456789','oldpwd':'1234','newpwd':'12341234'}
#沿用舊密碼
query_param3 = {'branch_id':'','func':'renew','cust_id':'A123456789','oldpwd':'','newpwd':''}
print(f"changePassword= {ObjOrder.changePassword(query_param3)}")
elif NewOrCancel == 10:
query_param = {'branch_id':'7000','cust_id':'023456','qry_kind':'0'};
print(f"queryForeignStockInventory= {ObjOrder.queryForeignStockInventory(query_param)}")
print(f"queryForeignStockOrder= {ObjOrder.queryForeignStockOrder(query_param)}")
print(f"queryForeignStockFilled= {ObjOrder.queryForeignStockFilled(query_param)}")
elif NewOrCancel == 11:
query_param = {'branch_id':'7000','cust_id':'023456','apcode':'','keyword':'NVDA'};
print(f"downloadForeignStockProductData= {ObjOrder.downloadForeignStockProductData(query_param,'comm')}")
print(f"downloadForeignStockCurrencyData= {ObjOrder.downloadForeignStockCurrencyData(query_param)}")
print(f"downloadForeignStockMarketData= {ObjOrder.downloadForeignStockMarketData(query_param)}")
elif NewOrCancel == 12:
break
else:
print('[NewOrCancel] input error!')
#End while True
ObjOrder.Disconnect()
print('~~~ Program terminate ~~~')
#----------------------------------------------------------------------------