上一篇社区精选中,主要解决了如何搭建支持远程桌面的Ubuntu量化交易服务器。有了系统环境,那么本篇的内容就是如何运行和使用vn.py量化平台了。

 

安装vn.py

 

首先打开vn.py项目的GitHub发布页面

 

这里包含了vn.py所有发布的正式版本,推荐使用最新版本(左侧会有个Latest release的绿色文字框提示)。点击最新版本下方的的Source Code (zip)链接,来进行下载。
 

下载完毕后,进入文件目录\root\Downloads,解压zip格式的安装文件。

 
description

 

然后进入解压文件目录\root\Downloads\vnpy-xxx(其中xxx是下载的vn.py版本号),在终端中运行安装命令:

 

bash install.sh

 

接下来安装脚本会自动进行vn.py以及相关依赖库的安装任务。

 
description

 

安装完毕后,尝试启动图形化交易界面VN Trader。进入文件目录\root\Downloads\vnpy-xxx\examples\vn_trader,其中的run.py文件就是我们启动VN Trader的程序入口。
 

通常用户可以根据自己的需求,自行在run.py文件中加载需要使用的底层接口和上层策略应用。这里我们只展示CTP接口的连接,如果需要使用别的接口可以使用VSCode编辑文件自行添加。

 
description

 

在当前的vn_trader目录下,右键打开终端运行命令,即可启动图形化交易界面VN Trader:

 

python run.py

 

注意:如果启动VN Trader时报错说缺少了pyqtgraph和zmq库,直接用pip工具安装即可,在终端中运行命令:

 

pip install pyqtgraph pyzmq

 
description

 

进入VN Trader后,点击菜单栏【系统】->【连接CTP】会弹出CTP账号配置选项。填好账号信息后,点击下方的【连接】按钮即可登陆CTP进行交易。

 
description

 

点击“连接”按钮后,左下角的日志信息区域会输出相关的初始化日志信息,看到“合约信息获取成功”的日志后,我们就可以订阅行情推送以及执行委托交易了。

 
description

 

 

交易接口支持

 

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

 

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

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

 

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

 
description

 

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

Python类接口:IB、TIGER、FUTU
 

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

 

 

编译CTP

 

注意:如果只是想要在Ubuntu下使用vn.py做量化,这段内容并不是必须掌握的知识。

 

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

 

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

 
description

 

创建好后,需要对红色方框标识的3个文件进行操作:setup.py和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',
    ]
)

 

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

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

 

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

 

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

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

 

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

 
description
 

打开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中加载使用了。

 
description

 

编译好后,为了检验有效性,可以试试看能否在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. 若无报错(正常载入),则说明我们的编译已经成功了!

 
description

 
了解更多知识,请关注vn.py社区公众号。
description