VNPY 免费用ADX规则增加策略收益,一键给策略加上趋势过滤器
海龟法则中的趋势过滤器是一个很重用的交易思想。
VNPY3.8 增加了策略过滤规则功能, 策略过滤规则功能使得趋势过滤器可以独立于策略存在
所有交易策略,都无需再策略中开发过滤器,只需要制定开平仓的过滤器规则文件即可生效。
最多可以设置6组策略过滤规则,包括开仓3组规则,平仓3组规则。
可以和策略进行条件叠加。
VNPY3.8 的测量过滤规则功能,支持量化回测,也支持实盘。
过滤规则存储在项目strategyfilterfile目录下,目前默认提供了2组规则DEMO
(1)时间过滤规则
(2) ADX指标过滤规则
海龟法则中的趋势过滤器是一个很重用的交易思想。
VNPY3.8 增加了策略过滤规则功能, 策略过滤规则功能使得趋势过滤器可以独立于策略存在
所有交易策略,都无需再策略中开发过滤器,只需要制定开平仓的过滤器规则文件即可生效。
所有交易策略,都无需再策略中开发过滤器,只需要制定开平仓的过滤器规则文件即可生效。
最多可以设置6组策略过滤规则,包括开仓3组规则,平仓3组规则。
可以和策略进行条件叠加。
VNPY3.8 的测量过滤规则功能,支持量化回测,也支持实盘。
过滤规则存储在项目strategyfilterfile目录下,目前默认提供了2组规则DEMO
(1)时间过滤规则
(2) ADX指标过滤规则
基于ADX>25的趋势过滤器规则文件的代码如下:
# ADX规则 import talib from PyQt5 import QtCore # CTP行情库 from vnctpmd import * import numpy as np import globalvar import numba as nb class MyFilter(): def __init__(self, period): self.period = period self.high = [] self.low = [] self.close = [] # 由于实盘是Tick驱动,所以实盘直接调用OnFilterByTick,分2种情况: # (1)OnFilter(self, mddata, type)方法,参数type=True 时,调用OnFilterByBar获得返回值True或False,适合非TICK级回测 # (2)OnFilter(self, mddata, type)方法,参数type=False 时,基于Tick级过滤规则,适合基于Tick回调的实盘 # 返回值:True(设“且”时,不过滤交易信号),False(设“且”时,过滤交易信号) # 调用OnFilter的有2处: # (1)回测模块 module_backtest.py 文件中 ,由 CalFilter(self, flist, kline, id)方法实现触发OnFilter(self,mddata,True) # (2)策略管理模块module_strategy.py文件中,由CalFilter(self, flist, kline, id)方法实现触发OnFilter(self,mddata,False) def OnFilter(self, mddata, type): if type: # 非Tick级(一般是M1周期及以上K线量化回测) # OnFilter(self, mddata, type)的参数mddata数据结构和OnFilterByBar(self, mddata)的mddata参数类型一致 # 量化回测module_backtest.py的CalFilter,可直接触发OnFilterByBar return self.OnFilterByBar(mddata) else: # Tick级,分2种情况(1)直接撰写TICK级规则代码 (2)为减少计算,每K线周期只计算一次OnFilterByBar(self, mddata) return self.OnFilterByTick(globalvar.md.GetKline(mddata.InstrumentID, 0)) # mddata = globalvar.md.GetKline(mddata.InstrumentID, 0)[0].Close) def OnFilterByTick(self, mddata): # Tick级,选(2)为减少计算,每K线周期只计算一次OnFilterByBar(self, mddata) # mddata = globalvar.md.GetKline(mddata.InstrumentID, 0)[0].Close) return self.OnFilterByBar(mddata) # 量化回测默认是基于M1及以上级别 # 对于回测数据是M1以上级别数据,即非Tick级规则,直接调用OnFilterByBar方法即可 def OnFilterByBar(self, mddata): # if mddata=="": # mddata = globalvar.md.GetKline(mddata.InstrumentID, 0)[0].Close) # klinetime = klinedata.klinetime.decode() self.InstrumentID = mddata.InstrumentID.decode() self.high.append(float(mddata.high)) self.low.append(float(mddata.low)) self.close.append(float(mddata.close)) try: float_high = [float(x) for x in self.high] float_low = [float(x) for x in self.low] float_close = [float(x) for x in self.close] except Exception as e: print('OnFilter error:%s [%d]' % (e, id)) adx = talib.ADX(np.array(float_high), np.array(float_low), np.array(float_close), 14) thisadx = adx[len(adx) - 1] # ADX帮助交易员确认趋势强度,一般在其大于25时进行趋势交易策略,低于25则避免趋势交易策略。 # ADX描述的是趋势的强弱,而非趋势。使用者容易将ADX下降误以为趋势反转,其实只是趋势强度降低,但是趋势尚在。 if thisadx > 25: return True else: return False

浙公网安备 33010602011771号