vnpy在CTP穿透式验证在ubuntu下的编译

接续上文《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全然无效的状况下找到客户经理得知期货公司还没准备好,需要等:

发表评论