모멘텀 거북이 트렌드 추적 전략

저자:차오장, 날짜: 2023-11-23 11:53:27
태그:

img

전반적인 설명

모멘텀 거북이 트렌드 추적 전략 (Momentum Turtle Trend Tracking strategy) 은 거북이 거래 규칙을 기반으로하는 트렌드 다음 전략이다. 거북이 지표를 사용하여 트렌드를 식별하고 모멘텀 메트릭을 결합하여 소음 거래를 필터링한다. 이 전략의 주요 장점은 강력한 가격 추세를 파악하고 과도한 수익을 달성하는 능력이다.

전략 원칙

이 전략은 트렌드 방향을 결정하기 위해 거북이 지표의 브레이크아웃 시스템을 사용합니다. 구체적으로, 종료 가격이 지난 20 일 동안 가장 높은 가격보다 높을 때, 그것은 상승 신호이며 길게 간다; 종료 가격이 지난 20 일 동안 가장 낮은 가격보다 낮을 때, 그것은 하락 신호이며 전략이 짧게 간다.

일부 노이즈 트레이드를 필터링하기 위해 이 전략은 또한 모멘텀 요소를 포함합니다. 가격 변동이 5 ATRs 미만이라면 전략은 트레이드에 진입하지 않습니다. 이것은 옆 시장에서 휘프사우로 인한 손실을 피합니다.

포지션 개척 후 전략은 원래 거북이 규칙에서 N-브레이크아웃 출구를 사용하여 스톱 손실을 설정합니다. 이 시스템은 지난 20 일 동안 가장 높고 가장 낮은 가격에 따라 스톱 손실을 설정합니다. 예를 들어, 긴 포지션의 스톱 손실은 지난 20 일 동안 가장 낮은 가격보다 2N ATR가 낮습니다. 이 전략의 이익 취득은 간단합니다. 전체 계정 가치의 10%로 설정됩니다.

이점 분석

이 전략의 가장 큰 장점은 트렌드 추적과 모멘텀 관리 두 가지를 결합한다는 것입니다. 거북이 시스템은 시장 소음에 방해받지 않고 가격의 중장기 트렌드를 정확하게 파악 할 수 있습니다. 추가 ATR 모멘텀 필터는 불필요한 거래 수를 추가로 줄여 수익 잠재력을 크게 증가시킵니다.

특히 이 전략은 다음과 같은 강점을 가지고 있습니다.

  1. 거북이 지표는 추세를 정확하게 파악하고 중장기 추세를 추적합니다.
  2. 모멘텀 필터는 불필요한 트레이드를 줄이고 트레이드 빈도에 손실을 방지합니다.
  3. 탄탄한 위험 통제 조치는 트렌드가 역전될 때 적시에 손실을 멈추도록 합니다.
  4. 전체적으로 전략 조정은 원래 거북이 원칙에 잘 부합합니다.

위험 분석

더 많은 최적화 잠재력이 있지만 전략은 또한 경계해야 할 몇 가지 위험을 안고 있습니다.

  1. 장기 보유에 대한 과도한 변동에 대응하지 않습니다. 거북이 포지션 크기는 과도한 손실로 이어질 수있는 변동성을 고려하지 않습니다.
  2. 스톱 로즈 가격은 극심한 반전으로 인해 예상보다 높은 손실을 초래할 위험이 있습니다.
  3. 이윤 목표가 없다는 것은 과도한 지분과 수중 포지션 보유 위험이 있음을 의미합니다.

더 나은 기회

위의 위험에 근거하여, 최적화의 주요 기회는 다음을 포함합니다.

  1. 손실 거래의 크기를 줄이기 위해 변동성을 조정한 동적 위치 크기 모델을 고려하십시오.
  2. 헤드 & 어깨 또는 더블 토프와 같은 토핑 패턴을 줄이거나 역전하기 위해 반전 메커니즘을 추가하십시오.
  3. 수익 목표물을 추가하여 누적 이익이 전체 자본의 %에 도달하면 보유가 감소합니다.

결론

전체적으로 모멘텀 거북이 트렌드 추적 전략은 중장기 트렌드 추적을 위한 견고한 시스템이다. 강력한 트렌드를 파악하기 위해 트렌드 식별을 위한 거북이 지표와 변동성 관리를 위한 ATR 필터를 결합한다. 또한 위험 통제와 매개 변수 조정은 마감량을 줄이기 위해 견고하다. 역동적인 사이징, 역전 및 수익 취득과 같은 추가 개선은 성과를 향상시킬 수 있다.


/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Heiken Ashi BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2029, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// HA /////////////
haTicker = heikinashi(syminfo.tickerid)
haOpen = security(haTicker, "D", open)
haHigh = security(haTicker, "D", high)
haLow = security(haTicker, "D", low)
haClose = security(haTicker, "D", close)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = haOpen < haClose and isMoving()
short = haOpen > haClose and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plotcandle(haOpen, haHigh, haLow, haClose, title='HA Candles', color = haOpen < haClose ? color.lime : color.red)
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)

더 많은