前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vn.py源码解读(二、实盘交易代码分析)

vn.py源码解读(二、实盘交易代码分析)

作者头像
钱塘小甲子
发布于 2019-01-28 02:38:09
发布于 2019-01-28 02:38:09
4.3K00
代码可运行
举报
运行总次数:0
代码可运行

        离上一篇和vnpy有关的文章整整一年了。这一年似乎过得异常的快,快到让人觉得没有成长。可能是工作原因吧,时间一下子就会过去;亦或是自己懈怠了。

        一年前vnpy网上的教程还很少,而现在渐渐多了起来,量化交易学习的人群也渐渐多了起来了吧。

之前的文章简单介绍了一下vnpy的配置和回测的代码的简单解析。其实vnpy对我的吸引力在回测功能上面几乎没有。说句真心话,回测框架比vnpy好的框架太多了,但是都是国外的,能够和ctp结合,进行实盘的,目前看来只有大商所的飞创还可以自己写写代码,但是是java的,虽然笔者也能写写java,但是策略编写太复杂,框架设计的时候不够友好。而且,java扩展功能太不方便。所以nvpy可能是一个比较好的选择吧,至少可以作为一个学习对象。

        所以这一篇将重点讲述一下实盘部分的代码。具体在nvpy项目文件下的example里面有一个CtaTrading。

        我们先来看一下代码吧,我们不关心别的,只关心runChildProcess这个子进程函数,这个里面完成了一个策略的运行前准备到策略开始的全过程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

        我们来拆分一下步骤。

        假设我们现在是一个写程序的人,那么现在我们要实现一个策略的实盘运行,我想大框架的步骤应该分成这样几个:

  1. 策略运行前的设置
  2. 策略载入
  3. 策略执行

        那么vnpy是一个事件驱动类型的框架,所以策略载入前的设置包含事件驱动引擎的初始化。

        好,那么我们来看一下具体是怎么实现的。

a.运行环境设置,初始化日志生成模块。这个比较好理解,我们需要一个日志文件来监控我们策略的执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # 创建日志引擎
    le = LogEngine()
    le.setLogLevel(le.LEVEL_INFO)
    le.addConsoleHandler()
    le.addFileHandler()
    
    le.info(u'启动CTA策略运行子进程')

b.初始化事件引擎

        有的同学可能不知道什么是事件引擎。大家可以这么想,所谓的事件驱动的回测框架,就是把行情数据的到来当成是事件,那么事件引擎的作用就是被事件叫起来,并执行相应的动作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ee = EventEngine2()
le.info(u'事件引擎创建成功')

c.需要一个大的类来把策略、ctp行情、事件引擎comgbine起来。nvpy的作者把这个叫做主引擎(MainEngine),个人觉得不太适合叫做Engine,不过也无伤大雅吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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里面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    {
        "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类的名称。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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事件注册。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ee.register(EVENT_LOG, le.processLogEvent)
    ee.register(EVENT_CTA_LOG, le.processLogEvent)
    ee.register(EVENT_ERROR, processErrorEvent)
    le.info(u'注册日志事件监听')

d.做好了设置之后,其实策略的初始化和策略的执行很简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    cta = me.getApp(ctaStrategy.appName)
    
    cta.loadSetting()
    le.info(u'CTA策略载入成功')
    
    cta.initAll()
    le.info(u'CTA策略初始化成功')
    
    cta.startAll()
    le.info(u'CTA策略启动成功')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年12月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
混沌工程之ChaosMesh使用之四模拟网络Duplicate包
今天我们来玩一下ChaosMesh模拟网络duplicate包的情况。同时也要看一下对应用产生的直接影响。
高楼Zee
2021/07/14
7070
混沌工程之ChaosBlade-Operator使用之一模拟POD丢包场景
ChaosBlade-Operator 启动后将会在每个节点部署一个 chaosblade-tool Pod 和一个 chaosblade-operator Pod,如果都运行正常,则安装成功。上面设置 --set webhook.enable=true 是为了 Pod 文件系统 I/O 故障实验,如果不需要进行该实验,则无需添加该设置。
高楼Zee
2021/07/14
1.1K0
混沌工程之ChaosMesh使用之二模拟POD网络延迟
来看下这段配置,是指定在default的命名空间中,使用app=web-show标签搜索POD,配置网络延迟为10ms,持续30s时间,并且每60s执行一次。
高楼Zee
2021/07/14
5430
ChaosBlade:从零开始的混沌工程(三)
在上篇文章中,我们介绍了如何安装 ChaosBlade Operator,并进行了简单的使用。从本章开始,所有的实践章节,都会有配套的 katacode[1] 交互式教程,读者可用通过 katacode,在浏览器上操作真实的 Kubernetes 和 ChaosBlade。
郭旭东
2020/12/30
1.5K0
ChaosBlade:从零开始的混沌工程(三)
在CVM上模拟VPC网络故障原理笔记
日常在给客户做稳定性治理时,像实例级别的不可用、主从切换、重启、性能等维度的场景做的比较多,随着治理的深入,大家慢慢把目光专项应用程序更不可控的场景:网络数据包异常。
AIOPS
2023/09/30
2980
ChaosBlade:从零开始的混沌工程(五)
在上篇文章中,我们介绍了如何使用 ChaosBlade Operator 对 node 资源进行混沌实验。从本章将继续对 Kubernetes Container 资源的混沌实验进行讲解,同时也配套了 katacode[1] 交互式教程,读者可用通过 katacode,在浏览器上操作真实的 Kubernetes 和 ChaosBlade,同时本篇也是系列文章的倒数第二篇,实践内容的最后一篇。
郭旭东
2020/12/30
1.3K0
ChaosBlade:从零开始的混沌工程(五)
混沌工程工具:chaos-mesh在服务器上注入项原理分析(2)
上篇文章,总体上分析了chaosmesh和chaosblade两个工具的对比和原理,本文继续分析chaosmesh的原理;几个常用的项dnsChaos、stressChaos、NetworkChaos和IOChaos注入项的原理。
AIOPS
2023/10/02
1.2K0
Linux高级流量控制tc使用
在做MHA测试的时候,有一个重要的环节就是测试MHA Manager节点和Master节点的网络情况,如果产生了抖动,那么MHA本身提供了一个参数secondary_check来保证,但是如果你的部署环境中是一主一从的话,这个参数就不会起作用了,因为latest slave和oldest slave是同一个库,简单来说,连不上就是连不上了,至于切还是不切,这个还不好说。我们测试的场景下,有时候切,有时候不切。所以我们原本测试的MHA0.57版本就降级为了0.56,仔细测试发现,其实也存在这样的问题,综合再三
jeanron100
2018/03/22
4.6K0
【混沌工程】 docker环境下模拟网络延迟和丢包
原文地址:https://www.chenquan.me/archives/315
保持热爱奔赴山海
2020/04/17
3.4K0
learning :network simulator plugin
Vpp 包括一个功能相当强大的网络模拟器插件,它可以模拟网络端到端的延迟往返时间和配置的网络丢包率及报文乱序功能。它非常适合在指定的延迟、带宽、丢包、乱序条件下评估 TCP 堆栈的性能。此功能和Linux系统下使用 tc 和 netem命令组合模拟客户环境网络波动情况一样:
dpdk-vpp源码解读
2023/06/23
3140
learning :network simulator plugin
混沌工程之ChaosMesh使用之一模拟CPU使用率
今天来玩一下混沌工程的开源工具之一的ChaosMesh。ChaosMesh的目标是要做一个通用的混沌测试工具。
高楼Zee
2021/07/14
1.1K0
Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中
本文将介绍如何在 GitHub Actions 的 workflow 中使用 Chaos Mesh,从而将混沌工程集成到系统开发的 CI 中。
PingCAP
2020/08/21
6270
Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中
linux下使用tc控制和模拟网络流量
netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。
sunsky
2021/01/13
4.8K0
Docker 网络 host、bridge、macvlan 工作原理
Docker 作为容器的主流平台,不仅仅提供了虚拟化隔离,同时也配备的网络隔离技术,并使用不同的网络驱动满足不同的场景,这篇文章对 Docker 的3种网络实现Host、Bridge、Macvlan进行模拟验证,并在实践中理解背后的基本原理。
我的小碗汤
2020/01/13
3.4K0
Docker 网络 host、bridge、macvlan 工作原理
从Linux network namespace 认识 Docker 网络模型
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2024/02/26
3700
从Linux network namespace 认识 Docker 网络模型
K8s面试系列: Flannel VS Calico 基于 L2 与 L3 的 CNI 之战(一)
在童年期,我们更多是处于认知,而不是意欲的状态。—— 《作为意欲和表象的世界》第二卷第三十一章
山河已无恙
2025/02/25
1250
K8s面试系列: Flannel VS Calico 基于 L2 与 L3 的 CNI 之战(一)
Docker桥接网络分析
使用ip link查看本机网卡列表,可以发现宿主机存在一个名为docker0的虚拟网桥,且虚拟网桥下有四对虚拟网卡分别对应 debian、halo、redis、mysql四个docker容器。
敲得码黛
2024/06/12
1520
Docker桥接网络分析
Linux network namespace 多端通信(经典容器组网 veth pair + bridge 模式认知)
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/02/26
3550
Linux network namespace 多端通信(经典容器组网 veth pair + bridge 模式认知)
探究网络延迟对事务的影响
GreatSQL社区
2024/04/11
1620
探究网络延迟对事务的影响
混沌工程工具:Chaos-mesh与Chaosblade技术实现与原理分析(1)
随着云计算的广泛普及和云原生实践,越来越多的公司开始将目光投向云上的稳定性治理。混沌工程的概念最早来自Netflix,并且在NF取得成功,证明了混沌工程在云计算中扮演关键角色,通过有计划地引入故障和不稳定性,确保系统的健壮性和可靠性,使组织能够充分利用云计算的优势,并实现高质量的应用交付。
AIOPS
2023/10/01
4.1K0
推荐阅读
相关推荐
混沌工程之ChaosMesh使用之四模拟网络Duplicate包
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档