接續上文《ubuntu 18.04 安裝 vnpy2.0.9 吐血總結》
CTP穿透式驗證是監管層保證期貨公司確認客戶的委托來源的手段。在期貨公司后台,通常看不到用戶交易數據。這些數據只有交易所知道。
然而,為了能讓期貨公司切實配合監管,必須在客戶直連的初期予以它們查看連接來源的權利。因此需要采取相應的技術手段,單獨的一套“透明”api是現在的解決方案。
vnpy的vn station可以滿足Windows下的CTP驗證。但是,在Ubuntu下需要獨立進行編譯ctptestapi才可以,本文記錄在Ubuntu下進行ctptestapi編譯的。
在上文中,我們完成了vnpy在ubuntu 18.04下的安裝語基本使用。接着上面的敘述,在pycharm中,運行example/run.py時將ctptest模塊引入,得到了一個錯誤:
/home/han/miniconda3/bin/python3.7 /home/han/Documents/vnpy-2.0.9/examples/vn_trader/run.py Traceback (most recent call last): File "/home/han/Documents/vnpy-2.0.9/examples/vn_trader/run.py", line 12, in <module> from vnpy.gateway.ctptest import CtptestGateway File "/home/han/Documents/vnpy-2.0.9/vnpy/gateway/ctptest/__init__.py", line 1, in <module> from .ctptest_gateway import CtptestGateway File "/home/han/Documents/vnpy-2.0.9/vnpy/gateway/ctptest/ctptest_gateway.py", line 6, in <module> from .vnctpmd import MdApi ModuleNotFoundError: No module named 'vnpy.gateway.ctptest.vnctpmd'
意思是少了vnctpmd模塊。實際上,我們發現,在/vnpy-2.0.9/vnpy/gateway/ctptest文件夾下,有vnctpmd.pyd和vnctpd.pyd。但是,它們仍然是python文件,而沒有相對應的.so文件。
結合我們之前的經驗,在/vnpy-2.0.9目錄下運行
python setup.py build
之前,也沒有build文件夾,自然也沒有vnctpmd.cpython-37m-x86_64-linux-gnu.so以及vnctptd.cpython-37m-x86_64-linux-gnu.so這兩個文件。而這兩個文件的出現要歸因於setup.py中的兩段編譯指引代碼:
vnctpmd = Extension( "vnpy.api.ctp.vnctpmd", [ "vnpy/api/ctp/vnctp/vnctpmd/vnctpmd.cpp", ], include_dirs=["vnpy/api/ctp/include", "vnpy/api/ctp/vnctp", ], define_macros=[], undef_macros=[], library_dirs=["vnpy/api/ctp/libs", "vnpy/api/ctp"], libraries=["thostmduserapi_se", "thosttraderapi_se", ], extra_compile_args=compiler_flags, extra_link_args=extra_link_args, runtime_library_dirs=runtime_library_dirs, depends=[], language="cpp", ) vnctptd = Extension( "vnpy.api.ctp.vnctptd", [ "vnpy/api/ctp/vnctp/vnctptd/vnctptd.cpp", ], include_dirs=["vnpy/api/ctp/include", "vnpy/api/ctp/vnctp", ], define_macros=[], undef_macros=[], library_dirs=["vnpy/api/ctp/libs", "vnpy/api/ctp"], libraries=["thostmduserapi_se", "thosttraderapi_se", ], extra_compile_args=compiler_flags, extra_link_args=extra_link_args, runtime_library_dirs=runtime_library_dirs, depends=[], language="cpp", )
在這里,我們發現在libraries這一項,給出了thostmduserapi_se和thosttraderapi_se這兩個交易所給出的文件,見simnow下載頁面。
在vnpy-2.0.9/vnpy/api/ctp下的libthostmduserapi_se.so的大小為4613,466字節(4.6MB)。在它旁邊的libthosttraderapi_se.so的大小為5,244,920字節(5.2MB)。
同時我們下載的traderapi的解壓后的文件\6.3.15_20190220\traderapi\v6.3.15_20190220_api_tradeapi_se_linux64\thostmduserapi_se.so大小正好也是4613,466字節。在它旁邊的thosttraderapi_se.so也正是5,244,920字節。
從上面的分析可以判斷vnpy-2.0.9所使用的交易api就是官方網站的6.3.15_20190220.zip。
重新檢視6.3.15_20190220.zip,從中我們可以找到windows和linux版本的api。對應信息采集,我們可以發現windows版本的6.3.15_20190220_clientdll64_windows和linux版本的v6.3.15_20190220_api_clientdatacollectdll_linux64。6.3.15_20190220_clientdll64_windows解壓后的文件有DataCollect.h、WinDataCollect.dll和WinDataCollect.lib三個。
在windows下,從github上下載的vnpy-master文件夾下搜索WinDataCollect.dll發現有vnpy-master\vnpy\api\xgj和vnpy-master\vnpy\gateway\rohon文件夾下面包含它們。
看了《東吳期貨CTP自行開發穿透式監管認證指導》及下附文章《CTP 看穿式監管版本,收集信息為什么會失敗?》,覺得思路又清晰起來。確認了DataCollect的作用,它就是用來獲取用戶機器信息的,而且windows版本和linux版本都是有的。另外,直連模式的CTP驗證,無需手動調用DataCollet庫里的函數。那么,我需要做的就只有將LinuxDataCollect.so編譯進vnctptd庫里面就行了。
回到Ubuntu系統,找到setup.py,修改里面的vnctptd = Extension下面的
libraries=["thostmduserapi_se", "thosttraderapi_se", ],
為
libraries=["thostmduserapi_se", "thosttraderapi_se", "LinuxDataCollect"],
並且在/vnpy/api/ctp/libs中加入改了名字的libLinuxDataCollect.so(原來沒有“lib”),重新編譯。
稍微有些奇怪,原來得到的vnctptd.cpython-37m-x86_64-linux-gnu.so大小為9501,360字節,新得到的vnctptd.cpython-37m-x86_64-linux-gnu.so為9501,320字節,還少了40個字節,先不管了,等拿到期貨公司的auth code再來驗證。
2019年2月4日更新,昨天春節后第一天開盤,迫不及待地實驗了穿透式認證,失敗。使用windows的vnstation連接simnow的服務器就可以,用ubuntu的程序也可以(見這里的2.4節),然而用ctpstest就什么信息都不出。
在ubuntu下運行上面編譯好的run.py登錄simnow的官方服務器時會出現如下異常:

想必這就是我們多連接了一個LinuxDataCollect.so而產生的。然而,重新編譯,把這個庫去掉,仍然會報這個錯誤,暫且擱置。
用6.3.16的api(非穿透式)連接simnow移動服務器,出現錯誤:
CThostFtdcUserApiImplBase::OnSessionDisconnected[0x7ff908000b28][39452702][ 4097]
在6.3.13,6.3.15和6.3.16全然無效的狀況下找到客戶經理得知期貨公司還沒准備好,需要等:

