리소스 로딩... 로딩...

EMA, 마드리드 리본 및 돈치안 채널에 기반한 전략에 따른 다중 모드 영업/손실 중단 트렌드

저자:차오장, 날짜: 2025-01-10 16:24:30
태그:EMARRR

 Multi-Mode Take Profit/Stop Loss Trend Following Strategy Based on EMA, Madrid Ribbon and Donchian Channel

전반적인 설명

이것은 기하급수적인 이동 평균 (EMA), 마드리드 리본, 그리고 돈치안 채널을 결합한 트렌드 다음 전략이다. 전략의 독특함은 세 개의 전환 가능한 영업/손실 중지 모드 (tick-based, dollar-based, and risk-reward ratio based) 에 있다. 이중 확인 메커니즘을 통해 신뢰성을 높여서 두 번째 유효 신호에 따라 거래를 실행한다.

전략 원칙

이 전략은 세 가지 기술 지표 조합을 사용하여 거래 기회를 식별합니다. 1. 200주기 EMA는 전체 트렌드 방향을 결정합니다. 2. 중장기 트렌드 판단을 위한 마드리드 리본 (5주기 및 100주기 EMA의 크로스오버) 3. 특정 진입 시기를 위해 돈치안 채널의 탈출

긴 거래 조건: 200 EMA 이상의 가격, 상승 마드리드 리본, 돈치안 채널 이상의 가격 파업. 단기 거래 조건: 200 EMA 이하의 가격, 하락 마드리드 리본, 돈치안 채널 이하의 가격 파업. 잘못된 신호를 줄이기 위해 거래는 두 번째 유효한 신호 발생일 때만 실행됩니다.

전략적 장점

  1. 다양한 거래 방식에 적응할 수 있는 유연한 TP/SL 관리 시스템
  2. 여러 가지 기술 지표의 조합은 더 신뢰할 수 있는 신호를 제공합니다.
  3. 이중 확인 메커니즘은 잘못된 신호를 효과적으로 줄입니다.
  4. 전략은 완전히 회색 없이 앞을 보는 편견을 피합니다.
  5. 다양한 시장 환경에 매우 맞춤형

전략 위험

  1. 트렌드 역전 시 잠재적인 상당한 마취 해결책: 전략 감수성을 높이기 위해 지표 매개 변수를 조정합니다.
  2. 기술 지표에 과도하게 의존하면 특정 시장 기회를 놓칠 수 있습니다. 해결책: 근본 분석과 결합하는 것이 좋습니다.
  3. 고정 TP/SL는 모든 시장 조건에 적합하지 않을 수 있습니다. 솔루션: 변동성에 따라 TP/SL 수준을 동적으로 조정합니다.

전략 최적화 방향

  1. 동적 TP/SL 조정을 위한 변동성 지표를 도입
  2. 신호 신뢰성을 향상시키기 위해 볼륨 분석을 추가합니다.
  3. 더 많은 시장 감정 지표를 포함
  4. 적응적 매개 변수 최적화 시스템을 개발
  5. 최대 유출 통제와 같은 리스크 관리 모듈을 추가합니다.

요약

이 전략은 여러 가지 고전적인 기술 지표를 결합하여 유연한 TP/SL 관리 및 이중 확인 메커니즘을 통해 거래 안정성을 향상시키는 트렌드 다음 전략입니다. 전략의 높은 사용자 정의 가능성은 다른 시장 환경과 거래 스타일에 적응 할 수 있습니다. 라이브 거래 전에 철저한 역사 데이터 백테스팅을 수행하고 특정 시장 특성에 따라 매개 변수를 조정하는 것이 좋습니다.


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


관련

더 많은