您当前的位置: 首页 >  算法

松鼠宽客

暂无认证

  • 2浏览

    0关注

    108博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

松鼠宽客 发布时间:2022-02-15 11:13:48 ,浏览量:2

 致力于分享量化策略,培训视频,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

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

关注
打赏
1662429881
查看更多评论
立即登录/注册

微信扫码登录

0.0391s