vnpy: 在Ubuntu系统上编译vn.py CTP接口

一、本人按照以下过程在docker容器里使用python3.7编译成功了,具体容器编译环境(python,gcc)如下图:

为以后sopt编译做准备吧

 

以下为参考:https://zhuanlan.zhihu.com/p/83732424

交易接口支持

目前2.0版本的vn.py,在Windows系统下可以使用所有的交易接口,而在Ubuntu系统下则只能使用其中的一部分,具体情况如下:

C/C++类接口:CTP、OES

这类原生API接口提供的SDK文件中通常包含:头文件、动态链接库、静态链接库(Windows下)。动态链接库在Windows下为dll文件,而Linux下则为so文件。

理论上,所有提供了so格式动态链接库的C/C++类交易接口,都能支持在Ubuntu上运行,如下图所示的CTP:

目前由于开发力量上的限制,对于C/C++类接口,vn.py在Ubuntu上只支持CTP和OES两个用户量最大的接口,后续随着2.0版本的功能模块逐步移植完毕,会提供其他接口的支持:TAP、FEMAS、XTP等。

Python类接口:IB、TIGER、FUTU

IB(盈透证券)、TIGER(老虎证券)、FUTU(证券)这三个接口,使用的是其官方提供的纯Python SDK,直接进行接口函数的对接开发。得益于Python本身的跨平台解析性语言特点,这类接口在Ubuntu系统下也能直接使用。

REST/WebSocket协议类接口:所有数字货币、Alpaca

当今几乎所有的数字货币交易所,都提供了基于REST协议(下单、查询)和WebSocket协议(行情、推送)的API,部分外盘的股票期货经纪商也开始提供这块的支持(如美股0佣金券商Alpaca)。

协议类接口通常只是定义了标准的数据通讯格式,用户可以自行选择编程语言或者操作环境来实现对接,所以这类接口在Ubuntu下也全部都能支持。

编译CTP

对于C++接口的具体编译过程感兴趣的用户(vn.py社区的成员就是这么好学~),可以照着下面的步骤尝试在Ubuntu环境下编译CTP接口。

首先在桌面上创建一个如下结构的目录,其中包含ctpapi文件夹(包含ctp文件夹和__init__.py)、setup.py、http://MANIFEST.in

创建好后,需要对红色方框标识的3个文件进行操作:setup.py和http://MANIFEST.in需要写入新的代码,而ctp文件夹需要放入新的文件。

setup.py是C++ API封装代码的编译的主入口文件,运行后即可生成Linux环境下的动态链接库so文件,或者用于Window环境下的dll文件。具体内容如下:

import platform
from setuptools import Extension, setup
​
dir_path = "ctpapi"
​
if platform.uname().system == "Windows":
    compiler_flags = [
"/MP", "/std:c++17",  # standard
"/O2", "/Ob2", "/Oi", "/Ot", "/Oy", "/GL",  # Optimization
"/wd4819"  # 936 code page
    ]
    extra_link_args = []
else:
    compiler_flags = [
"-std=c++17",  # standard
"-O3",  # Optimization
"-Wno-delete-incomplete", "-Wno-sign-compare", "-pthread"
    ]
    extra_link_args = ["-lstdc++"]
​
vnctpmd = Extension(
# 指定 vnctpmd 的位置
"ctpapi.ctp.vnctpmd",
    [
f"{dir_path}/ctp/vnctp/vnctpmd/vnctpmd.cpp",
    ],
# 编译需要的头文件
    include_dirs=[
f"{dir_path}/ctp/include",
f"{dir_path}/ctp/vnctp",
    ],
# 指定为c plus plus
    language="cpp",
    define_macros=[],
    undef_macros=[],
# 依赖目录
    library_dirs=[f"{dir_path}/ctp/libs", f"{dir_path}/ctp"],
# 依赖项
    libraries=["thostmduserapi_se", "thosttraderapi_se", ],
    extra_compile_args=compiler_flags,
    extra_link_args=extra_link_args,
    depends=[],
    runtime_library_dirs=["$ORIGIN"],
)
vnctptd = Extension(
"ctpapi.ctp.vnctptd",
    [
f"{dir_path}/ctp/vnctp/vnctptd/vnctptd.cpp",
    ],
    include_dirs=[
f"{dir_path}/ctp/include",
f"{dir_path}/ctp/vnctp",
    ],
    define_macros=[],
    undef_macros=[],
    library_dirs=[f"{dir_path}/ctp/libs", f"{dir_path}/ctp"],
    libraries=["thostmduserapi_se", "thosttraderapi_se"],
    extra_compile_args=compiler_flags,
    extra_link_args=extra_link_args,
    runtime_library_dirs=["$ORIGIN"],
    depends=[],
    language="cpp",
)
​
if platform.system() == "Windows":
# use pre-built pyd for windows ( support python 3.7 only )
​
    ext_modules = []
# if you really want to build it . please check your environment (没测试过)
# ext_modules = [vnctptd, vnctpmd]
elif platform.system() == "Darwin":
    ext_modules = []
else:
    ext_modules = [vnctptd, vnctpmd]
​
pkgs = ['ctpapi', 'ctpapi.ctp']
install_requires = []
setup(
    name='ctpapi',
    version='1.0',
    description="good luck",
    author='somewheve',
    author_email='####',
    license="MIT",
    packages=pkgs,
    install_requires=install_requires,
    platforms=["Windows", "Linux", "Mac OS-X"],
    package_dir={'ctpapi': 'ctpapi/'},
    package_data={'ctpapi': ['ctp/*', ]},
    ext_modules=ext_modules,
    classifiers=[
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3.7',
    ]
)

http://MANIFEST.in用于指明所有需要导入的文件,其代码如下:

# include MANIFEST.in
include README.md
recursive-include ctpapi/ctp *

api/ctp *

对于原本空空如也的ctp文件夹,我们进行以下复制操作:

  1. 复制/root/Downloads/vnpy-xxx/vnpy/api目录下的ctp文件,
  2. 粘贴到/root/Desktop/ctpapi/ctpapi目录下。

http://MANIFEST.in、setup.py、ctp目录处理完毕后,就可以开始进行编译了:

  1. 切换到与setup.py同级的目录/root/Desktop/ctpapi;
  2. 在该目录下进入终端,然后输入命令python setup.py build开始编译;
  3. 编译完毕后会生成新的文件夹build。

打开build文件夹,在build/ctpapi/build/lib.linux-x86_64-3.7/ctpapi/ctp里面,可以看到两个so文件:vnctpmd.cpython-37m-x86_64-linux-gnu.so和 vnctptd.cpython-37m-x86_64-linux-gnu.so,这两个Linux下的动态链接库就是已经编译完成的CTP API封装,可以直接在Python中加载使用了。

编译好后,为了检验有效性,可以试试看能否在Python解释器中导入vnctpmd和vnctptd两个模块:

  1. 在桌面上创建新的文件夹ctpso;
  2. 然后把root/ctpapi/build/lib.linux-x86_64-3.7目录下的ctpapi文件夹复制,并粘贴到新文件夹ctpso里面;
  3. 在ctpso目录下进入终端,启动Python解释器,运行下面命令:
from ctpapi.ctp import vnctpmd
from ctpapi.ctp import vnctptd

4. 若无报错(正常载入),则说明我们的编译已经成功了!

二、记录一下编译不成功的过程

本机测试,环境ubuntu16.04, python3.8, gcc 5.4.0,错误为“gcc: error: unrecognized command line option ‘-R’
error: command '/usr/bin/gcc' failed with exit code 1”,怀疑是gcc的版本或者python版本问题,但没时间找问题,先在此记录以下

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值