动态上升ADX趋势跟踪策略


创建日期: 2023-12-11 17:18:32 最后修改: 2023-12-11 17:18:32
复制: 0 点击次数: 421
1
关注
1207
关注者

动态上升ADX趋势跟踪策略

概述

该策略通过跟踪ADX指标的动态变化,捕捉市场趋势的初期变化,实现趋势的及时跟踪。当ADX从低位快速上升时,说明趋势在形成,这是入场的大好时机。结合移动平均线的辅助,可以有效过滤错诊。

策略原理

该策略主要基于ADX指标的动态变化来判断趋势的发展。ADX指标在低位时,代表趋势变化不大;当ADX从低位快速上升时,说明趋势正在形成。策略通过监测ADX的快速上升,来捕捉趋势的发展。

具体来说,策略的入场判断包括以下几个条件: 1. ADX上穿设定的阈值(如10) 2. ADX向上快速上升 3. 价格上穿简单移动平均线或指数移动平均线

当上述条件同时满足时,代表趋势正在形成,做多;当下穿移动平均线时,平仓。使用两个移动平均线,可以更准确判断趋势的发展。

停损条件也类似,当ADX向下快速下降时,做空;价格下穿移动平均线时,平仓。

优势分析

该策略最大的优势在于及时捕捉趋势的发展。传统仅看ADX数值的方法,往往要等ADX上升到20或25才能确认趋势,这已经错过了最佳的入场时机。该策略通过跟踪ADX的快速上升段,能极大地把握趋势的发展。

另外,策略还引入移动平均线进行辅助,可以有效过滤部分错诊情况,提高策略的稳定性。

风险及优化分析

该策略最大的风险在于ADX指标本身的滞后性。尽管通过跟踪快速上升段可以缩短滞后,但仍然存在一定滞后。这会导致部分快速反转的市场无法捕捉。

此外,ADX指标对趋势判断也并非百分之百准确,难免也会出现一定的错诊。引入移动平均线虽可过滤部分噪声,但仍需进一步优化。

该策略的优化空间还很大,关键在于进一步提升ADX指标的捕捉精准度。可以考虑引入机器学习等方法,训练模型判断ADX变化后的概率分布。另外也可以尝试不同参数组合、其他辅助指标等方法进行测试优化。

总结

该动态上升ADX趋势跟踪策略,通过捕捉ADX快速上升的市场变化点,实现对趋势的及时跟踪。最大优势是时间上极其敏捷,可有效把握趋势早期。同时也存在一定概率的误判风险,后续仍需持续优化测试。

策略源码
/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dhilipthegreat

//@version=4
//Rising ADX strategy

strategy(title="Rising ADX strategy", overlay=false)

adxlen = input(14, title="ADX Length", minval=1)
threshold = input(10, title="threshold", minval=5)

hline(threshold, color=color.black, linestyle=hline.style_dashed)

atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen=input(20, title="Moving average 1 ",minval=1, maxval=50)
avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na

atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen2=input(20, title="Moving average 2",minval=1, maxval=200)
avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na

//ADX&DI
dilen = 14
dirmov(len,_high,_low,_tr) =>
	up = change(_high)
	down = -change(_low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(_tr, len)
	
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)

	[plus, minus]

adx(dilen, adxlen,_high,_low,_tr) =>
	[plus, minus] = dirmov(dilen,_high,_low,_tr)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

[plus, minus] = dirmov(dilen,high,low,tr)
sig = adx(dilen, adxlen,high,low,tr)
prev_sig = adx(dilen, adxlen,high[1],low[1],tr)
plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2)

//////
longCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2
barcolor(longCondition ? color.yellow: na)
Long_side = input(true, "Long side")
if Long_side
    strategy.entry(id="Long", long=true,  when= longCondition  and strategy.position_size<1)
    exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2
    strategy.close(id="Long",comment="L exit",    qty=strategy.position_size ,   when= exitCondition)   //close all

shortCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2
barcolor(shortCondition ? color.gray: na)
Short_side = input(true, "Short side")
if Short_side
    strategy.entry(id="Short", long=false,  when= shortCondition  and strategy.position_size<1)
    sell_exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2
    strategy.close(id="Short",comment="S exit",    qty=strategy.position_size ,   when= sell_exitCondition)   //close all

barcolor(strategy.position_size>1 ? color.lime: na)
bgcolor(strategy.position_size>1 ? color.lime: na)

barcolor(strategy.position_size<0 ? color.orange: na)
bgcolor(strategy.position_size<0 ? color.orange: na)
更多内容