Date

1. 为什么在Ubuntu上运行vn.trader?

Windows

  • Windows系统的安装和使用都很方便,上手快
  • 软件种类多
  • License贵
  • 中病毒的概率高

Linux

  • Linux系统的安装会复杂一些,软件安装很方便,上手慢,需要的学习成本相对来讲会高一些
  • 软件的品种会相对少一些,比如QQ就没有Linux版本,不过如果用于量化交易,建议第三方软件越少越好,减少资源被抢占和中病毒的风险
  • Ubuntu作为现在流行的一款Linux发行版是有免费版供我们使用的
  • Linux系统由于使用的人群少,所以中病毒的概率相对低一些
  • Linux下c\c++源码的编译非常方便,不用安装庞大的IDE,提高开发效率
  • Linux较新版本的内核中集成了众多硬件的驱动,大部分情况下安装完即可用,不用单独安装第三方驱动。
  • 还有就是众所周知的Linux命令行,强大到可以不用图形界面就可以完成几乎所有的操作

总之,Windows和Linux各有各的特点,都是久经市场考验的操作系统,稳定性都非常的好,不用纠结于用什么环境,只要自己喜欢、习惯就好。

2. 环境安装

  • 版本:Ubuntu 16.04 LTS
  • 语言:简体中文
  • 时区:Shanghai
  • 硬件:64位,4G内存以上

环境安装分为两部分,快速安装详细流程

作为一篇安装指导文章为的就是让我们快速,完美的把系统安装好,好继续后面策略编写,回测等最重要的步骤。所以快速安装会提供快速的指导,在短时间内把vn.trader跑起来,并能正常运行。

安装流程如下:

安装流程

我们每个人的硬件环境都不一样,难免会出现一些这样那样的错,所以详细流程会把每个步骤进行详细的描述和解释,方便大家去有针对性的排错。

2.1 快速安装

2.1.1 Ubuntu的安装

引用官方安装教程:点击查看

这里简单讲一下Ubuntu的引导,分为传统引导UEFI引导,不解释细节,从现在的硬件发展趋势来看建议用UEFI引导,而且操作起来非常的简单。把下载下来的ISO文件全部解压到Fat32分区的U盘中,从U盘启动即可,这样安装下来就默认是UEFI引导。

如果在Ubuntu安装过程中有什么问题请看2.2.1

2.1.2 让后续的安装快一点

为什么要写这一节?在安装过程当中需要安装和更新很多软件,大家的网络环境各不一样,而且默认环境下有些软件源是指向的国外,直接在默认环境下进行安装和更新可能会很慢,所以需要根据不同的网络环境设置不同的软件源(apt 和 pip)。

1. apt 源

操作步骤如下:

apt源设置

设置

软件和更新

其他站点

选择最佳服务器

进行上述操作之后,系统会花几分钟时间进行服务器速度的测试。测试完毕之后,点击『选择服务器』,后面根据提示输入密码和重新载入软件信息即可。

2. pip 源

创建pip的配置文件,在终端中执行如下命令

mkdir ~/.pip/

再执行

vim ~/.pip/pip.conf

这时候会出现pip.conf的编辑窗口,把如下内容输入到编辑框里面

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

编辑完后保存并退出vim: ESC -> shift+; -> x -> Enter

2.1.3 安装Python环境

下载Anaconda2并安装,在终端中顺序执行下面3行命令

wget https://repo.continuum.io/archive/Anaconda2-4.0.0-Linux-x86_64.sh
chmod +x Anaconda2-4.0.0-Linux-x86_64.sh
./Anaconda2-4.0.0-Linux-x86_64.sh

然后开始进行安装

Anaconda 安装中

后面根据提示按回车或者输入yes即可,要注意一下在提示是否要在.bashrc文件中更新PATH变量时,一定要输入Yes

输入yes

安装完毕之后执行如下命令让bash的配置文件即时生效

source ~/.bashrc

执行完之后执行python命令进行验证,如果安装成功会出现 Anaconda 4.0.0 的字样

Python环境安装成功

2.1.4 安装相关依赖项

执行如下两行命令分别安装应用软件和pip的库

sudo apt-get install mongodb libboost-all-dev cmake git
pip install pymongo qdarkstyle msgpack-python zmq

2.1.5 同步代码

vn.py项目的地址为:https://github.com/vnpy/vnpy

下载代码有两种方式:下载zip包,用Git代码同步到本地

下载zip包

下载zip包

用Git进行同步

有两种方式: https和ssh 。建议还是采用这种方式,因为能随时把vn.py的最新代码同步下来,很方便。而且可以在本地用单独的分支保存自己修改后的代码,和官方代码共存,随时切换。

用https的方式下载代码

git clone https://github.com/vnpy/vnpy.git

再细节的操作这边不多说,提供两个官方文档供大家参考。

https和SSH的选择

怎么样把一个项目同步到本地

2.1.6 运行

请参见章节4

2.2 详细流程

2.2.1 Ubuntu的安装

这一步并不复杂,图形化安装界面,按提示操作即可。这里收集了几个还比较常见的问题:

1. 磁盘分区未对齐导致无法安装

详情请见5.1

2. 安装完成后无法引导

详情请见5.2

2.2.2 让后续的安装快一点

这一小节注意一下如果在安装完python环境后,pip安装还是很慢或者显示下载包不是来自于https://pypi.tuna.tsinghua.edu.cn,就再执行一下修改pip.conf的操作。

2.2.3 安装Python环境

其实ubuntu原生是有python环境的,但是为了方便我们安装Anaconda,自带了非常多的科学计算库,把后面非常繁杂的依赖库安装变得非常简单。

在2.1.3中强调了在更新PATH变量时一定要输入yes,是因为Anaconda采用的是更新PATH变量的方法替换的原生的python环境,如果不输入yes,在终端中执行python时还是会执行系统自带的python。

我们来看看.bashrc文件当中的最后几行内容:

# added by Anaconda2 4.0.0 installer
export PATH="/home/vnpy/anaconda2/bin:$PATH"

这句的含义就是把"/home/vnpy/anaconda2/bin"这个目录加入到了PATH环境变量中。在该目录下有anaconda的python环境,这里有一个细节就是,把该目录加在了原始PATH变量的最前面。

放在最前面是因为当用户在终端里面输入一个命令时,系统会自动搜索PATH环境变量的所有目录,有很多目录供系统去查找,但是会按先后顺序,在前面的优先,所以anaconda用了这个方法替换掉了系统自带的python。

理解了这个原理之后我们做如下事情就非常简单了:

1. 恢复原生的python环境

删除掉.bashrc文件最后那两行即可

2. 在其他的终端软件里面用anaconda的python环境

现在有些朋友用的zsh这款酷炫的终端,而且这款终端中的tab补全不区分大小写,比原有bash方便。在Ubuntu环境中默认执行的终端软件是bash,安装完后,如果再用zsh类似的其他终端,你会发现执行python时还是系统自带的python。

首先我们要知道.bashrc是什么文件,为什么安装anaconda时要修改这个文件。

.bashrc是当用户启动bash时会优先执行的脚本文件,所以执行其他的终端是不会执行"export PATH..."这一句的,所有执行python时还是执行系统自带的python。

那如果要在zsh里面使用anaconda的python环境需要怎么操作呢?bash有.bashrc文件,当然zsh也有相同功能的.zshrc文件,所以把上面那两句加到.zshrc文件里面即可。

最后让.zshrc文件的变更立即生效:

source ~/.zshrc

2.2.4 安装相关依赖项

主要是安装软件(apt)和python (pip)库,下面介绍一下各依赖项

mongodb

mongodb是提供mongodb数据库服务的软件,经过测试发现在ubuntu16.04 LTS下安装后默认就安装了系统服务,而且是自启动。

如果大家想查看mongodb的数据文件和日志文件的具体位置,可以用如下命令进行查看

head /etc/mongodb.conf

会显示如下内容

# mongodb.conf

# Where to store the data.
dbpath=/var/lib/mongodb

# where to log
logpath=/var/log/mongodb/mongodb.log

dbpath 是数据文件存储路径,logpath 是日志文件存储路径

libboost-all-dev

用c++编程必然会用到的库之一,提供了队列,智能线程,Python调用C++库等非常实用的功能

如果没有这个库,会影响 1. vn.trader对ctp和lts接口的识别(菜单没有“连接ctp”和“连接lts”的菜单项) 2. ctp和lts接口的重新编译

如果发现vn.trader安装完毕后,vtMain.py也能打开,但是菜单没有“连接ctp”和“连接lts”的菜单项,请见 5.3

cmake

一款编译工具,如果只是运行vn.trader是不用安装该依赖项的,如果自己需要修改ctp或者lts接口的代码并重新编译时才需要

git

代码版本管理软件git的客户端程序

pymongo

python访问mongodb的库

qdarkstyle

vn.trader的黑色主题(qt4),大家可以根据自己的需要进行安装

msgpack-python

一种数据封装格式,比json更快,更小,而且封装二进制数据会更方便,现在用在了vn.trader的前后端通信功能中

zmq

消息系统,vn.trader前后端分离后用到的消息系统

2.2.5 同步代码

用git管理代码是非常方便的,可以自己开分支进行开发,可以随时更新vnpy的最新代码,包括开发分支(dev)和稳定分支(master)。

具体细节这里不讲太多,不然要单独开几遍文章了,可以自己去找资料学习。

3. API编译

现有版本在ubuntu下有ctp、lts和oanda接口可供使用,ctp和lts可以重新编译,oanda是REST API的纯Python接口,无需进行本地编译即可跨平台使用。

如果有需要,我们是可以对接口的封装代码进行修改并重新编译的。先了解一下编译出来的输出文件是什么?如何使用? 本小节以ctp行情模块为例来讲解一下。

vnctpmd

这是ctp行情模块的调用关系,libthostmduserapi.so 这个是官方提供的行情库,是给c++使用的。vnctpmd.so 是我们自己写的一层封装,给python调用的,这就是我们可以重新编译的模块。

3.1 同步代码

请参照2.1.5,编译的源码目录是vn.ctp,里面有行情模块vnctpmd和交易模块vnctptd。

3.2 编写CMakeLists.txt

其实该文件已经编写好了,只要不是变更太多,都不需要变更该文件。这个文件是编译工具cmake配置文件。其实在ubuntu下编译api非常的方便,安装依赖库cmake和boost,运行build.sh就行。

3.3 安装依赖库

请参照2.2.4中的libboost-all-dev和cmake项

3.4 运行 build.sh

在终端中进行到 vnpy/vn.ctp 目录下,运行

./build.sh

3.5 验证是否编译成功

进入到vnpy/vn.ctp/build/lib/目录下,先查看是否有vnctpmd.so和vnctptd.so这两个文件。如果有则用ls查看这两个文件的修改时间是否和执行build.sh的时间相吻合。

如果文件存在而且时间和最后一次编译时间相吻合,则表明编译成功,而且在执行build.sh时这两个文件已经被复制到了vn.trader的ctpGateway目录下,最新的编译版本可直接供vn.trader使用。

4. 成功运行

运行vn.trader有两种方式:普通模式rpc模式

普通模式

进入到源码目录vn.trader下执行

python vtMain.py

rpc模式

运行server

sudo bash

进入到源码目录vn.trader下

python vtServer.py

新打开终端进入到源码目录vn.trader下,运行client

python vtClient.py

能在其他机器上运行客户端吗?当然可以。

在执行上一条命令前,在vtClient.py中找到

# 创建客户端
reqAddress = 'tcp://localhost:2014'
subAddress = 'tcp://localhost:0602'

把localhost替换成服务端的ip地址即可

成功运行

??是不是少了点什么?说好了的ctp和lts接口呢? 参照5.3操作完之后再次运行

成功运行

5. 附录

5.1 Ubuntu安装提示分区未对齐错误导致无法安装

这个错很大机率发生在某些机械硬盘手动分区后

分区对齐错误

不过解决这个问题也不复杂,在Windows下用DiskGenius先把区分好,不管是传统启动还是GPT+UEFI都可以按下图的分区来分。分好后再重新安装即可,重新安装时可以选择重新格式化。

分区后

5.2 Ubuntu安装完成后无法引导

这个问题多发生在机器存在多硬盘的情况下,这个问题怀疑是Grub的引导机制存在逻辑问题引起的,还未经证实。

Linux的硬盘设备文件命名机制是这样的:Sata硬盘为 /dev/sda, 最后那个a很关键,如果是两块硬盘就会有两个文件: /dev/sda, /dev/sdb 这个很好理解,分区描述文件怎么命名呢?如果只有一块硬盘 /dev/sda,第一个分区是 /dev/sda1,第二个分区是 /dev/sda2,这样依次往下累加。

问题就出在如果有两块硬盘谁是 sda 谁是 sdb 呢?实测下来发现是会变的,但是分区的顺序不会变,所以有时启动不了就是很正常的了。

根因找到了下面就来讲讲解决方案,用grub进行手动引导。那怎么把grub运行起来呢?用一块ubuntu live的U盘或者光盘就行。

推荐一个非常简单的制作usb ubuntu live的方案就是把下载好了的ubuntu的iso文件解压到U盘(Fat32格式)上,就可以通过UEFI启动,比传统的mbr启动简单多了。

  1. 通过live ubuntu设备启动到grub引导界面,按下c键。这个操作会进入到grub的命令输入界面。
  2. 输入ls命令。这个操作会显示出有的硬盘设备,如:(hd1,gpt1),这表示是第1块硬盘的第一个gpt分区。这个命令会显示出很多分区,我们需要选择出挂载了根(/)的分区。
  3. 用ls (hd1,gpt1)命令找出挂载了根(/)的分区。当命令的返回结果中有ext*格式的字样就说明该分区是挂载了根的分区,并进行记录,这里先假设(hd1,gpt1)就是根分区。
  4. 执行如下命令
set root=(hd1,gpt1)
linux /boot/vmlinuz* ro root=/dev/sdb1

上面这条命令需要说明一下: - /boot/vmlinuz*中星号代码每个人的环境中后面的文件名可能不一样,并不是真正的星号。

然后这里有个小技巧,set root=(hd1,gpt1)这条命令执行完后,如果(hd1,gpt1)确实是挂载了根的分区,输入到/boot/vmlinuz时按tab会对文件名进行自动补全,否则会提示出错。 - sdb1和gpt1中的最后一个数字应该是一样的,就是说如果已经确定为gpt1了,那么肯定为sd*1,这里的星号表示可能为a-z任意的字母,并不一定是b,这就是需要去测试的,如果有多块硬盘,先试一下sda1,再试一下sdb1,总会有一次可以成功启动。

initrd /initrd.img
boot

如果没有成功,则再次重启(命令:reboot),尝试sda1,sdb1,sdc1?在不同的分区描述文件名中去尝试。

如果成功,打开终端执行如下命令修复当前引导

sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi

如果下次还有硬盘变化,再次启动不了,再从头执行整个修复过程即可。

5.3 无法识别ctp和lts接口

该问题的现象是系统菜单里面没有“连接ctp”和“连接lts”这两个菜单项

原理请参见章节3的那张流程图,缺失在最后一个环节,所以只需要把最后一个库放在vnctpmd.so能找到的位置即可。

/lib和/usr/lib是ubuntu默认的两个库目录,我们不用去想怎么添加共享库目录,我们只用把文件拷贝到这两个目录当中的任意一个即可,我们这个非系统库,所以选择/usr/lib这个目录。

ubuntu中有文件链接的概念,相当于windows下的快捷方式的概念,所以并不需要真正的把文件拷贝过去。

创建链接的脚本已经准备好,放在终端里面执行即可。大家注意一下把/home/vnpy/vnpy改成自己的源码目录。

#ctp
sudo ln -s /home/vnpy/vnpy/vn.ctp/ctpapi/x64_linux/libthostmduserapi.so  /usr/lib/libthostmduserapi.so 
sudo ln -s /home/vnpy/vnpy/vn.ctp/ctpapi/x64_linux/libthosttraderapi.so /usr/lib/libthosttraderapi.so 

#lts
sudo ln -s /home/vnpy/vnpy/vn.lts/ltsapi/securitymduserapi.so /usr/lib/libsecuritymduserapi.so
sudo ln -s /home/vnpy/vnpy/vn.lts/ltsapi/securityqueryapi.so /usr/lib/libsecurityqueryapi.so
sudo ln -s /home/vnpy/vnpy/vn.lts/ltsapi/securitytraderapi.so /usr/lib/libsecuritytraderapi.so

5.3 ta-lib的安装

conda install -c quantopian ta-lib=0.4.9

该命令同时也会对Anaconda2进行更新,所以执行后可能不仅仅是安装ta-lib,也有可能要安装其他的更新包,询问是否要处理时输入Y即可。

5.4 mongodb 客户端的安装

我这边选择了两款:robomongo,免费,速度快,但是没有自动补全提示,打开软件后缺少一些统计信息(集合的记录条数等等)。mongobooster,收费,有自动补全提示,打开软件后每个集合的统计信息很详细,但是如果集合里面的数据一多就慢。大家可以根据自己的喜好进行选择。

robomongo

下载官方的deb包双击安装即可,安装完毕在搜索器里面输入mongobooster,即可搜索出来。

mongobooster

下载官方的压缩包,解压,进入到bin目录,双击robomongo即可。

如果要在桌面上建立快捷方式也非常简单:

  • 在bin目录下右键robomongo,选择“创建链接”
  • 把新创建出来的链接文件拖到桌面即可

5.5 python IDE的安装

推荐pycharm和sublime。还是主推一下pycharm,工程化开发非常方便,也适合新人,有自动提示,符号查找,一键格式化,调试等功能,非常强大。sublime比较简洁,打开速度快。各有各的特点和应用场景。

pycharm

下载官方压缩包,解压,进入到bin目录,找到pycharm.sh,在终端里面运行该文件即可。其实也是可以创建快捷方式的,具体创建方式大家可以自行查找。

把快捷方式的运行命令设置成:

"/home/vnpy/soft/pycharm-2016.3.2/bin/pycharm.sh" %f

sublime

下载官方deb包,双击安装即可。

5.6 对ubuntu的远程操作

对于ubuntu的远程操作有两种方式:ssh和vnc

ssh

apt-get install openssh-server

客户端用ssh命令连接即可。

vnc

会相对复杂一点,引用一个第三方的脚本

su root
wget https://github.com/longhr/ubuntu1604hub/raw/master/ubuntu1604VNC.sh
chmod u+x ubuntu1604VNC.sh
./ubuntu1604VNC.sh

客户端在官方网站上下载vncviewer即可,各个平台的都有。