2016年8月8日 星期一

元大期貨 API in Python


之前曾努力了快一周, 才搞定讓 Python 可以 呼叫 元大期貨 API  ,   實在沒當初想的簡單,  在此紀錄下要點, 也免得其他人碰到像我一樣的問題時, 浪費時間去研究如何設定 :




  • 原本的 C++ 範例,  若想使用 Visual Studio 2013 去 Compile , 需到 微軟官方網站 下載  Multibyte MFC Library  ,  否則會編譯錯誤

  • 元大期貨 API 是使用 ActiveX 包裝而非單純的 DLL ,  所以用 Python 呼叫變得比較麻煩, 主要的步驟是 : 
    • 參考這篇 stack overflow 的文章,  安裝 pywin32 , 並呼叫 makepy 
    • 之後在 C:\Python27\Lib\site-packages\win32com\gen_py 目錄下, 會找到新產生的 .py 檔, 請打開它 
    • 在程式碼下方會有類似的敘述, 主要看 註解行
      # This CoClass is known by the name 'Yuanta.YuantaOrdCtrl.1'

from win32com.client import CoClassBaseClass
# This CoClass is known by the name 'Yuanta.YuantaOrdCtrl.1'
class YuantaOrd(CoClassBaseClass): # A CoClass

    • 由上得知我們在 python 程式中使用 win32com.client.Dispatch 時, 方式是   win32com.client.Dispatch('Yuanta.YuantaOrdCtrl.1')
    • 元大 API 主要使用 ActiveX Event 的方式來回應各種 Function 呼叫 , 所以還得要用 Event Class 來設定各個 Event 該做甚麼 , 範例大概如下 :      

class MyEvent : 
    def __init__(self) : 
        self.event = win32event.CreateEvent(None, 0, 0, None)

    def OnLogonS(self, TLinkStatus=defaultNamedNotOptArg, AccList=defaultNamedNotOptArg, Casq=defaultNamedNotOptArg, Cast=defaultNamedNotOptArg):
        win32event.SetEvent(self.event)

    def OnUserDefinsFuncResult(self, RowCount=defaultNamedNotOptArg, Results=defaultNamedNotOptArg, WorkID=defaultNamedNotOptArg):
        win32event.SetEvent(self.event)



    • 有了這個 MyEvent Class,  可以用 WithEvent()  或是  DispatchWithEvent() 來連結  ActiveX Object 與 Event ,   我是使用後者,  範例如下 : 
    • 
      win32com.client.DispatchWithEvents("Yuanta.YuantaOrdCtrl.1", MyEvent)
      
      
    • 過程中, 我本以為這樣就 Ok 了, 卻發現 Event Function 怎樣都不會被 Call Back , 不斷地 Google 爬文下, 發現還要在 主程序 呼叫 底下的 Function ,  Event 才會被 Process
    • pythoncom.PumpWaitingMessages()
      
      
  • 經由以上, 就可以讓 Python 去呼叫元大期貨 API , 按照元大提供的文件說明 , 傳入參數, 就可以得到回傳值.

  • 我主要是用來得到實際帳戶部位, 保證金金額, 帳戶淨值等, 來做資金和風險管理, 最後甚至拿來與 MultiCharts 做倉位同步,  這部分以後有機會再跟大家分享.

9 則留言:

  1. 請問, 有簡單的example可以參考嗎??
    謝謝

    回覆刪除
    回覆
    1. 您好,
      會這樣問是因為我是初學者
      按照上面的輸入, 得到 error message, 謝謝
      File "E:\work\python\class.py", line 5, in MyEvent
      def OnLogonS(self, TLinkStatus=defaultNamedNotOptArg, AccList=defaultNamedNotOptArg, Casq=defaultNamedNotOptArg, Cast=defaultNamedNotOptArg):
      NameError: name 'defaultNamedNotOptArg' is not defined

      刪除
    2. 有 import win32com.client ??

      我自己的 import module 如下 :

      import win32com.client.CLSIDToClass, pythoncom, pywintypes
      import win32com.client.util
      import win32event

      刪除
    3. 您好, 謝謝您的答覆
      現在沒有error message了
      另外請教, 如果要得到 2330目前的收盤價
      command 應該怎麼下??
      謝謝

      刪除
    4. 目前元大應該只有開放 帳戶資訊查詢API 和 下單 API ...沒有報價的 API ...

      刪除
  2. 謝謝您的答覆, 我可能要另外想辦法了

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 如果打擾了您先說聲抱歉.
    元大期貨 API in C#
    想要請人寫下單軟體,可以幫忙嗎?
    line id: cliff2018.

    回覆刪除