当前位置:
首页 > Python基础教程 >
-
vn.py源码解读(二、实盘交易代码分析)
离上一篇和vnpy有关的文章整整一年了。这一年似乎过得异常的快,快到让人觉得没有成长。可能是工作原因吧,时间一下子就会过去;亦或是自己懈怠了。
一年前vnpy网上的教程还很少,而现在渐渐多了起来,量化交易学习的人群也渐渐多了起来了吧。
之前的文章简单介绍了一下vnpy的配置和回测的代码的简单解析。其实vnpy对我的吸引力在回测功能上面几乎没有。说句真心话,回测框架比vnpy好的框架太多了,但是都是国外的,能够和ctp结合,进行实盘的,目前看来只有大商所的飞创还可以自己写写代码,但是是java的,虽然笔者也能写写java,但是策略编写太复杂,框架设计的时候不够友好。而且,java扩展功能太不方便。所以nvpy可能是一个比较好的选择吧,至少可以作为一个学习对象。
所以这一篇将重点讲述一下实盘部分的代码。具体在nvpy项目文件下的example里面有一个CtaTrading。
我们先来看一下代码吧,我们不关心别的,只关心runChildProcess这个子进程函数,这个里面完成了一个策略的运行前准备到策略开始的全过程。
def runChildProcess():
"""子进程运行函数"""
print('-'*20)
# 创建日志引擎
le = LogEngine()
le.setLogLevel(le.LEVEL_INFO)
le.addConsoleHandler()
le.addFileHandler()
le.info(u'启动CTA策略运行子进程')
ee = EventEngine2()
le.info(u'事件引擎创建成功')
me = MainEngine(ee)
me.addGateway(ctpGateway)
me.addApp(ctaStrategy)
le.info(u'主引擎创建成功')
ee.register(EVENT_LOG, le.processLogEvent)
ee.register(EVENT_CTA_LOG, le.processLogEvent)
ee.register(EVENT_ERROR, processErrorEvent)
le.info(u'注册日志事件监听')
me.connect('CTP')
le.info(u'连接CTP接口')
sleep(10) # 等待CTP接口初始化
me.dataEngine.saveContracts() # 保存合约信息到文件
cta = me.getApp(ctaStrategy.appName)
cta.loadSetting()
le.info(u'CTA策略载入成功')
cta.initAll()
le.info(u'CTA策略初始化成功')
cta.startAll()
le.info(u'CTA策略启动成功')
while True:
sleep(1)
我们来拆分一下步骤。
假设我们现在是一个写程序的人,那么现在我们要实现一个策略的实盘运行,我想大框架的步骤应该分成这样几个:
策略运行前的设置
策略载入
策略执行
那么vnpy是一个事件驱动类型的框架,所以策略载入前的设置包含事件驱动引擎的初始化。
好,那么我们来看一下具体是怎么实现的。
a.运行环境设置,初始化日志生成模块。这个比较好理解,我们需要一个日志文件来监控我们策略的执行
# 创建日志引擎
le = LogEngine()
le.setLogLevel(le.LEVEL_INFO)
le.addConsoleHandler()
le.addFileHandler()
le.info(u'启动CTA策略运行子进程')
b.初始化事件引擎
有的同学可能不知道什么是事件引擎。大家可以这么想,所谓的事件驱动的回测框架,就是把行情数据的到来当成是事件,那么事件引擎的作用就是被事件叫起来,并执行相应的动作。
ee = EventEngine2()
le.info(u'事件引擎创建成功')
c.需要一个大的类来把策略、ctp行情、事件引擎comgbine起来。nvpy的作者把这个叫做主引擎(MainEngine),个人觉得不太适合叫做Engine,不过也无伤大雅吧。
me = MainEngine(ee)
me.addGateway(ctpGateway)
me.addApp(ctaStrategy)
le.info(u'主引擎创建成功')
ee.register(EVENT_LOG, le.processLogEvent)
ee.register(EVENT_CTA_LOG, le.processLogEvent)
ee.register(EVENT_ERROR, processErrorEvent)
le.info(u'注册日志事件监听')
me.connect('CTP')
le.info(u'连接CTP接口')
sleep(10) # 等待CTP接口初始化
me.dataEngine.saveContracts() # 保存合约信息到文件
这里其实完成的东西有点多,首先,把ee这个事件引擎的实例挂上去,然后把ctp挂上去,说是挂ctp,其实是挂数据接口。nvpy数据流的传送是一个很有意思的东西,下一次讲吧。大家也可以看看vnpy作者的知乎文章:https://zhuanlan.zhihu.com/p/32848878讲的有点简略,笔者下一篇详细展开讲一下。
然后把策略挂上去。挂策略的时候可能有点懵,这样就挂上去了?策略的设置在文件夹的CTA_setting里面。
[
{
"name": "double ema",
"className": "EmaDemoStrategy",
"vtSymbol": "IF1706"
},
{
"name": "atr rsi",
"className": "AtrRsiStrategy",
"vtSymbol": "IC1706"
},
{
"name": "king keltner",
"className": "KkStrategy",
"vtSymbol": "IH1706"
}
]
可以修改、删除、增加策略的名称和策略对应的标的。其中,className对应的是vnpy/trader/app/ctaStrategy/strategy下的策略py文件里面的strategy类的名称。比如:
class KkStrategy(CtaTemplate):
"""基于King Keltner通道的交易策略"""
className = 'KkStrategy'
author = u'用Python的交易员'
# 策略参数
kkLength = 11 # 计算通道中值的窗口数
kkDev = 1.6 # 计算通道宽度的偏差
trailingPrcnt = 0.8 # 移动止损
initDays = 10 # 初始化数据所用的天数
fixedSize = 1 # 每次交易的数量
strategyKingKeltner.py中的部分代码如上。
东西都挂完之后对事件驱动的引擎做一些log事件注册。
ee.register(EVENT_LOG, le.processLogEvent)
ee.register(EVENT_CTA_LOG, le.processLogEvent)
ee.register(EVENT_ERROR, processErrorEvent)
le.info(u'注册日志事件监听')
d.做好了设置之后,其实策略的初始化和策略的执行很简单。
cta = me.getApp(ctaStrategy.appName)
cta.loadSetting()
le.info(u'CTA策略载入成功')
cta.initAll()
le.info(u'CTA策略初始化成功')
cta.startAll()
le.info(u'CTA策略启动成功')
————————————————
版权声明:本文为CSDN博主「钱塘小甲子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qtlyx/article/details/84672064
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式