Đây là một chiến lược theo xu hướng kết hợp trung bình chuyển động biểu số (EMA), băng Madrid và kênh Donchian. Tính độc đáo của chiến lược nằm trong ba chế độ lấy lợi nhuận / dừng lỗ có thể chuyển đổi: dựa trên dấu chấm, dựa trên đô la và dựa trên tỷ lệ rủi ro-lợi nhuận. Nó tăng độ tin cậy thông qua một cơ chế xác nhận kép, chỉ thực hiện giao dịch trên tín hiệu hợp lệ thứ hai.
Chiến lược sử dụng một sự kết hợp ba chỉ số kỹ thuật để xác định các cơ hội giao dịch: 1. 200 thời kỳ EMA để xác định hướng xu hướng tổng thể 2. Madrid Ribbon (crossover của EMA 5 giai đoạn và 100 giai đoạn) để đánh giá xu hướng trung hạn 3. Thanh tra Donchian để xác định thời gian nhập cảnh
Các điều kiện giao dịch dài: giá trên 200 EMA, Ribbon Madrid tăng và giá phá vỡ trên kênh Donchian. Điều kiện giao dịch ngắn: giá dưới 200 EMA, Ribbon Madrid giảm và giá phá vỡ dưới kênh Donchian. Để giảm các tín hiệu sai, giao dịch chỉ được thực hiện vào lần phát hiện tín hiệu hợp lệ thứ hai.
Đây là một chiến lược theo xu hướng kết hợp nhiều chỉ số kỹ thuật cổ điển, tăng cường sự ổn định giao dịch thông qua quản lý TP / SL linh hoạt và cơ chế xác nhận kép. Khả năng tùy biến cao của chiến lược cho phép nó thích nghi với các môi trường thị trường và phong cách giao dịch khác nhau.
/*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)