日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTP程序化交易入门系列之二:API基本架构及初始化

發布時間:2023/12/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTP程序化交易入门系列之二:API基本架构及初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上節講了CTP程序化交易的入門工作:下載API,準備賬號密碼地址等。這節我們來講API基本架構及初始化。

一、 CTP API基本架構

?這里為了便于大家理解API的相關函數,我簡略地講一下API的基本架構。如上圖所畫,左邊部分是客戶的交易程序,中間是封裝好的API動態庫底層;右邊是CTP系統。以客戶登錄為例,順序邏輯如下:
  • 客戶程序里調用API的函數ReqUserLogin寫入動態庫底層維護的緩存中;
  • 動態庫內置線程讀取緩存內容通過tcp鏈接發往CTP前置;
  • 動態庫內置線程通過tcp鏈接讀取CTP的回復,然后回調SPI中的函數OnRspUserLogin;
  • 客戶在繼承重寫OnRspUserLogin函數,在其中處理自己的業務邏輯;
  • ?其實這也是國內市場上(包括交易所)大部分異步API的基本架構。

    二、接口文件清單

    ?以win64為例:

    thosttraderapi.py //交易頭文件 _thosttraderapi.pyd //交易庫轉換文件 thosttraderapi.dll //交易官方動態庫,穿透式版為thosttraderapi_se.dll thostmduserapi.py //行情頭文件 _thostmduserapi.pyd //行情庫轉換文件 thostmduserapi.dll //行情官方動態庫,穿透式版為thostmduserapi_se.dll

    ?可以看到API分為交易3個文件,主要負責認證,登錄,報單,撤單,查資金,查持倉等功能;行情3個文件,主要負責訂閱收取行情。兩部分可以獨立運行。

    三、初始化函數說明

    ?API在調用前需要初始化,初始化的流程都是固定的(詳細參考td_demo.py):

    import thosttraderapi as api//創建API實例 tradeapi=api.CThostFtdcTraderApi_CreateFtdcTraderApi() //創建SPI實例。CTradeSpi是繼承自頭文件中CThostFtdcTraderSpi的類型, //用于收從CTP的回復,可以重寫父類中的函數來實現自己的邏輯 tradespi=CTradeSpi(tradeapi) //將創建的SPI實例注冊進實例,這樣該API實例發出的請求對應的回報就會回調到對應的SPI實例的函數 tradeapi.RegisterSpi(tradespi) //訂閱共有流與私有流。訂閱方式主要有三種,分為斷點續傳,重傳和連接建立開始傳三種。 tradeapi.SubscribePrivateTopic(api.THOST_TERT_QUICK) tradeapi.SubscribePublicTopic(api.THOST_TERT_QUICK)// 注冊前置地址,是指將CTP前置的IP地址注冊進API實例內 tradeapi.RegisterFront(FrontAddr) //API啟動,init之后就會啟動一個內部線程讀寫,并去連CTP前置 tradeapi.Init()//Join函數是使得函數阻塞在這里,等待api實例創建的內部線程的結束。 //內部線程需要release才會釋放結束 tradeapi.Join()

    四、請求及回復函數說明

    ?以交易為例,從頭文件(thosttraderapi.py)底部可以看到有兩個類class CThostFtdcTraderApi和class CThostFtdcTraderSpi。CThostFtdcTraderApi類中是所有的請求函數,例如請求登錄:

    def ReqUserLogin(self, pReqUserLoginField: 'CThostFtdcReqUserLoginField', nRequestID: 'int') -> "int":

    ?投資者只需要用該函數所要求的參數類型聲明一個變量,并將變量中相應成員賦值,再調用函數發送出去就可。如下:

    loginfield = api.CThostFtdcReqUserLoginField() loginfield.BrokerID="0000" loginfield.UserID="00001" loginfield.Password="123456" tradeapi.ReqUserLogin(loginfield,0)

    ?這樣就會將登錄請求發送到CTP的前置。
    ?而該請求對應的回復我們怎么得到呢?這就需要靠SPI實例了。在第三節中可以看到通過RegisterSpi函數,API的實例和SPI的實例是一一對應的。所以如果CTP發回來回復,底層dll就保證了將回調到對應的SPI中登陸回復函數:

    def OnRspUserLogin(self, pRspUserLogin: 'CThostFtdcRspUserLoginField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":

    ?該函數對應的參數便是CTP回復的信息,我們可以繼承CThostFtdcTraderSpi類,然后重寫該函數,將相應的信息答應出來,也可以在該函數中實現其他的邏輯,例如demo中就在該函數中繼續去查結算單信息。

    ?細心的讀者一定發現了,CThostFtdcTraderApi類中的請求函數和CThostFtdcTraderSpi類中的回復函數命名存在一一對應關系。這種對應關系可以借用官方文檔中一張圖:

    五、初始化時序圖

    ?最后我們以官方文檔中的初始化時序圖收尾。

    下節預告:
    如何使用CTP API獲取實時行情

    關注公眾號,一起學習程序化交易!
    關注公眾號,一起學習程序化交易!

    總結

    以上是生活随笔為你收集整理的CTP程序化交易入门系列之二:API基本架构及初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。