本策略基于著名的海龟交易法,采用Donchian通道指标判断价格突破,并结合ATR指标设置止损位,实现趋势追踪。策略优势是回撤控制能力强,能够有效控制单笔止损,降低连续亏损的概率。但该策略对交易品种的适应性较弱,需要优化通道参数。总体来说,该策略作为海龟交易法的入门版本,可以用来验证海龟交易法的有效性,也可以作为量化交易的基础策略之一。
该策略主要基于两个指标:Donchian通道和ATR。
Donchian通道由最高价和最低价计算得到。策略默认设置通道长度为20天,以20天内的最高价和最低价画通道。当价格突破通道上沿时,产生买入信号;当价格突破通道下沿时,产生卖出信号。
ATR指标用来测量市场波动程度和设置止损。默认ATR周期设置为20天。策略以ATR的两倍作为止损位。
具体交易逻辑是:
当价格突破通道上沿时,做多入场。
止损点为入场时的低点减去ATR的两倍。
当价格突破通道下沿时,平多头仓位。
当价格突破通道下沿时,做空入场。
止损点为入场时的高点加上ATR的两倍。
当价格突破通道上沿时,平空头仓位。
综上,该策略依靠Donchian通道判断趋势方向和入场时机,以ATR设置止损来控制风险,实现对趋势的追踪。
该策略主要具有以下优势:
回撤控制能力强。采用ATR指标来设置止损,可以有效控制单笔亏损。
实现了趋势追踪。Donchian通道可以有效判断价格突破,指示趋势转换。
适合高波动品种。ATR指标考虑了市场波动率,设置止损更符合不同品种的特性。
策略思路简单清晰,容易理解实现。
可用Python语言灵活编写和优化策略。
该策略也存在一些风险需要关注:
通道参数需要优化。不同品种和时间周期下,通道参数需要调整,以适应市场特征。
连续止损风险。异常行情下,短期内可能触发多个止损,造成较大亏损。
ATR参数需要测试。ATR参数直接影响止损效果,不同品种和波动环境下,需要调整。
交易频率可能过高。在趋势不明显的震荡市场中,可能产生过多的交叉信号。
利润可能有限。策略以止损为主,无法有效捕捉趋势行情的全部涨幅。
夸张行情下止损可能不足。部分异常行情下,价格跳空可能直接触发止损。
该策略可以从以下方面进行优化:
优化通道参数,测试不同的参数对不同品种的适应性。
增加过滤条件,避免在震荡行情中产生过多信号。可以考虑突破幅度或交易量过滤。
优化ATR周期参数,测试不同的参数对止损效果的影响。
增加pyramid进场策略,在趋势行情中追加仓位,扩大获利空间。
结合其它指标,提高过滤效果。例如MACD、KD等指标判断趋势态势,避免反向交易。
根据滑点、手续费等交易成本优化止损点位。防止止损过于接近。
测试不同品种的适应性,调整参数以针对特定品种。
本策略作为海龟交易法的入门版本,总体来说策略思路简单清晰,回撤控制能力强,可以有效验证海龟交易法的原理。但该策略对交易品种的适应性较弱,需要根据不同品种具体优化参数,才能发挥策略效果。随着参数优化、过滤条件增加等改进,该策略可以成为量化交易的基础趋势追踪策略之一。
/*backtest start: 2022-10-10 00:00:00 end: 2023-10-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //Based on Turtle traders strategy: buy/sell on Donchian breakouts and stop loss on ATR 2x // initial version considerations : //// 1. Does not consider filter for avoiding new entries after winning trades (filtering rule from Turtle Strategy on 20 day breakout strategy) //// 2. Does not consider pyramiding (aditional entries after 1N price movements) strategy("Turtle trading strategy (Donchian/ATR)", overlay=true) enter_period = input(20, minval=1, title="Enter Channel") exit_period = input(10, minval=1, title="Exit Channel") offset_bar = input(0,minval=0, title ="Offset Bars") direction = input("Long",options=["Long","Short"],title="Direction") max_length = max(enter_period,exit_period) atrmult = input(2,title="ATR multiplier (Stop Loss)") atrperiod = input(20,title="ATR Period") closed_pos = false dir_long = direction == "Long"? true : false atr = atr(atrperiod) upper = dir_long ? highest(enter_period): highest(exit_period) lower = dir_long ? lowest(exit_period): lowest(enter_period) atrupper = close + atr atrlower = close - atr plotted_atr = dir_long ? atrlower : atrupper //basis = avg(upper, lower) l = plot(lower, style=line, linewidth=3, color=lime, offset=1) u = plot(upper, style=line, linewidth=3, color=lime, offset=1) a = plot(plotted_atr, style=line,linewidth=2,color=red,offset=1) //plot(basis, color=yellow, style=line, linewidth=1, title="Mid-Line Average") //break upper Donchian (with 1 candle offset) (buy signal) break_up = (close >= upper[1]) //break lower Donchian (with 1 candle offset) (sell signal) break_down = (close <= lower[1]) stop_loss = dir_long ? (close<=plotted_atr[1]) : (close>=plotted_atr[1]) if break_up and dir_long strategy.entry("buy", strategy.long, 1) closed_pos :=false if (break_down or stop_loss) and dir_long strategy.close("buy") if break_down and not dir_long strategy.entry("sell", strategy.short, 1) closed_pos :=false if (break_up or stop_loss) and not dir_long strategy.close("sell") closed_pos :=true losing_trade = strategy.equity[0]<strategy.equity[1] //plotshape(losing_trade,text="Losing!") plotshape(stop_loss,style=dir_long?shape.labeldown:shape.labelup,text="Stop!") //plot(strategy.equity)