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

article/2025/9/8 10:47:17

一、本人按照以下过程在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 pluslanguage="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版本问题,但没时间找问题,先在此记录以下


http://chatgpt.dhexx.cn/article/UNtSLXrC.shtml

相关文章

讲 透Object.prototype.toString.call()

Object.prototype.toString.call() 这个方法是用来判断数据类型的,主要用到的知识点是原型,原型链,toString(),call toString 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的…

DeepSort 解读

1 摘要 DeepSort是在Sort目标追踪基础上的改进。引入了在行人重识别数据集上离线训练的深度学习模型,在实时目标追踪过程中,提取目标的表观特征进行最近邻匹配,可以改善有遮挡情况下的目标追踪效果。同时,也减少了目标ID跳变的问…

总结SPOT系列卫星发射情况

SPOT系列卫星是法国空间研究中心自1978年开始立项研制的对地观测卫星系统,自1986年成功发射SPOT 1卫星以来,该系列卫星获得了大量全球卫星观测影像数据,应用于测图、土地利用等诸多领域。目前共发射SPOT 1-7共7颗卫星,其发射时间及…

hive 修改cluster by算法_疯狂Hive之DML操作(四)

DML操作 Load 在将数据加载到表中时,Hive不会进行任何转换。加载操作是将数据文件移动到与Hive表对应的位置的纯复制、移动操作。 语法结构: load data [local] inpath ‘filepath’ [overwrite] into table tablename [partition(par2val1,par2val2....…

RT-Thread Studio学习(十一)IIC

RT-Thread Studio学习(十一)IIC 一、简介二、新建RT-Thread项目并使用外部时钟三、设置AT24Cxx的驱动框架四、驱动代码移植五、测试六、总结 一、简介 本文将基于STM32F407ZGT芯片介绍如何在RT-Thread Studio开发环境下访问AT24C256模块。 操作系统&am…

从根上理解操作系统(二)

目录 进程 1、进程到底是什么 2、怎么知道时间片用完的 3、进程切换 4、进程初始化 5、任务堆栈 6、系统调用 进程 程序是一个可执行文件,而进程是一个执行中的程序实例,所以可以认为 进程 进程资源 执行序列 利用分时技术,在操作系统…

【ubuntu18.04】meson 安装 及python升级python3.9

发现openh264 支持meson 发现openh264 支持meson 写的也太简单了完全不知道openh264 到底怎么搞meson看起来支持windows和ubuntu先安装python3 参考大神: 注意:meson安装前必须确认是否已经安装python3.5及以上版本;因为meson依赖于python3和ninja 1 安装python3和ninja:su…

KEAZ128 时钟配置

本文介绍如何用KEAZ128评估版(FRDM-KEAZ128Q80)配置为40MHz core freqency/20MHz bus frequency。 1.了解器件时钟特性 参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道这个MCU最高支持48MHz core frequency. 从KEA128 RM&…

《软件工程》整理

目录 Scrum开发 概念 scrum开发流程 Scrum开发 需求获取(拆分) DevOps Server的CMMI模型对需求的层级划分,Epic(长篇故事)、Feature(特性)、Requirement(需求)其中&am…

RTKLIB源码调试.trace文件解析.stat文件解析

.trace文件是调试文件,帮助用户在程序、输入数据时,进行分析的一个很好的提示! .trace文件的生成、trace文件内容的生成,均在execses中! 以单点定位为例,大体流程为: 生成.trace文件&#xf…

sopt:一个简单的python最优化库

sopt:一个简单的python最优化库引言 最近有些朋友总来问我有关遗传算法的东西,我是在大学搞数学建模的时候接触过一些最优化和进化算法方面的东西,以前也写过几篇博客记录过,比如遗传算法的C语言实现(一):以非线性函数求极值为例和C语言实现粒子群算法(P…

python古诗词生成_Python一日一练02----诗词生成器

要求 编写一段程序,可以自动生成小诗。 格式如下 源码 import random import sys articles ["the", "a", "another", "her", "his"] subjects ["cat", "dog", "horse", "m…

LSTM古诗词生成

Le LSTM古诗词生成 一、简介 基于LSTM的古诗词生成,设计神经网络模型,使模型学习数据是6291首古诗,没有专门的验证数据和测试数据,感觉不会预测正确。边学习边生成古诗,从生成的古诗来看学习的效果。 涉及到的模块有Py…

宋词自动生成

利用宋词语料库,通过单双词的组合与模板的匹配,实现指定词牌宋词的生成 import random import tkinter as tk import re from tkinter import messageboxlist []class Window:# 界面设计def __init__(self, root):label1 tk.Label(root, text输入词牌…

基于Python的宋词生成器

资源下载地址:https://download.csdn.net/download/sheziqiong/85631523 1. 背景 我有两个爱好,一个是传统文化,另一个是高新技术。 传统文化,我喜欢唐诗宋词、笔墨丹青,高新技术我则从事前沿的IT编程,喜…

基于java的古诗词生成管理系统

10161-古诗词生成管理系统 开发工具 eclipse tomact mysql jdk 功能详情: 古诗搜索、古诗问答、机器回复、古诗管理(添加古诗、古诗分类、古诗标签、古诗列表)、用户管理

田字格字帖生成器、孩子取名系列工具

大家好,我是小寻,欢迎关注公众号:工具优选,免费领取优质项目源码和常用工具,还可以加入我的交流群! 这是是一款2013年上线的在线小工具集,包括了 13 款中文学习工具,有田字格字帖、拼音田字格、古诗词字帖…

有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器

一、前言 很早之前,我曾经写过一个古体诗生成器(详情可以戳TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器),那个时候用的还是Python 2.7和TensorFlow 1.4。 随着框架的迭代,API 的变更&#x…

现在还可以一键自动生成古诗词,你知道吗?

人类在漫长的历史长河中,一直在探索着各种各样的美好,不断地追求着更高的境界。而如今,随着科技的不断发展,人工智能已经成为了我们得力的伙伴之一,为我们带来了更多的便利和可能性。尤其是在艺术和文化领域&#xff0…

古诗词在线起名 - 一刀工具箱

古诗词名字生成器帮助你在线生成古诗词名字,包含:诗经、楚辞、唐诗、宋词、辞赋等古风的名字,这些名字都非常的优美好听,希望你们能够喜欢这款古诗词起名工具。 代码片段 async subName() {let name_arr Object.keys(this.userN…