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 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.
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à:
Vẫn có một số rủi ro chủ yếu là trong các khía cạnh sau:
Để 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:
Vẫn còn chỗ cho việc tối ưu hóa hơn nữa, chủ yếu bao gồm:
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