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 源
操作步骤如下:
进行上述操作之后,系统会花几分钟时间进行服务器速度的测试。测试完毕之后,点击『选择服务器』,后面根据提示输入密码和重新载入软件信息即可。
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
然后开始进行安装
后面根据提示按回车或者输入yes即可,要注意一下在提示是否要在.bashrc文件中更新PATH变量时,一定要输入Yes
安装完毕之后执行如下命令让bash的配置文件即时生效
source ~/.bashrc
执行完之后执行python命令进行验证,如果安装成功会出现 Anaconda 4.0.0 的字样
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包
用Git进行同步
有两种方式: https和ssh 。建议还是采用这种方式,因为能随时把vn.py的最新代码同步下来,很方便。而且可以在本地用单独的分支保存自己修改后的代码,和官方代码共存,随时切换。
用https的方式下载代码
git clone https://github.com/vnpy/vnpy.git
再细节的操作这边不多说,提供两个官方文档供大家参考。
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行情模块为例来讲解一下。
这是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启动简单多了。
- 通过live ubuntu设备启动到grub引导界面,按下c键。这个操作会进入到grub的命令输入界面。
- 输入ls命令。这个操作会显示出有的硬盘设备,如:(hd1,gpt1),这表示是第1块硬盘的第一个gpt分区。这个命令会显示出很多分区,我们需要选择出挂载了根(/)的分区。
- 用ls (hd1,gpt1)命令找出挂载了根(/)的分区。当命令的返回结果中有ext*格式的字样就说明该分区是挂载了根的分区,并进行记录,这里先假设(hd1,gpt1)就是根分区。
- 执行如下命令
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即可,各个平台的都有。