Chiến lược theo xu hướng dừng lỗ và dừng lãi đa chế độ dựa trên EMA, Madrid Bands và Donchian Channels

EMA RRR
Ngày tạo: 2025-01-10 16:24:30 sửa đổi lần cuối: 2025-01-10 16:24:30
sao chép: 2 Số nhấp chuột: 418
1
tập trung vào
1617
Người theo dõi

Chiến lược theo xu hướng dừng lỗ và dừng lãi đa chế độ dựa trên EMA, Madrid Bands và Donchian Channels

Tổng quan

Đây là chiến lược theo xu hướng kết hợp Đường trung bình động hàm mũ (EMA), Dải băng Madrid và Kênh Donchian. Điểm độc đáo của chiến lược này nằm ở việc cung cấp ba chế độ dừng lợi nhuận và dừng lỗ có thể chuyển đổi: dựa trên điểm, dựa trên số tiền và dựa trên tỷ lệ rủi ro-lợi nhuận. Độ tin cậy của giao dịch được cải thiện thông qua cơ chế xác nhận tín hiệu thứ cấp và giao dịch chỉ được thực hiện khi tín hiệu hợp lệ xuất hiện lần thứ hai.

Nguyên tắc chiến lược

Chiến lược này sử dụng sự kết hợp của ba chỉ báo kỹ thuật để xác định cơ hội giao dịch:

  1. Đường trung bình động hàm mũ 200 kỳ được sử dụng để xác định hướng xu hướng chung
  2. Dải Madrid (giao điểm của EMA 5 kỳ và EMA 100 kỳ) được sử dụng để xác định xu hướng trung hạn
  3. Kênh Donchian đột phá cho thời điểm vào lệnh cụ thể

Điều kiện giao dịch dài hạn: giá cao hơn 200EMA, Dải Madrid chuyển sang tăng giá và giá vượt khỏi Kênh Donchian phía trên. Điều kiện giao dịch ngắn hạn: giá dưới 200EMA, Dải Madrid chuyển sang giảm giá và giá phá vỡ Kênh Donchian thấp hơn. Để giảm tín hiệu sai, chiến lược này chỉ thực hiện giao dịch khi tín hiệu hợp lệ xuất hiện lần thứ hai.

Lợi thế chiến lược

  1. Hệ thống quản lý dừng lỗ và dừng lãi linh hoạt, có thể chuyển đổi chế độ theo các phong cách giao dịch khác nhau
  2. Sự kết hợp của nhiều chỉ báo kỹ thuật cung cấp tín hiệu giao dịch đáng tin cậy hơn
  3. Cơ chế xác nhận thứ cấp làm giảm hiệu quả tác động của tín hiệu sai
  4. Chiến lược này hoàn toàn tránh được sự thiên vị nhìn về phía trước và không có vấn đề gì khi vẽ lại.
  5. Có khả năng tùy chỉnh cao để thích ứng với các môi trường thị trường khác nhau

Rủi ro chiến lược

  1. Một sự thoái lui lớn hơn có thể xảy ra khi xu hướng đảo ngược Giải pháp: Bạn có thể cải thiện độ nhạy của chiến lược bằng cách điều chỉnh các thông số chỉ báo
  2. Việc quá phụ thuộc vào các chỉ báo kỹ thuật có thể dẫn đến việc bỏ lỡ các cơ hội thị trường Giải pháp: Nên kết hợp phân tích cơ bản
  3. Mức dừng lỗ và chốt lời cố định có thể không phù hợp với mọi điều kiện thị trường Giải pháp: Điều chỉnh động mức chốt lời và dừng lỗ dựa trên sự biến động

Hướng tối ưu hóa chiến lược

  1. Giới thiệu các chỉ báo biến động để điều chỉnh mức chốt lời và dừng lỗ một cách linh hoạt
  2. Đã thêm phân tích âm lượng để cải thiện độ tin cậy của tín hiệu
  3. Thêm nhiều chỉ số tâm lý thị trường hơn
  4. Phát triển hệ thống tối ưu hóa tham số thích ứng
  5. Thêm các mô-đun quản lý rủi ro, chẳng hạn như kiểm soát mức giảm tối đa

Tóm tắt

Đây là chiến lược theo dõi xu hướng kết hợp nhiều chỉ báo kỹ thuật cổ điển, cải thiện tính ổn định của giao dịch thông qua cơ chế quản lý dừng lỗ, dừng lãi linh hoạt và cơ chế xác nhận thứ cấp. Khả năng tùy chỉnh cao của chiến lược cho phép nó thích ứng với nhiều môi trường thị trường và phong cách giao dịch khác nhau. Nên tiến hành kiểm tra dữ liệu lịch sử đầy đủ trước khi sử dụng thực tế và điều chỉnh cài đặt tham số theo đặc điểm cụ thể của thị trường.

Mã nguồn chiến lược
/*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)