Python

範例

spdOrderAPI 使用範例 (testPyOrderAPI.py)

spdOrderAPI 使用範例 (testPyOrderAPI.py)
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 ~~~')
    #----------------------------------------------------------------------------

spdQuoteAPI 使用範例 (testPyQuoteAPI.py)

spdQuoteAPI 使用範例 (testPyQuoteAPI.py)
#----------------------------------------------------------------------------
from megaSpeedy.spdQuoteAPI import spdQuoteAPI
import time
#----------------------------------------------------------------------------
# spdQuoteAPI implementation
#----------------------------------------------------------------------------
class testPyQuoteAPI(spdQuoteAPI):
    def OnConnected(self):
        # implement OnConnected() ...
        print('-------------- OnConnected() --------------')
    def OnDisconnected(self):
        #implement OnDisconnected() ...
        print('-------------- OnDisConnected() --------------')
        pass
    def OnLogonResponse(self, IsSucceed, ReplyString):
        #implement OnLogonResponse() ...
        print('-------------- OnLogonResponse() --------------')
        print('--- IsSucceed:{0} ReplyString:{1}'.format(IsSucceed, ReplyString))                
        global logonOK
        logonOK = IsSucceed        
        pass
    def OnContractDownloadComplete(self):        
        print('-------------- OnContractDownloadComplete() --------------')
        if "2330" in self.Stocks:
            Contract = self.Stocks['2330']
            self.SubscribeContract( Contract )
            Contract.Print()
        if "2454" in self.Stocks:
            Contract = self.Stocks['2454']
            self.SubscribeContract( Contract )
            Contract.Print()
        if "TXFC4" in self.Futures:
            Contract = self.Futures['TXFC4']
            self.Subscribe( Contract.Exchange , Contract.Symbol )
            Contract.Print()                     
        pass
    def OnOrderBook(self, Exchange, Symbol, MsgTime, Msg):
        #implement OnOrderBook() ...
        print('-------------- OnOrderBook() --------------')
        print('--- Exchange[{0}]  Symbol[{1}]  MsgTime[{2}]'.format(Exchange, Symbol, MsgTime))
        print('--- Bid1={0}({1})  Bid2={2}({3})  Bid3={4}({5})  Bid4={6}({7})  Bid5={8}({9})'.format(
            Msg.BidPrice1, Msg.BidQty1, Msg.BidPrice2, Msg.BidQty2, Msg.BidPrice3, Msg.BidQty3, Msg.BidPrice4, Msg.BidQty4, Msg.BidPrice5, Msg.BidQty5))
        print('--- Ask1={0}({1})  Ask2={2}({3})  Ask3={4}({5})  Ask4={6}({7})  Ask5={8}({9})'.format(
            Msg.AskPrice1, Msg.AskQty1, Msg.AskPrice2, Msg.AskQty2, Msg.AskPrice3, Msg.AskQty3, Msg.AskPrice4, Msg.AskQty4, Msg.AskPrice5, Msg.AskQty5))
        print('--- DerivedBid={0}({1})  DerivedAsk={2}({3})'.format(Msg.DerivedBidPrice, Msg.DerivedBidQty, Msg.DerivedAskPrice, Msg.DerivedAskQty))
        print(f'--- IsTestMatch={Msg.IsTestMatch}');
        pass
    def OnTrade(self, Exchange, Symbol, MatchTime, MatchPrice, MatchQty, IsTestMatch):
        #implement OnTrade() ...
        print('-------------- OnTrade() --------------')
        print('--- Exchange[{0}]  Symbol[{1}]'.format(Exchange, Symbol))
        print('--- MatchTime={0}  MatchPrice={1}  MatchQty={2}'.format(MatchTime, MatchPrice, MatchQty))
        print(f'--- IsTestMatch={IsTestMatch}');
        pass
#----------------------------------------------------------------------------
# main program
#----------------------------------------------------------------------------
if __name__ == '__main__':
    logonOK = False
    ObjQuote = testPyQuoteAPI()

    print('IsConnected:', str(ObjQuote.IsConnected()))    

    #testPyQuoteAPI.py說明:
    #訂閱檔數上限20檔
    #ObjQuote.Logon('IP', 34567, '身分證字號(大寫字母)', '電子登入密碼', True )
    #取消訂閱商品:ObjQuote.UnsubscribeAll()

    ObjQuote.Logon('IP', 34567, 'A123456789', '1234', True )
    print('IsConnected:', str(ObjQuote.IsConnected()))
    time.sleep(3)
    #global logonOK
    if logonOK == True:                 
        print('Sleep 6 hours...')
        time.sleep(21600)
    else:
        print('Logon failed.\n')
    print('Program close.')
#----------------------------------------------------------------------------