EMA, 마드리드 밴드 및 돈키안 채널을 기반으로 한 다중 모드 손절매 및 손절매 추세 추종 전략

EMA RRR
생성 날짜: 2025-01-10 16:24:30 마지막으로 수정됨: 2025-01-10 16:24:30
복사: 2 클릭수: 418
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

EMA, 마드리드 밴드 및 돈키안 채널을 기반으로 한 다중 모드 손절매 및 손절매 추세 추종 전략

개요

이는 지수 이동 평균(EMA), 마드리드 리본, 돈키안 채널을 결합한 추세 추종 전략입니다. 이 전략의 독특한 점은 세 가지 전환 가능한 손절매 및 손절매 모드를 제공한다는 데 있습니다. 즉, 포인트 기반, 금액 기반, 위험-수익 비율 기반입니다. 2차 신호 확인 메커니즘을 통해 거래의 신뢰성이 향상되고, 유효한 신호가 두 번째로 나타날 때만 거래가 이루어집니다.

전략 원칙

이 전략은 세 가지 기술 지표를 조합하여 거래 기회를 파악합니다.

  1. 200기간 지수 이동 평균은 전반적인 추세 방향을 결정하는 데 사용됩니다.
  2. 마드리드 밴드(5주기와 100주기 EMA의 교차)는 중기 추세를 결정하는 데 사용됩니다.
  3. 특정 진입 타이밍을 위한 Donchian 채널 브레이크아웃

장기 거래 조건: 가격이 200EMA 위에 있고, 마드리드 밴드가 강세로 전환되며 가격이 상위 돈키안 채널에서 벗어났습니다. 단기 거래 상황: 가격이 200EMA 아래에 있고, 마드리드 밴드가 하락세로 돌아서며 가격이 하단 돈키안 채널에서 벗어났습니다. 거짓 신호를 줄이기 위해 이 전략은 유효한 신호가 두 번째로 나타날 때만 거래를 실행합니다.

전략적 이점

  1. 다양한 거래 스타일에 따라 모드를 전환할 수 있는 유연한 손절매 및 손절매 관리 시스템
  2. 여러 기술 지표를 결합하면 더욱 안정적인 거래 신호가 제공됩니다.
  3. 2차 확인 메커니즘은 거짓 신호의 영향을 효과적으로 줄여줍니다.
  4. 이 전략은 미리 예측하는 편향을 완전히 피하고 다시 그리는 문제도 없습니다.
  5. 다양한 시장 환경에 적응하도록 높은 사용자 정의 가능

전략적 위험

  1. 추세가 반전되면 더 큰 반등이 발생할 수 있습니다. 해결책: 지표 매개변수를 조정하여 전략의 민감도를 개선할 수 있습니다.
  2. 기술 지표에 지나치게 의존하면 시장 기회를 놓칠 수 있습니다. 해결 방법: 기본 분석을 결합하는 것이 좋습니다.
  3. 고정 손절매 및 이익실현은 모든 시장 상황에 적합하지 않을 수 있습니다. 솔루션: 변동성에 따라 이익 실현 수준과 손절 수준을 동적으로 조정합니다.

전략 최적화 방향

  1. 이익실현 및 손절매 수준을 동적으로 조정하기 위한 변동성 지표 소개
  2. 신호 안정성을 개선하기 위해 볼륨 분석 추가
  3. 더 많은 시장 감정 지표 추가
  4. 적응형 매개변수 최적화 시스템 개발
  5. 최대 인출 제어와 같은 위험 관리 모듈을 추가합니다.

요약하다

이는 여러 가지 고전적 기술 지표를 결합하고 유연한 손절매 및 손절매 관리와 2차 확인 메커니즘을 통해 거래 안정성을 향상시킨 추세 추적 전략입니다. 이 전략은 사용자 정의가 매우 자유로워 다양한 시장 환경과 거래 스타일에 적응할 수 있습니다. 실제 사용하기 전에 충분한 과거 데이터 백테스트를 수행하고 특정 시장 특성에 따라 매개변수 설정을 조정하는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Pamplona Enhanced TP/SL Toggleable", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Input settings
use_tick_based = input.bool(false, title="Use Tick-Based TP/SL")
use_dollar_based = input.bool(false, title="Use Dollar-Based TP/SL")
use_risk_reward = input.bool(true, title="Use Risk-Reward TP/SL") // Default option

tick_size = input.float(0.1, title="Tick Size (for Tick-Based)", minval=0.0001, step=0.0001)
ticks = input.int(10, title="Ticks (for Tick-Based TP/SL)", minval=1)
dollar_tp = input.float(10.0, title="Dollar Take Profit (for Dollar-Based)", minval=0.01, step=0.01)
dollar_sl = input.float(10.0, title="Dollar Stop Loss (for Dollar-Based)", minval=0.01, step=0.01)
risk_reward_ratio = input.float(2.0, title="Risk-Reward Ratio (for Risk-Reward TP/SL)", minval=0.1, step=0.1)
contract_size = input.int(1, title="Contract Size", minval=1)

// Retrieve indicators
ema200 = ta.ema(close, 200)
src = close
ma05 = ta.ema(src, 5)
ma100 = ta.ema(src, 100)
madrid_green = ma05 > ma100
dlen = input.int(20, title="Donchian Channel Period")
highest_d = ta.highest(high, dlen)
lowest_d = ta.lowest(low, dlen)
donchian_green = close > highest_d[1]
donchian_red = close < lowest_d[1]

// Track signals
var int long_signal_count = 0
var int short_signal_count = 0

// Conditions
long_condition_raw = madrid_green and donchian_green and close > ema200
short_condition_raw = not madrid_green and donchian_red and close < ema200

// Update signal counters
if long_condition_raw
    long_signal_count += 1
else
    long_signal_count := 0

if short_condition_raw
    short_signal_count += 1
else
    short_signal_count := 0

// Final conditions to enter on the second signal
long_condition = long_signal_count == 2
short_condition = short_signal_count == 2

// Ensure exactly one TP/SL mode is enabled
tp_sl_mode_count = (use_tick_based ? 1 : 0) + (use_dollar_based ? 1 : 0) + (use_risk_reward ? 1 : 0)
if tp_sl_mode_count != 1
    runtime.error("Enable exactly ONE TP/SL mode (Tick-Based, Dollar-Based, or Risk-Reward).")

// Function to calculate TP/SL based on active mode
calc_tp_sl(entry_price, is_long) =>
    float tp = na
    float sl = na
    if use_tick_based
        tp := is_long ? entry_price + ticks * tick_size : entry_price - ticks * tick_size
        sl := is_long ? entry_price - ticks * tick_size : entry_price + ticks * tick_size
    else if use_dollar_based
        tp := is_long ? entry_price + (dollar_tp / contract_size) : entry_price - (dollar_tp / contract_size)
        sl := is_long ? entry_price - (dollar_sl / contract_size) : entry_price + (dollar_sl / contract_size)
    else if use_risk_reward
        risk = is_long ? close - low : high - close
        tp := is_long ? close + (risk * risk_reward_ratio) : close - (risk * risk_reward_ratio)
        sl := is_long ? close - risk : close + risk
    [tp, sl]

// Entry logic
if long_condition
    [take_profit, stop_loss] = calc_tp_sl(close, true)
    strategy.entry("Long", strategy.long, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Long", limit=take_profit, stop=stop_loss)

if short_condition
    [take_profit, stop_loss] = calc_tp_sl(close, false)
    strategy.entry("Short", strategy.short, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Short", limit=take_profit, stop=stop_loss)

// Plot indicators
plot(ema200, title="200 EMA", color=color.white, linewidth=2)
bgcolor(long_condition ? color.new(color.green, 90) : short_condition ? color.new(color.red, 90) : na)