VNPY中,大多策略都是基于bar分钟级别;国内tick是一秒两笔,频率不算太高。这里尝试做了一个Tick基本准高频交易策略,只是为了实现思路。可以回测,不要直接用。。

回测时候记得把回测模式改为TICK_MODE, 数据库改为TICK_DB_NAME,还有setStartDate时候initdays设为0,不需要回读历史天数,只需要当天数据; 另外TICK回测超过一天系统就报错内存不够, 所以最好一天就够。

还有,把

currentTime改为开盘时间, 因为策略只在开盘时间运行,收盘前会自动平仓。

入场:

每次读

Tick

,分析过去

10

tick

的的总计,如果买量大于卖量,开多单

;反之空单

下单价格是当前tick市价;

止损:下单同时开反向2个价位的阻止单;

离场:下次TICK读取时候,如果已经是买入价格正向3个点,再次判断买卖量比,如果已经不符合,市价卖出;如果还是符合原来量比就极小持有,清掉之前阻止单,改挂当前价位反向2个点阻止单。

7

-24

更新,具体代码更新等验证后更新:

更改

stoporder

止损单为

limit order

限价单,这样更为快速;放在

ontrade()

,一旦主动交易确认发生后,发出这个止损

limit order

onorder()

加入,一旦发现发出交易没有完成,还在挂单,取消

新增一个类全局变量级别的锁,当有

order

挂单或者没有

order

发出单没有返回信息时候,这个锁关闭,不再开新单;避免多个单同时阻塞。

# encoding: UTF-8

from __future__ import division

from vnpy.trader.vtGateway import *

from datetime import datetime, time

from vnpy.trader.vtObject import VtBarData

from vnpy.trader.vtConstant import EMPTY_STRING

from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate,

BarGenerator,

ArrayManager,

TickArrayManager)

########################################################################

class TickOneStrategy(CtaTemplate):

"""基于Tick的交易策略"""

className = 'TickOneStrategy'

author = u'BillyZhang'

# 策略参数

fixedSize = 1

Ticksize = 10

initDays = 0

DAY_START = time(9, 00) # 日盘启动和停止时间

DAY_END = time(14, 58)

NIGHT_START = time(21, 00) # 夜盘启动和停止时间

NIGHT_END = time(10, 58)

# 策略变量

posPrice = 0 # 持仓价格

pos = 0 # 持仓数量

# 参数列表,保存了参数的名称

paramList = ['name',

'className',

'author',

'vtSymbol',

'initDays',

'Ticksize',

'fixedSize'

]

# 变量列表,保存了变量的名称

varList = ['inited',

'trading',

'pos',

'posPrice'

]

# 同步列表,保存了需要保存到数据库的变量名称

syncList = ['pos',

'posPrice',

'intraTradeHigh',

'intraTradeLow']

# ----------------------------------------------------------------------

def __init__(self, ctaEngine, setting):

"""Constructor"""

super(TickOneStrategy, self).__init__(ctaEngine, setting)

#创建Array队列

self.tickArray = TickArrayManager(self.Ticksize)

# ----------------------------------------------------------------------

def onminBarClose(self, bar):

""""""

# ----------------------------------------------------------------------

def onInit(self):

"""初始化策略(必须由用户继承实现)"""

self.writeCtaLog(u'%s策略初始化' % self.name)

#tick级别交易,不需要过往历史数据

self.putEvent()

# ----------------------------------------------------------------------

def onStart(self):

"""启动策略(必须由用户继承实现)"""

self.writeCtaLog(u'%s策略启动' % self.name)

self.putEvent()

# ----------------------------------------------------------------------

def onStop(self):

"""停止策略(必须由用户继承实现)"""

self.writeCtaLog(u'%s策略停止' % self.name)

self.putEvent()

# ----------------------------------------------------------------------

def onTick(self, tick):

"""收到行情TICK推送(必须由用户继承实现)"""

currentTime = datetime.now().time()

# 平当日仓位, 如果当前时间是结束前日盘15点28分钟,或者夜盘10点58分钟,如果有持仓,平仓。

if ((currentTime >= self.DAY_START and currentTime <= self.DAY_END) or

(currentTime >= self.NIGHT_START and currentTime <= self.NIGHT_END)):

TA = self.tickArray

TA.updateTick(tick)

if not TA.inited:

return

if self.pos == 0:

# 如果空仓,分析过去10个对比,ask卖方多下空单,bid买方多下多单,并防止两个差价阻止单

if TA.askBidVolumeDif() > 0:

self.short(tick.lastPrice, self.fixedSize, False)

self.cover(tick.lastPrice + 2,self.fixedSize, True)

elif TA.askBidVolumeDif() < 0:

self.buy(tick.lastPrice, self.fixedSize, False)

self.sell(tick.lastPrice - 2, self.fixedSize, True)

elif self.pos > 0:

# 如果持有多单,如果已经是买入价格正向N3个点,再次判断趋势,如果已经不符合,市价卖出。如果持有,清掉之前阻止单,改挂当前价位反向2个点阻止单。

if tick.lastprice - self.posPrice >= 3:

if TA.askBidVolumeDif() < 0:

self.cancelAll()

self.sell(tick.lastPrice - 2, self.fixedSize, True)

else:

self.cancelAll()

self.sell(tick.lastPrice, self.fixedSize, False)

elif self.pos < 0:

# 如果持有空单,如果已经是买入价格反向N3个点,再次判断趋势,如果已经不符合,市价卖出。如果持有,清掉之前阻止单,改挂当前价位反向2个点阻止单。

if tick.lastPrice - self.posPrice <= -3:

if TA.askBidVolumeDif() > 0:

self.cancelAll()

self.cover(tick.lastPrice + 2, self.fixedSize, True)

else:

self.cancelAll()

self.cover(tick.lastPrice, self.fixedSize, False)

else:

if self.pos > 0:

self.sell(tick.close, abs(self.pos),False)

elif self.pos < 0:

self.cover(tick.close, abs(self.pos),False)

elif self.pos == 0:

return

# ----------------------------------------------------------------------

def onBar(self, bar):

"""收到Bar推送(必须由用户继承实现)"""

# ----------------------------------------------------------------------

def onXminBar(self, bar):

"""收到X分钟K线"""

# ----------------------------------------------------------------------

def onOrder(self, order):

"""收到委托变化推送(必须由用户继承实现)"""

pass

# ----------------------------------------------------------------------

def onTrade(self, trade):

self.posPrice = trade.price

# 同步数据到数据库

self.saveSyncData()

# 发出状态更新事件

self.putEvent()

# ----------------------------------------------------------------------

def onStopOrder(self, so):

"""停止单推送"""

pass

CTAtemplate 加入新类TickArrayManager

########################################################################

class TickArrayManager(object):

"""

Tick序列管理工具,负责:

1. Tick时间序列的维护

2. 常用技术指标的计算

"""

# ----------------------------------------------------------------------

def __init__(self, size=10):

"""Constructor"""

self.count = 0 # 缓存计数

self.size = size # 缓存大小

self.inited = False # True if count>=size

self.TicklastPriceArray = np.zeros(self.size)

self.TickaskVolume1Array = np.zeros(self.size)

self.TickbidVolume1Array = np.zeros(self.size)

self.TickaskPrice1Array = np.zeros(self.size)

self.TickbidPrice1Array = np.zeros(self.size)

self.TickopenInterestArray = np.zeros(self.size)

self.TickvolumeArray = np.zeros(self.size)

# ----------------------------------------------------------------------

def updateTick(self, tick):

"""更新tick Array"""

self.count += 1

if not self.inited and self.count >= self.size:

self.inited = True

self.TicklastPriceArray[0:self.size - 1] = self.TicklastPriceArray[1:self.size]

self.TickaskVolume1Array[0:self.size - 1] = self.TickaskVolume1Array[1:self.size]

self.TickbidVolume1Array[0:self.size - 1] = self.TickbidVolume1Array[1:self.size]

self.TickaskPrice1Array[0:self.size - 1] = self.TickaskPrice1Array[1:self.size]

self.TickbidPrice1Array[0:self.size - 1] = self.TickbidPrice1Array[1:self.size]

self.TickopenInterestArray[0:self.size - 1] = self.TickopenInterestArray[1:self.size]

self.TickvolumeArray[0:self.size - 1] = self.TickvolumeArray[1:self.size]

self.TicklastPriceArray[-1] = tick.lastPrice

self.TickaskVolume1Array[-1] = tick.askVolume1

self.TickbidVolume1Array[-1] = tick.bidVolume1

self.TickaskPrice1Array[-1] = tick.askPrice1

self.TickbidPrice1Array[-1] = tick.bidPrice1

self.TickopenInterestArray[-1] = tick.openInterest

self.TickvolumeArray[-1] = tick.volume

def askBidVolumeDif(self):

return (self.TickaskPrice1Array.sum() - self.TickbidVolume1Array.sum())

python高频交易策略_VNPY中 Tick级别准高频交易简单策略相关推荐

  1. Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)

    以下是博主认为的对self讲解得比较透彻又简洁明了的资料. 上面的资料把这个问题说得简单明了,大家认真看一遍相信就对self有个深入的了解了. 总结一下: 在Python为面向对象编程中,成员函数被调 ...

  2. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...

  3. 动量策略 python_在Python中使用动量通道进行交易

    动量策略 python Most traders use Bollinger Bands. However, price is not normally distributed. That's why ...

  4. 高频交易(二)浅谈高频交易中比较成熟的一些交易策略

    今天我们谈谈高频交易中比较成熟的一些交易策略,应用于数字货币市场. 引言: 高频交易是自动化交易的一种形式,以速度见长,利用计算机系统加入人工智能算法,以智能化方式,快速,稳健的短线持仓执行交易.其中 ...

  5. python量化交易用在mt4_如何在MT4上进行tick级别测试

    对策略进行历史数据的回测和优化,是完成一个策略最后的几个步骤,而数据质量的好坏直接影响了测试的准确度,在外汇市场上最流畅的MT4软件,本身可以提供一段时间内的历史数据下载,如下图,我们可以选择数据的时 ...

  6. 为何高频交易在期货交易中深受异议

    高频交易,说白了就是说这种每一次交易的间隔时间都极其简短,通常为十多分钟乃至几秒.最开始出現于上新世纪90时代末,现阶段早已发展趋势成外汇交易市场的关键能量.但近些年高频交易备受异议,金融机构.外汇交 ...

  7. Python量化交易实战-38使用开源项目回测双均线策略

    B站配套视频教程观看 使用PyAlgoTrade回测双均线策略 双均线策略:长短周期均线,通过金叉,死叉的方式买入卖出股票,获取收益的策略. 回顾上节课代码的部分,上节课完成了可视化代码的部分, 主要 ...

  8. python量化交易:Joinquant_量化交易基础【六】:循环与多股票策略

    本文是量化交易零基础入门教程的第六篇. 摘要 学习用list存储多个股票 学习使用for循环 学习写一个简单的多股票策略 自测与自学 我们继续以如下这个简单的策略为例进行学习在策略中操作多个股票. d ...

  9. python用途适合做什么生意-PureQuant数字货币量化交易程序化交易python量化开源框架...

    什么是量化交易 量化交易起源于上世纪七十年代的股票市场,是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式.量化交易从庞大的历史数据中海选能够带来超额收益的多种"大概率& ...

最新文章

  1. SVN版本管理系统的安装 CentOS + Subversion + Apache + Jsvnadmin
  2. vue插槽样式_vue 插槽简介及使用示例
  3. 因果推断研究获2021诺贝尔经济学奖,图灵奖得主Judea Pearl祝贺并反对
  4. LiveQing全新升级的RTMP流媒体服务器支持HLS(m3u8)、RTMP、HTTP-FLV高性能分发
  5. Python学习之函数及流程控制
  6. python 列表 元组 字符串
  7. makefile与stm32工程皮毛了解
  8. git基础管理--操作远程仓库
  9. mybatis plus使用in查询
  10. Android/Linux线程死锁demo分析
  11. opencv 写视频时找不到编码器问题解决方法
  12. [python] 解决OSError: Address already in use
  13. AD smart pdf 中文丢失
  14. python去除图片上的文字_python读取图片里面的文字
  15. CMY和CMYK彩色模型
  16. java爬虫入门第二弹——通过URL下载图片(以下载百度logo为例)
  17. php 修改pdf文件内容,pdf中怎么擦掉某些内容
  18. Scala中的fold和reduce理解
  19. linux卸载飞行模式驱动,解决:Ubuntu飞行模式 使用硬件开关关闭
  20. 使用win10自带功能,横屏、竖屏显示器分别设置壁纸

热门文章

  1. 【鸡汤里面的干货】农村娃娃毕业不到四年在深圳核心地段安家置业的背后是什么在支撑?
  2. case when和COALESCE
  3. keil5写入程序时显示Error.Flash Download failed -‘CortexM4’
  4. unity2D横板游戏教程6-敌人AI以及受击动画
  5. react项目中引入echarts图表
  6. 掌财社:全面注册制的影响有哪些?
  7. AI人工智能学习路径图
  8. DHS与DSL,让生产环境更可靠
  9. activiti流程--委派,转办,会签,挂起,激活
  10. mathtype 修改公式 章节号 和编号