这个策略是一个结合范围过滤器(Range Filter)和平均真实波幅(ATR)的低回撤量化交易系统。它通过范围过滤器识别趋势方向,同时使用ATR动态调整仓位大小和设置尾随止损,有效控制风险。该策略要求价格连续两个周期突破范围过滤器上下轨才确认趋势,这种双重确认机制有效减少了假突破。系统默认风险设置为每笔交易风险资金的1%,保守而稳健。该策略特别适合波动较大但有明显趋势的市场环境。
该策略的核心原理是结合范围过滤器识别趋势与ATR风险管理系统:
范围过滤器计算:
趋势确认条件:
ATR动态仓位:
ATR尾随止损:
自适应性强:
风险控制出色:
信号质量高:
低回撤特性:
透明且可定制:
横盘市场表现不佳:
快速反转风险:
参数敏感性:
连续亏损风险:
滑点和手续费影响:
添加市场环境过滤器:
优化范围过滤器周期:
引入多重时间框架确认:
动态调整ATR倍数:
添加时间基础的退出机制:
双重确认范围过滤器策略结合ATR动态仓位与尾随止损系统是一个注重风险控制的量化交易策略。它通过范围过滤器识别趋势方向,要求连续两个周期突破以确认信号,使用ATR来动态调整仓位大小和设置尾随止损,有效控制每笔交易的风险在预设百分比内。该策略的主要优势在于强大的自适应性和出色的风险控制能力,特别适合波动较大但有明显趋势的市场。主要风险来自横盘市场的假突破和参数选择的敏感性。未来优化方向包括添加市场环境过滤器、引入多时间框架分析和动态调整参数。对于追求稳健、低回撤交易风格的交易者,这是一个值得考虑的策略框架,可以根据个人风险偏好和交易标的特性进行进一步定制和优化。
/*backtest
start: 2025-02-01 00:00:00
end: 2025-05-25 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("Range Filter + ATR Strategy (Low Drawdown)", overlay=true,
pyramiding=0, default_qty_type=strategy.percent_of_equity,
default_qty_value=100, commission_type=strategy.commission.percent,
commission_value=0.1, initial_capital=10000)
// Input parameters
rangePeriod = input.int(14, title="Range Filter Period")
atrPeriod = input.int(14, title="ATR Period")
riskPercent = input.float(1.0, title="Risk % per Trade", minval=0.1, maxval=5)
useATRSizing = input(true, title="Use ATR Position Sizing")
trailATR = input(1.5, title="Trailing Stop ATR Multiple")
// Calculate Range Filter
src = close
smooth = ta.sma(src, rangePeriod)
filter = ta.sma(math.abs(src - smooth), rangePeriod)
upper = smooth + filter
lower = smooth - filter
// Calculate ATR
atr = ta.atr(atrPeriod)
// Trend direction
upTrend = src > upper and src[1] > upper[1]
downTrend = src < lower and src[1] < lower[1]
// Position sizing based on ATR
atrPositionSize = (strategy.equity * riskPercent/100) / (atr * syminfo.pointvalue)
// Strategy logic
if (upTrend)
strategy.entry("Long", strategy.long, qty=useATRSizing ? atrPositionSize : na)
if (downTrend)
strategy.entry("Short", strategy.short, qty=useATRSizing ? atrPositionSize : na)
// Corrected trailing stop using trail_offset instead of trail_points
if (strategy.position_size > 0)
strategy.exit("Long Exit", "Long", trail_price=na, trail_offset=trailATR * atr)
if (strategy.position_size < 0)
strategy.exit("Short Exit", "Short", trail_price=na, trail_offset=trailATR * atr)
// Plotting
plot(upper, color=color.green, title="Upper Range")
plot(lower, color=color.red, title="Lower Range")
plot(smooth, color=color.blue, title="Smooth Line")