本策略是一个基于唐奇安通道(Donchian Channel)突破的趋势跟踪交易系统,结合了超级趋势指标(SuperTrend)和成交量过滤器来增强交易信号的可靠性。该策略主要通过捕捉价格突破历史高点的方式来识别潜在的多头交易机会,同时利用成交量确认和趋势跟踪指标来过滤假突破信号。策略设计灵活,可以根据不同市场环境和交易品种进行参数优化。
策略的核心逻辑基于以下几个关键组件: 1. 唐奇安通道:计算用户定义周期内的最高价和最低价,形成上轨、下轨和中轨。当价格突破上轨时,触发多头入场信号。 2. 成交量过滤器:通过比较当前成交量与20周期移动平均线,确保只在成交量放大时进场,提高突破的可靠性。 3. 超级趋势指标:作为趋势确认工具,在多头趋势时显示绿色,空头趋势时显示红色。 4. 灵活的止损机制:提供四种不同的止损选项,包括下轨止损、中轨止损、超级趋势止损和百分比跟踪止损。
该策略通过综合运用多个技术指标,构建了一个相对完善的趋势跟踪交易系统。策略的优势在于信号可靠性高、风险管理灵活,但仍需要交易者根据具体市场特点进行参数优化。通过持续改进和优化,该策略有望在趋势市场中获得稳定的交易效果。
/*backtest
start: 2024-10-01 00:00:00
end: 2025-02-19 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
// Breakout trading system based on Donchain channel strategy that works best on a weekly chart and daily charts. Weekly is preferred.
//@version=5
strategy('Donchian BO with Volume Filter and Supertrend', shorttitle='DBO+Vol+ST', default_qty_type=strategy.percent_of_equity, default_qty_value=2, overlay=true)
// Input options to configure backtest date range
startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31)
startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12)
startYear = input.int(title='Start Year', defval=2016, minval=1800, maxval=2100)
avgVol = input.int(title="Avg Volume length", defval=20)
srcInput = input.source(close, "Source")
// Volume filter toggle
useVolumeFilter = input.bool(true, title='Enable Volume Filter')
endDate = input.int(title='End Date', defval=1, minval=1, maxval=31)
endMonth = input.int(title='End Month', defval=7, minval=1, maxval=12)
endYear = input.int(title='End Year', defval=2030, minval=1800, maxval=2100)
multiplier = input.int(title='SuperTrend Mult', defval=2, minval=1, maxval=12)
stlen = input.int(title='SuperTrend Length', defval=10, minval=1, maxval=12)
length = input.int(21, minval=1)
exit = input.int(3, minval=1, maxval=4, title='Exit Option') // Use Option 1 to exit using lower band; Use Option 2 to exit using basis line
lower = ta.lowest(length)
upper = ta.highest(length)
basis = math.avg(upper, lower)
// Plotting the Donchian channel
l = plot(lower, color=color.new(color.blue, 0))
u = plot(upper, color=color.new(color.blue, 0))
plot(basis, color=color.new(color.orange, 0))
fill(u, l, color=color.new(color.blue, 90))
// Check if the current bar is in the date range
inDateRange = time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0) and time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0)
// Long trailing stop-loss percentage
longTrailPerc = input.float(title='Trail Long Loss (%)', minval=0.0, step=0.1, defval=3) * 0.01
longStopPrice = 0.0
longStopPrice := if strategy.position_size > 0
stopValue = close * (1 - longTrailPerc)
math.max(stopValue, longStopPrice[1])
else
0
// Volume filter: 20-period moving average
volumeMA = ta.sma(volume, avgVol)
// Long entry condition: Donchian breakout + volume filter
longCondition = ta.crossover(srcInput, upper[1]) and (not useVolumeFilter or volume > volumeMA)
longsma = ta.sma(close, 200)
if inDateRange and longCondition
strategy.entry('Long', strategy.long)
// Exit conditions
if inDateRange and exit == 1
if ta.crossunder(close, lower[1])
strategy.close('Long')
if inDateRange and exit == 2
if ta.crossunder(close, basis[1])
strategy.close('Long')
[superTrend, dir] = ta.supertrend(multiplier, stlen)
if inDateRange and exit == 3
if ta.crossunder(close, superTrend)
strategy.close('Long')
if inDateRange and exit == 4
if strategy.position_size > 0
strategy.exit(id='XL TRL STP', stop=longStopPrice)
// Short conditions (commented out for now)
shortCondition = ta.crossunder(close, lower[1])
// Exit all positions when date range ends
if not inDateRange
strategy.close_all()
// --- Add Supertrend Indicator ---
stColor = dir == 1 ? color.red : color.green
plot(superTrend, color=stColor, title="SuperTrend", linewidth=2)