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

 


 

t34.png
posted @ 2022-04-03 17:29  sktch  阅读(240)  评论(0)    收藏  举报