专栏首页维恩的派VNPIE如何用vn.py做隔夜交易?

如何用vn.py做隔夜交易?

本文提供了一个每个交易日开盘前不用重连CTP的方法。如果不是特殊需求,强烈建议每天盘前重启程序。感谢viponedream在维恩的派论坛里的分享!

设计初衷

针对懒人,打算挂上去就不管它,让它自己运行,一个星期,一个月,甚至更久。

设计思路

主要需要解决以下几个问题:

1. 定时连接CTP。在uiMainWindow.py中的 updateStatusBar中,增加时间判断,到点了自动重连CTP。

# 计时器 # 晚上21:00是夜盘时间,提前20分钟连接 CTP dt = datetime.now() if dt.hour == 20 or dt.hour == 8: if dt.minute == 40 and dt.second == 0: self.connectCtp()

2. 历史持仓,即以前的老仓位。策略一开始要不要处理老仓位?如果只管策略自己开的那些仓位,这样中途停机会造成问题,所以还是把老仓位一起赋给策略吧。有人是把历史仓位存在一个文件中。我觉得没什么必要(不是单品种多策略的话)。直接在策略中onPosition中读取历史持仓了。(要先在ctaEngine中增加一个处理函数,把onPosition推到相应的策略去)

def onPosition(self, pos):

# 还没有开过仓,或,还没有获取历史仓位

if self.isPrePosHaved or self.isAlreadyTraded:

return elif pos.position != 0: if pos.direction == DIRECTION_LONG: self.pos = pos.position else: self.pos = -pos.position self.lastEntryPrice = pos.price self.isPrePosHaved = True print (u'{0} {1} 历史持仓 {2} 开仓均价{3}'.format(datetime.now(), self.vtSymbol, self.pos, pos.price)) pass

3. 今仓,昨仓重置。原来的系统是日内的,碰到换日就会出错,所以要重置一下。这个要修改几个地方:

1)CtpTdApi中的 init:

# 缓存持仓数据的字典

self.posBufferDict = {}

# 保存合约代码和交易所的印射关系

self.symbolExchangeDict = {}

# 保存合约代码和合约大小的印射关系

self.symbolSizeDict = {} # 缓存SHFE持仓数据的字典

self.posBufferDictShfe = {}

2)ctpGateway.py修改回调函数:

def onRspQryInvestorPosition(self, data, error, n, last): """持仓查询回报"""

# 更新持仓缓存,并获取VT系统中持仓对象的返回值 exchange = self.symbolExchangeDict.get(data['InstrumentID'], EXCHANGE_UNKNOWN) size = self.symbolSizeDict.get(data['InstrumentID'], 1) # 获取缓存字典中的持仓缓存,若无则创建并初始化 positionName = '.'.join([data['InstrumentID'], data['PosiDirection']]) if exchange == EXCHANGE_SHFE:

#上期所的专门一个 dict

if positionName in self.posBufferDictShfe: posBuffer = self.posBufferDictShfe[positionName] else: posBuffer = PositionBuffer(data, self.gatewayName) self.posBufferDictShfe[positionName] = posBuffer else:

# 其它交易所 if positionName in self.posBufferDict: posBuffer = self.posBufferDict[positionName] else: posBuffer = PositionBuffer(data, self.gatewayName) self.posBufferDict[positionName] = posBuffer

# 缓存持仓信息,上期所的只有最后一个才全部返回持仓信息 ,其它交易所直接返回 if exchange == EXCHANGE_SHFE:

posBuffer.updateShfeBuffer(data, size) if last: for positionName in self.posBufferDictShfe: pos = self.posBufferDictShfe[positionName].pos self.gateway.onPosition(pos) self.posBufferDictShfe = {} else: pos = posBuffer.updateBuffer(data, size) self.gateway.onPosition(pos)

3)在ctaEngine中增加两个事件处理函数。

def registerEvent(self): # 加上以下两个 self.eventEngine.register(EVENT_POSITION, self.processExchangePositionEvent) self.eventEngine.register(EVENT_TIMER, self.onTimer)

def onTimer(self, event): dt = datetime.now() if dt.hour == 21 and dt.minute==0 and dt.second==1:

# 夜盘开盘第一时间重置,清空则默认使用平昨

self.posBufferDict = {} if self.tickStrategyDict: for key in self.tickStrategyDict: for strategy in self.tickStrategyDict[key]: strategy.onTimer() pass

def processExchangePositionEvent(self, event): pos = event.dict_['data'] if pos.vtSymbol in self.tickStrategyDict: for strategy in self.tickStrategyDict[pos.vtSymbol]: if pos.direction == DIRECTION_LONG: strategy.exchangePos = pos.position else: strategy.exchangePos = -pos.position strategy.onPosition(pos)

以上修改,策略已经可以连续跑起来了。

强调的是:一个品种只能一个策略,并且只能单方向,不能同时有多和有空。

基于python的开源交易平台开发框架。截止目前,vn.py项目在Github上的Star已经达到5787,量化交易类开源项目第1,量化类项目第3(1、2依旧分别是Zipline和TuShare)。

项目官网:http://www.vnpy.org

论坛地址:www.vnpie.com

知乎专栏:https://zhuanlan.zhihu.com/vn-py

Developed by Traders,

for Traders

本文分享自微信公众号 - 维恩的派VNPIE(vn-pie)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vn.py入门-低买高卖示例

    本文用一个例子来介绍vnpy的用法。从项目创建开始,到一个简单策略的设计。 这个例子连接到CTP接口,每秒检查一下目标合约的价格,若低于指定价格则买入,若高于指...

    用Python的交易员
  • R-Breaker策略

    本文提供了一个用vn.py来编写R-breaker交易策略的示例。只提供一个参考模板,并不能直接进入市场进行交易。感谢‘爱谁谁’在维恩的派论坛里的分享!

    用Python的交易员
  • CTP接口入门

    本文主要面向有C++基础,并且想用C++来做程序化交易的用户。 主要介绍了CTP的简单使用方式以及在使用过程中易遇到的‘坑’,并附上一些代码帮助学习。

    用Python的交易员
  • 用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作...

    sergiojune
  • python实现opencv+scoket网络实时图传

    本文实例为大家分享了python实现opencv+scoket网络实时图传的具体代码,供大家参考,具体内容如下

    砸漏
  • Pyqt 主窗口(QMainWindow)简介

    下面我写了一个简单的例子,只实现了极少数的功能,仅供参考。后续会详细介绍主窗口(QMainWindow)程序各个部分的写法。推荐在浏览器中打开并横屏查看代码。

    用户6021899
  • python pyqt5 matplotlib绘图

    import sys import random import matplotlib

    用户5760343
  • python日志

    py3study
  • 利用Python编写一个行业专用的小计算器

    前言:本文讲述的是如何利用python编程制作一个适用于指定行业的计算器,方便计算结果,涵盖的知识点由Python编写GUI界面程序,利用爬虫采集实时的汇率数据...

    用户7886150
  • python pyqt5 窗体动画效果

    import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui ...

    用户5760343

扫码关注云+社区

领取腾讯云代金券