双机制动态趋势追踪策略

Author: ChaoZhang, Date: 2024-01-31 11:13:44
Tags:

双机制动态趋势追踪策略

概述

双机制动态趋势追踪策略是一种组合两种不同交易策略信号的趋势追踪策略。该策略首先利用123反转策略判断价格反转点,然后结合去趋势合成价格(D_DSP)指数判断价格趋势方向,最后综合两种信号产生交易指令。

该策略主要用于中短期趋势追踪,通过双重机制设定动态止损点,能够有效锁定盈利,避免亏损扩大。同时,结合趋势指标和反转指标双重确认,可以减少噪音交易。

策略原理

123反转策略

123反转策略源自Ulf Jensen的《我如何在期货市场翻三番的资金》一书第183页。该策略判断价格是否出现连续两个BAR反转形态构成价格反转信号。

具体逻辑是,如果收盘价低于前一日收盘价,且慢速K线低于50时产生买入信号;如果收盘价高于前一日收盘价,且快速K线高于50时产生卖出信号。

去趋势合成价格指数

去趋势合成价格指数(D_DSP)是一种用来判断价格趋势方向的指标,该指标与实际价格周期变化保持一致。D_DSP的计算方法是,用价格的1/4周期指数移动平均线减去1/2周期指数移动平均线。

如果D_DSP为正,代表价格处于上升趋势;如果D_DSP为负,代表价格处于下降趋势。

双重机制判断

该策略通过组合123反转策略和D_DSP指数两种判断机制,如果两种信号同向(如双多或双空),则产生trades指令;如果信号不一致,则清仓。

这种双重确认机制可以有效过滤噪音交易,锁定趋势获利。

优势分析

双机制动态趋势追踪策略最大的优势在于设置了两个层面的止损点。首先在时间维度上,快慢随机指标的差值形成一种时间错位的止损;其次在价格维度,反转策略本身包含一定的止损功能。

这两层止损可以最大程度锁定盈利,防止单一止损策略的死叉盈亏。此外,双重确认机制也可有效过滤非主流方向性价格变动引发的错误信号。

风险分析

该策略最大的风险在于参数设置过于死板。比如周期长度设置不当可能错过主流趋势,从而错过获利机会或增加亏损;双重确认设定过于死板也可能错过及时止损。

此外,反转策略与趋势策略组合时,两者判断不一致的情况下清仓的操作也可能错过后续趋势继续向一个主流方向运行的机会。

优化方向

该策略可以从以下几个方面进行优化:

  1. 周期参数优化。通过更多回测数据计算出参数最优值,设置更合适的周期参数。

  2. 增加止损策略。比如突破止损,追踪止损等,设置更动态更合理的止损点。

  3. 判断规则优化。调整双重确认判断的灵敏度,防止过于激进清仓错失良机。

  4. 增加过滤器。设置价格震荡过滤,避免趋势末期均线差值震荡误判信号。

总结

双机制动态趋势追踪策略通过快慢随机指标双重止损和反转与趋势判断双重确认,实现了有效的趋势追踪和风险控制。该策略既考虑了价格行情的时间因素,也考虑了价格本身的方向性,形成了立体化的决策依据。

通过不断优化判断规则和参数设置,预计该策略可以获得较好的效果。但交易策略优化需要大量历史数据测试支持,选股策略和止损策略也需要持续完善。建议实盘跟踪观察一段时间,进一步检验策略效果。


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 18/11/2019
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// Detrended Synthetic Price is a function that is in phase with the 
// dominant cycle of real price data. This DSP is computed by subtracting 
// a half-cycle exponential moving average (EMA) from the quarter cycle 
// exponential moving average.
// See "MESA and Trading Market Cycles" by John Ehlers pages 64 - 70. 
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

D_DSP(Length) =>
    pos = 0.0
    xHL2 = hl2
    xEMA1 = ema(xHL2, Length)
    xEMA2 = ema(xHL2, 2 * Length)
    xEMA1_EMA2 = xEMA1 - xEMA2
    pos := iff(xEMA1_EMA2 > 0, 1,
             iff(xEMA1_EMA2 < 0, -1, nz(pos[1], 0))) 
    pos

strategy(title="Combo Backtest 123 Reversal & D_DSP (Detrended Synthetic Price)", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
LengthDSP = input(14, minval=1)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posD_DSP = D_DSP(LengthDSP)
pos = iff(posReversal123 == 1 and posD_DSP == 1 , 1,
	   iff(posReversal123 == -1 and posD_DSP == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )

更多内容