致力于分享量化策略,培训视频,Python,算法研究等相关内容。
大家好,我是乌克兰剑圣。本季度最后一个策略,我们来写一个跨周期模型。
除了可以自动交易,也显示出了指标线为做手工交易时提供参考。
策略源码策略由MACD和HalfTrend俩个交易原理构成。HalfTrend是作为小周期的交易逻辑,MACD做为跨周期交易逻辑。本身这些逻辑很好理解,没什么难度。就是写起来麻烦一点,出场这一块我们借鉴【SF24】| 海龟交易策略的“宽窄”改进版 里的出场模块。发现这个模块还是挺好用的,有兴趣的朋友可以看看。
HalfTrend交易逻辑HalfTrend这个写法其实就是类似SuperTrend("超级趋势线"),我们再老策略【SF14】| Supertrend“超级趋势线”指标魔改升级(源码) 这里面已经写过了。
我观察了一下它们俩个还是略有不同,我们来看原版的代码。
var int trend = 0
var int nextTrend = 0
var float maxLowPrice = nz(low[1], low)
var float minHighPrice = nz(high[1], high)
var float up = 0.0
var float down = 0.0
float atrHigh = 0.0
float atrLow = 0.0
float arrowUp = na
float arrowDown = na
atr2 = atr(100) / 2
dev = 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 := highPrice
else
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 - dev
else
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效果如下图
一眼看过去,作为指标其实还是挺好看。但是这些指标如果写成具体的交易信号绩效可能并不太理想,交易次数比较频繁的,测试下来损耗太高。这就是指标改造策略会产生一个主观落差。因此要改造这个策略,从俩个角度出发。
-
过滤
-
出场
跨周期函数
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三个版本的源码。感兴趣的小伙伴拿到源码后,可以在群里或者微信我交流,想想如何继续优化改进。
源码与工作区压缩包动力煤
铁矿
焦炭
PP
螺纹
纯碱
尿素
EG
EB
白银
苹果
股指
IF
IC
IH
本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。