算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

松鼠宽客
2021-03-30

公众号致力于分享量化策略,培训视频,Python,算法研究等相关内容。



『正文』

ˇ



大家好,我是乌克兰剑圣。本季度最后一个策略,我们来写一个跨周期模型。

除了可以自动交易,也显示出了指标线为做手工交易时提供参考。


策略源码


策略由MACD和HalfTrend俩个交易原理构成。HalfTrend是作为小周期的交易逻辑,MACD做为跨周期交易逻辑。本身这些逻辑很好理解,没什么难度。就是写起来麻烦一点,出场这一块我们借鉴【SF24】| 海龟交易策略的“宽窄”改进版 里的出场模块。发现这个模块还是挺好用的,有兴趣的朋友可以看看。


HalfTrend交易逻辑


HalfTrend这个写法其实就是类似SuperTrend("超级趋势线"),我们再老策略【SF14】| Supertrend“超级趋势线”指标魔改升级(源码) 这里面已经写过了。

我观察了一下它们俩个还是略有不同,我们来看原版的代码。


var int trend = 0var int nextTrend = 0var float maxLowPrice = nz(low[1], low)var float minHighPrice = nz(high[1], high)
var float up = 0.0var float down = 0.0float atrHigh = 0.0float atrLow = 0.0float arrowUp = nafloat arrowDown = na
atr2 = atr(100) / 2dev = channelDeviation * atr2
highPrice = high[abs(highestbars(amplitude))]lowPrice = low[abs(lowestbars(amplitude))]highma = sma(high, amplitude)lowma = sma(low, amplitude)
if nextTrend == 1   maxLowPrice := max(lowPrice, maxLowPrice)
  if highma < maxLowPrice and close < nz(low[1], low)    trend := 1    nextTrend := 0    minHighPrice := highPriceelse   minHighPrice := min(highPrice, minHighPrice)
  if lowma > minHighPrice and close > nz(high[1], high)    trend := 0    nextTrend := 1    maxLowPrice := lowPrice
if trend == 0   if not na(trend[1]) and trend[1] != 0    up := na(down[1]) ? down : down[1]    arrowUp := up - atr2   else    up := na(up[1]) ? maxLowPrice : max(maxLowPrice, up[1])   atrHigh := up + dev   atrLow := up - develse   if not na(trend[1]) and trend[1] != 1     down := na(up[1]) ? up : up[1]    arrowDown := down + atr2   else    down := na(down[1]) ? minHighPrice : min(minHighPrice, down[1])   atrHigh := down + dev   atrLow := down - dev
ht = trend == 0 ? up : down


区别就是HalfTrend这里面计算了回溯高低点和SMA均线


效果如下图



转编译到TB和VNPY效果如下图




一眼看过去,作为指标其实还是挺好看。但是这些指标如果写成具体的交易信号绩效可能并不太理想,交易次数比较频繁的,测试下来损耗太高。这就是指标改造策略会产生一个主观落差。因此要改造这个策略,从俩个角度出发。

  1. 过滤

  2. 出场


MACD跨周期过滤


跨周期函数


Params        Numeric nMinSet(3);        NumericSeries Price(10);        Numeric Length(10);Vars        NumericSeries MinsBarIndex;        BoolSeries FirstMin(True);
        Numeric sFcactor;        NumericSeries XAvgValue;Begin        If(CurrentBar == 0)        {                FirstMin = True;        }Else        {                FirstMin = FirstMin[1];                If(FirstMin && IntPart(Minute/nMinSet) != IntPart(Minute[CurrentBar]/nMinSet))        {                        FirstMin = False;                }        }
        If(IntPart(Minute%nMinSet)==0)        {                MinsBarIndex = 1;        }Else        {                MinsBarIndex = MinsBarIndex[1] + 1;        }
        sFcactor = 2 / ( Length + 1 );        if (FirstMin)        {                XAvgValue = Price;        }else        {                XAvgValue = XAvgValue[MinsBarIndex] + sFcactor * ( Price - XAvgValue[MinsBarIndex] ) ;        }                Return XAvgValue;End


这个是TB的用户函数,主要是计算EMA跨周期均线,TB论坛很早的写法。


跨周期写好之后,效果如下:

这一段趋势走的并不流畅,一步俩回头。如果不跨周期过滤的话,其实损耗下来也赚不到什么钱的。HalfTrend+MACD+跨周期均线这三个原理结合以后,我很担心过滤过度造成信号较少,但是结果来看还是不错的,主要趋势抓住了。



“宽窄”移动出场


我们知道,海龟的初始开仓分为短周期开仓和长周期开仓,这里我们默认只用短周期开仓,关于长周期的那个区间我们当作调节出场参数的滤波器来使用吧。


思路:长周期和短周期区间本身就是波动幅度变化的动态指标,持有仓位时如果价格在短区间内波动,使用默认出场参数。如果突破了长周期,说明波动率开始放大了,这个时候我们开始调节收敛参数,保住利润。因为开仓条件简单,在趋势中即使止盈出场,也有很多机会再次加入趋势。有些模型在趋势中的交易次数太少,一旦踏空可能2,3个月没有信号。趋势拿的稳固然没错,但是交易信号太少,可操作性不大,波段循环操作更为合理一点。


      Dcond_outTrs=CrossOver(C[1],fsDonchianHi[1]);      Commentary("fsDonchianHi="+Text(fsDonchianHi));      If(Dcond_outTrs and SendOrderThisBar==True)      {        out_range=TRS*XX;        SendOrderThisBar=False;      }


黄色部分是在短周期区间内的状态,红色部分是突破了长周期区间后的加速。


总结


策略思路和算法中规中矩,将俩个原理结合之后还是有一些意外惊喜,这个策略迭代容易,且参数较少。代码普适性较强,适用于商品和股指。

同时,也可以作为指标参考辅助手工交易。提供了TB旗舰版,TBQ,VNPY三个版本的源码。感兴趣的小伙伴拿到源码后,可以在群里或者微信我交流,想想如何继续优化改进。


源码与工作区压缩包



品种绩效2018年至今(实盘成本):


动力煤



铁矿


焦炭


PP


螺纹


纯碱


尿素


EG


EB


白银



苹果




股指


IF


IC


IH


本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。



End


咨询详情



长按下方二维码

加客服“小松鼠-松鼠宽客”
微信号: viquant01

对话框回复 MT 咨询源码领取

(俱乐部加入→回复VIP)

加入松鼠俱乐部




----------------往期精彩内容----------------


算法策略专辑:

6.【算法策略】基于残差动量的横截面期货交易策略

5.【算法策略】商品统计套利之趋势套利策略

4.【算法策略】傅里叶滤波结合跨周期波段模型

3.【日内模型】TBquant信号回测版本+python历史回测版源码

2.【日内模型】第二版本基于orderflow的盘口策略(完整源码)

1.【日内模型】基于orderflow的盘口策略开发帖

量化视频专辑:

视频教程 | 手把手系列之"Aberration"策略的优化与升级

视频教程 | 手把手系列之"震荡过滤"突破策略的优化与实现

量化研究专栏:

量化研究 | 来聊一下量化交易的人工干预、参数失效、筛选品种

量化研究 | 残差动量策略刻画与构建(二)

量化研究 | 残差动量策略刻画与构建(一)

量化研究 | 主连复权算法大揭秘[含公式算法]

量化研究 | 策略在指数与主连复权的差异化分析(三)

量化研究 | 策略在指数与主连复权的差异化分析(二)

量化研究 | 策略在指数与主连复权的差异化分析(一)

精品自动交易策略库(近期更新):
【SF28】| 股指“三缺一”策略,2多1空组合方式

【SF27】 | 如何开发一个日内交易模型

【SF26】| 适用于商品+股指的枢轴点趋势策略
【SF25】|日内交易策略开发(一)黄金日内交易模型

【SF24】| 海龟交易策略的“宽窄”改进版

【SF23】| 朴实无华的Dual Thrust策略长期保持正期望收益
【SF22】| 来给你的交易策略加一个"变速箱",五挡起步那种

【SF21】| 利用PSY指标,我们来开发一个短线模型?

【SF20】| 来聊聊平仓离场的方法,如何构建高效,灵活,可靠的出场策略?

【SF19】| 基于VWAP(成交量加权平均价格)开发Alpha均线增强策略

【SF18】| MACD顶底背离+动态区间交易模型源码(技术贴)

【SF17】| 均线波动差构建交易策略

【SF16】| "凹凸"均线形态交易策略源码(技术帖)

【SF15】| 波峰波谷交易策略结合ER降噪过滤

【SF14】| Supertrend“超级趋势线”指标魔改升级(源码)
【SF13】| 实盘策略解密“小品种,小资金”在跑策略源码!

【SF12】| 全新波动率算法,自适应区间+波动率择时!

【SF11】| 成交量来确定阻力支撑点,基于Volume Profile构建交易策略

【SF10】| 如何构建一个胜率超过60%的短线螺纹策略(开发教程)

【SF09】| 资金流向交易策略源码,绩效突出,适应性兼容性强,5分钟交易模型;
【SF08】| 经典KD指标另类使用有奇效,股指商品双版本策略





祝点击在看的小伙伴,2021账户长虹







分享