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:kchartdata\n  13: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:
            symbol = '2330'         
            #開高低收成交量/月K線資料
            print(f"GetMKChartData= {ObjOrder.GetMKChartData(symbol)}")
            #開高低收成交量/周K線資料
            print(f"GetWKChartData= {ObjOrder.GetWKChartData(symbol)}")
            #日K/技術指標/價量資料-個股多期
            print(f"GetDKChartData= {ObjOrder.GetDKChartData(symbol)}")
            #還原月K(個股、ETF、大盤)-單股單期
            print(f"GetAdjustedMKChartData= {ObjOrder.GetAdjustedMKChartData(symbol)}")
            #還原周K(個股、ETF、大盤)-單股單期
            print(f"GetAdjustedWChartData= {ObjOrder.GetAdjustedWKChartData(symbol)}")
            #還原日K(個股、ETF、大盤)-單股單期
            print(f"GetAdjustedDKChartData= {ObjOrder.GetAdjustedDKChartData(symbol)}")            
        elif NewOrCancel == 13: 
            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.')
  #----------------------------------------------------------------------------