Chiến lược phá vỡ đà phục hồi của mô hình ba đáy

EMA ATR MA SMA
Ngày tạo: 2025-01-10 15:49:30 sửa đổi lần cuối: 2025-01-10 15:49:30
sao chép: 0 Số nhấp chuột: 401
1
tập trung vào
1617
Người theo dõi

Chiến lược phá vỡ đà phục hồi của mô hình ba đáy

Tổng quan

Chiến lược này là hệ thống giao dịch định lượng dựa trên phân tích kỹ thuật, chủ yếu giao dịch bằng cách xác định các mô hình đáy ba và tín hiệu đột phá động lượng trên thị trường. Chiến lược này kết hợp nhiều chỉ báo kỹ thuật như đường trung bình động (MA), phạm vi thực (ATR), kênh giá, v.v. để xây dựng một hệ thống giao dịch hoàn chỉnh. Chiến lược này thực hiện việc nhận dạng tự động và thực hiện giao dịch của mô hình phục hồi đáy ba theo cách được lập trình.

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

Logic cốt lõi của chiến lược bao gồm các yếu tố chính sau:

  1. Sử dụng sự giao nhau của đường trung bình động nhanh (5 kỳ) và chậm (20 kỳ) để xác nhận hướng xu hướng thị trường
  2. Chương trình tự động xác định ba điểm thấp liên tiếp (low1, low2, low3) để tạo thành mô hình ba đáy
  3. Sử dụng chỉ báo ATR để tính toán độ biến động và thiết lập mức dừng lỗ và chốt lời động
  4. Sau lần chạm đáy thứ ba, khi giá phá vỡ mức cao phục hồi trước đó, kết hợp với tín hiệu giao cắt đường trung bình động, xác nhận thời điểm để mua vào.
  5. Tạo các kênh song song để trực quan hóa phạm vi biến động giá và cung cấp thêm các tham chiếu thị trường
  6. Thiết lập điều kiện dừng lỗ và chốt lời động dựa trên ATR tại thời điểm thực hiện giao dịch

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

  1. Kết hợp nhiều chỉ báo kỹ thuật để cải thiện độ tin cậy của tín hiệu giao dịch
  2. Sử dụng ATR để điều chỉnh động các vị thế dừng lỗ và chốt lời để thích ứng với những thay đổi trong biến động thị trường
  3. Tự động xác định các mô hình đáy ba để giảm tác động của phán đoán chủ quan
  4. Đặt giới hạn khoảng thời gian giao dịch để tránh giao dịch quá mức
  5. Cung cấp tham chiếu rõ ràng đến cấu trúc thị trường thông qua các công cụ trực quan hóa (kênh song song và nhãn)
  6. Logic chiến lược rõ ràng, dễ bảo trì và tối ưu hóa

Rủi ro chiến lược

  1. Tín hiệu sai có thể xảy ra trong thị trường biến động
  2. Quá trình xác định mô hình đáy ba có thể bị ảnh hưởng bởi tiếng ồn của thị trường
  3. Bội số ATR cố định có thể không phù hợp với mọi điều kiện thị trường
  4. Có thể xảy ra tổn thất liên tục trong thời kỳ có những thay đổi xu hướng mạnh mẽ
  5. Việc thiết lập khoảng thời gian giao dịch có thể bỏ lỡ một số tín hiệu hợp lệ

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

  1. Giới thiệu các chỉ báo khối lượng để xác nhận tính hợp lệ của sự phục hồi
  2. Điều chỉnh động bội số ATR theo các môi trường thị trường khác nhau
  3. Thêm bộ lọc cường độ xu hướng để cải thiện chất lượng tín hiệu giao dịch
  4. Tối ưu hóa thuật toán nhận dạng ba đáy để cải thiện độ chính xác
  5. Giới thiệu phân tích chu kỳ biến động thị trường và tối ưu hóa cài đặt khoảng thời gian giao dịch
  6. Hãy cân nhắc thêm phân tích đối xứng vào các mô hình giá

Tóm tắt

Chiến lược này triển khai chiến lược giao dịch đột phá phục hồi đáy ba theo cách có chương trình, kết hợp nhiều chỉ báo kỹ thuật và phương pháp quản lý rủi ro, có tính thực tiễn cao. Thông qua quá trình tối ưu hóa và cải tiến liên tục, chiến lược này dự kiến ​​sẽ đạt được hiệu suất giao dịch thực tế tốt hơn. Nên tiến hành xác minh kiểm tra ngược đầy đủ trước khi giao dịch thực tế và điều chỉnh cài đặt tham số theo điều kiện thị trường cụ thể.

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=5
strategy("反彈三次突破策略", overlay=true, initial_capital=100000, commission_value=0.001425, slippage=1)

// === 參數設定 ===
fast_length = input.int(5, title="快速均線週期")
slow_length = input.int(20, title="慢速均線週期")
atr_period = input.int(14, title="ATR 週期")
atr_factor = input.float(2.0, title="ATR 因子")
profit_factor = input.float(2.0, title="止盈因子")

// === 計算均線 ===
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.ema(close, slow_length)

// === 均線交叉訊號 ===
long_signal = ta.crossover(fast_ma, slow_ma)
short_signal = ta.crossunder(fast_ma, slow_ma)

// === 計算 ATR ===
atr = ta.atr(atr_period)

// === 反彈三次突破策略 ===
var float low1 = na
var float low2 = na
var float low3 = na
var bool trend_down = false
var bool long_breakout = false
var line lower_line = na
var line upper_line = na

if (na(low1) or na(low2) or na(low3))
    // 初始化低點
    low1 := na
    low2 := na
    low3 := na

if (close < low3 or na(low3))
    // 更新低點
    low1 := low2
    low2 := low3
    low3 := close
    trend_down := true

if (trend_down and close > low2 and close > low1)
    // 確認反轉且第三次反彈比第二次高
    trend_down := false
    long_breakout := true

// 清除前一個反彈通道
if (not na(lower_line))
    line.delete(lower_line)
if (not na(upper_line))
    line.delete(upper_line)

// 繪製新的反彈通道
if (not na(low1) and not na(low3))    
    lower_line := line.new(x1=bar_index[2], y1=low1, x2=bar_index, y2=low3, color=color.yellow, width=2)
    upper_line := line.new(x1=bar_index[2], y1=low1 + (low3 - low1), x2=bar_index, y2=low3 + (low3 - low1), color=color.yellow, width=2)

// === 進出場條件 ===
var float last_long_exit = na
var float last_short_exit = na
var float stop_loss_long = na
var float take_profit_long = na
var float stop_loss_short = na
var float take_profit_short = na

var label stop_loss_label_long = na
var label take_profit_label_long = na
var label stop_loss_label_short = na
var label take_profit_label_short = na

if (long_signal or long_breakout)
    if na(last_short_exit) or (time - last_short_exit) > 2 * 60 * 60 * 1000  // 確保多頭出場後有一段時間間隔
        // 做多
        strategy.entry("做多", strategy.long)
        // 止損設置為最近低點下方
        stop_loss_long := low3 - atr_factor * atr
        take_profit_long := close + profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做多", stop=stop_loss_long, limit=take_profit_long)
        last_long_exit := time  // 記錄多頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_long))
            label.delete(stop_loss_label_long)
        if (not na(take_profit_label_long))
            label.delete(take_profit_label_long)

        // 繪製新的止盈止損標籤
        stop_loss_label_long := label.new(x=bar_index, y=stop_loss_long, text=str.tostring(math.round(stop_loss_long * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_long := label.new(x=bar_index, y=take_profit_long, text=str.tostring(math.round(take_profit_long * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)

if (short_signal)
    if na(last_long_exit) or (time - last_long_exit) > 2 * 60 * 60 * 1000  // 確保空頭出場後有一段時間間隔
        // 做空
        strategy.entry("做空", strategy.short)
        // 止損設置為最近高點上方
        stop_loss_short := high + atr_factor * atr
        take_profit_short := close - profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做空", stop=stop_loss_short, limit=take_profit_short)
        last_short_exit := time  // 記錄空頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_short))
            label.delete(stop_loss_label_short)
        if (not na(take_profit_label_short))
            label.delete(take_profit_label_short)

        // 繪製新的止盈止損標籤
        stop_loss_label_short := label.new(x=bar_index, y=stop_loss_short, text=str.tostring(math.round(stop_loss_short * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_short := label.new(x=bar_index, y=take_profit_short, text=str.tostring(math.round(take_profit_short * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)