
이는 지수 이동 평균(EMA), 마드리드 리본, 돈키안 채널을 결합한 추세 추종 전략입니다. 이 전략의 독특한 점은 세 가지 전환 가능한 손절매 및 손절매 모드를 제공한다는 데 있습니다. 즉, 포인트 기반, 금액 기반, 위험-수익 비율 기반입니다. 2차 신호 확인 메커니즘을 통해 거래의 신뢰성이 향상되고, 유효한 신호가 두 번째로 나타날 때만 거래가 이루어집니다.
이 전략은 세 가지 기술 지표를 조합하여 거래 기회를 파악합니다.
장기 거래 조건: 가격이 200EMA 위에 있고, 마드리드 밴드가 강세로 전환되며 가격이 상위 돈키안 채널에서 벗어났습니다. 단기 거래 상황: 가격이 200EMA 아래에 있고, 마드리드 밴드가 하락세로 돌아서며 가격이 하단 돈키안 채널에서 벗어났습니다. 거짓 신호를 줄이기 위해 이 전략은 유효한 신호가 두 번째로 나타날 때만 거래를 실행합니다.
이는 여러 가지 고전적 기술 지표를 결합하고 유연한 손절매 및 손절매 관리와 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)