Chiến lược giao dịch dựa trên Bollinger Bands và MACD

Tác giả:ChaoZhang, Ngày: 2023-12-20 15:55:18
Tags:

img

Tổng quan

Chiến lược này kết hợp Bollinger Bands và chỉ số MACD để xác định các cơ hội bán quá mức và đảo ngược xu hướng cho giao dịch định lượng.

Chiến lược logic

Chiến lược này đầu tiên tính Bollinger Bands 20 ngày, bao gồm dải giữa, dải trên và dải dưới. Khi giá chạm vào dải dưới, nó coi thị trường quá bán. Tại thời điểm này, kết hợp với chỉ số MACD để đánh giá xem xu hướng có đảo ngược hay không. Nếu biểu đồ MACD vượt qua trên đường tín hiệu tích cực, nó xác định kết thúc vòng giảm này, tương ứng với tín hiệu mua.

Cụ thể, chạm vào dải dưới Bollinger và đường tín hiệu băng qua biểu đồ MACD sẽ kích hoạt tín hiệu mua đồng thời.

Phân tích lợi thế

Chiến lược này tích hợp các dải Bollinger để đánh giá vùng bán quá mức và MACD để xác định tín hiệu đảo ngược xu hướng, nhận ra giá nhập khẩu tương đối thấp.

Đặc biệt, những lợi thế là:

  1. Kết hợp Bollinger Bands vùng bán quá mức và chỉ số MACD để đạt được các điểm vào tốt hơn
  2. Sử dụng chỉ số MACD để xác định các điểm đảo ngược xu hướng, giảm xác suất đột phá sai
  3. Sử dụng phương pháp dừng lỗ / lấy lợi nhuận để kiểm soát rủi ro một cách hiệu quả

Phân tích rủi ro

Vẫn có một số rủi ro chủ yếu là trong các khía cạnh sau:

  1. Có khả năng phá vỡ Bollinger Bands có thể gây ra sự thất bại trong đánh giá vùng bán quá mức
  2. MACD histogram crossover cũng có thể là sai một với xác suất sai đánh giá
  3. Cài đặt vị trí stop loss có thể không phù hợp, hoặc quá lỏng lẻo hoặc nghiêm ngặt, dẫn đến bảo vệ không đủ hoặc stop loss sớm

Để bảo hiểm chống lại các rủi ro trên, chúng tôi có thể thực hiện các biện pháp sau:

  1. Kết hợp với các chỉ số khác để xác minh tính hợp lệ của tín hiệu Bollinger Bands breakout
  2. Thêm các chỉ số động lực vv như bộ lọc để tránh giao thoa MACD sai
  3. Tối ưu hóa và thử nghiệm các thông số dừng mất mát khác nhau

Hướng dẫn tối ưu hóa

Vẫn còn chỗ cho việc tối ưu hóa hơn nữa, chủ yếu bao gồm:

  1. Tối ưu hóa các thông số Bollinger Bands để tìm các chương trình đánh giá bán quá mức tốt hơn
  2. Thêm các bộ lọc chỉ số động lực để cải thiện tính hợp lệ của đánh giá MACD
  3. Kiểm tra các phương pháp dừng mất mát như ATR để tìm các thông số tốt hơn
  4. Thêm mô-đun đánh giá xu hướng để tránh giao dịch ngược xu hướng
  5. Kết hợp các phương pháp học máy để đào tạo các mô hình đánh giá và cải thiện hiệu suất chiến lược tổng thể

Kết luận

Chiến lược này tích hợp đánh giá vùng bán quá mức của Bollinger Bands và chỉ số đảo ngược xu hướng MACD để đạt được các điểm nhập cảnh tương đối tốt hơn. Nó cũng thiết lập các phương pháp dừng lỗ / lấy lợi nhuận để kiểm soát rủi ro. Đây là một chiến lược bán cao giá trị để tham khảo và tối ưu hóa. Kết hợp với nhiều bộ lọc chỉ số và phương pháp học máy, vẫn còn không gian để cải thiện hiệu suất của nó.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji

//@version=4
strategy("[KL] BOLL + MACD Strategy v2 (published)",overlay=true)

// BOLL bands {
BOLL_length = 20
BOLL_src = close
BOLL_mult = 2.0
BOLL_basis = sma(BOLL_src, BOLL_length)
BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_basis + BOLL_dev
BOLL_lower = BOLL_basis - BOLL_dev
BOLL_offset = 0
plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// MACD signals {
MACD_fastLen = 12
MACD_slowLen = 26
MACD_Len = 9
MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen)
aMACD = ema(MACD, MACD_Len)
MACD_delta = MACD - aMACD
// }
backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time)
//backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time)
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = atr(ATR_multi_len) * ATR_multi
risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var bar_count = 0 //number of bars since entry 
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0
    trail_profit_line_color := color.blue
    stop_loss_price := low
plot(stop_loss_price,color=trail_profit_line_color)
// } 

var touched_lower_bb = false

if true// and time <= backtest_timeframe_end
    if low <= BOLL_lower
        touched_lower_bb := true
    else if strategy.position_size > 0
        touched_lower_bb := false//reset state
    expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1])
    buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound

    //ENTRY:
    if strategy.position_size == 0 and buy_condition
        entry_price := close
        trailing_SL_buffer := ATR_buffer
        stop_loss_price := close - ATR_buffer
        strategy.entry("Long",strategy.long, comment="buy")
        bar_count := 0
    else if strategy.position_size > 0
        bar_count := bar_count + 1

    //EXIT: 
    // Case (A) hits trailing stop
    if strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
            stop_loss_price := 0
        else if close <= entry_price and bar_count
            strategy.close("Long", comment="stop loss")
            stop_loss_price := 0
        bar_count := 0
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
            stop_loss_price := 0
        bar_count := 0

Thêm nữa