
This is a trend following strategy that combines Exponential Moving Average (EMA), Madrid Ribbon, and Donchian Channel. The strategy’s uniqueness lies in its three switchable take-profit/stop-loss modes: tick-based, dollar-based, and risk-reward ratio based. It enhances reliability through a double confirmation mechanism, only executing trades on the second valid signal.
The strategy employs a triple technical indicator combination to identify trading opportunities: 1. 200-period EMA to determine overall trend direction 2. Madrid Ribbon (crossover of 5-period and 100-period EMA) for medium-term trend judgment 3. Donchian Channel breakout for specific entry timing
Long trade conditions: price above 200 EMA, bullish Madrid Ribbon, and price breaks above Donchian Channel. Short trade conditions: price below 200 EMA, bearish Madrid Ribbon, and price breaks below Donchian Channel. To reduce false signals, trades are only executed on the second valid signal occurrence.
This is a trend following strategy that combines multiple classic technical indicators, enhancing trading stability through flexible TP/SL management and double confirmation mechanism. The strategy’s high customizability allows it to adapt to different market environments and trading styles. It is recommended to conduct thorough historical data backtesting before live trading and adjust parameters according to specific market characteristics.
/*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)