资源加载中... loading...

基于海龟交易法的突破策略

Author: ChaoZhang, Date: 2023-10-17 17:22:34
Tags:

基于海龟交易法的突破策略

概述

本策略基于著名的海龟交易法,采用Donchian通道指标判断价格突破,并结合ATR指标设置止损位,实现趋势追踪。策略优势是回撤控制能力强,能够有效控制单笔止损,降低连续亏损的概率。但该策略对交易品种的适应性较弱,需要优化通道参数。总体来说,该策略作为海龟交易法的入门版本,可以用来验证海龟交易法的有效性,也可以作为量化交易的基础策略之一。

原理

该策略主要基于两个指标:Donchian通道和ATR。

Donchian通道由最高价和最低价计算得到。策略默认设置通道长度为20天,以20天内的最高价和最低价画通道。当价格突破通道上沿时,产生买入信号;当价格突破通道下沿时,产生卖出信号。

ATR指标用来测量市场波动程度和设置止损。默认ATR周期设置为20天。策略以ATR的两倍作为止损位。

具体交易逻辑是:

  1. 当价格突破通道上沿时,做多入场。

  2. 止损点为入场时的低点减去ATR的两倍。

  3. 当价格突破通道下沿时,平多头仓位。

  4. 当价格突破通道下沿时,做空入场。

  5. 止损点为入场时的高点加上ATR的两倍。

  6. 当价格突破通道上沿时,平空头仓位。

综上,该策略依靠Donchian通道判断趋势方向和入场时机,以ATR设置止损来控制风险,实现对趋势的追踪。

优势分析

该策略主要具有以下优势:

  1. 回撤控制能力强。采用ATR指标来设置止损,可以有效控制单笔亏损。

  2. 实现了趋势追踪。Donchian通道可以有效判断价格突破,指示趋势转换。

  3. 适合高波动品种。ATR指标考虑了市场波动率,设置止损更符合不同品种的特性。

  4. 策略思路简单清晰,容易理解实现。

  5. 可用Python语言灵活编写和优化策略。

风险分析

该策略也存在一些风险需要关注:

  1. 通道参数需要优化。不同品种和时间周期下,通道参数需要调整,以适应市场特征。

  2. 连续止损风险。异常行情下,短期内可能触发多个止损,造成较大亏损。

  3. ATR参数需要测试。ATR参数直接影响止损效果,不同品种和波动环境下,需要调整。

  4. 交易频率可能过高。在趋势不明显的震荡市场中,可能产生过多的交叉信号。

  5. 利润可能有限。策略以止损为主,无法有效捕捉趋势行情的全部涨幅。

  6. 夸张行情下止损可能不足。部分异常行情下,价格跳空可能直接触发止损。

优化方向

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

  1. 优化通道参数,测试不同的参数对不同品种的适应性。

  2. 增加过滤条件,避免在震荡行情中产生过多信号。可以考虑突破幅度或交易量过滤。

  3. 优化ATR周期参数,测试不同的参数对止损效果的影响。

  4. 增加pyramid进场策略,在趋势行情中追加仓位,扩大获利空间。

  5. 结合其它指标,提高过滤效果。例如MACD、KD等指标判断趋势态势,避免反向交易。

  6. 根据滑点、手续费等交易成本优化止损点位。防止止损过于接近。

  7. 测试不同品种的适应性,调整参数以针对特定品种。

总结

本策略作为海龟交易法的入门版本,总体来说策略思路简单清晰,回撤控制能力强,可以有效验证海龟交易法的原理。但该策略对交易品种的适应性较弱,需要根据不同品种具体优化参数,才能发挥策略效果。随着参数优化、过滤条件增加等改进,该策略可以成为量化交易的基础趋势追踪策略之一。


/*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)


    



更多内容