Chiến lược này sử dụng Bollinger Bands để xác định các điểm đột phá cho các giao dịch dài và ngắn, kết hợp với chỉ số ADX để lọc các điều kiện thị trường không thuận lợi biến động thấp, để theo dõi xu hướng.
Chiến lược này chủ yếu dựa trên chỉ số Bollinger Bands để xác định hướng dài hoặc ngắn. Dải giữa của Bollinger Bands là trung bình động N ngày của giá đóng cửa, và chiều rộng dải được tính bằng cách sử dụng độ lệch chuẩn. Một sự đột phá bên dưới dải dưới báo hiệu giao dịch dài, trong khi một sự đột phá bên trên dải trên báo hiệu giao dịch ngắn.
Để tránh việc phá vỡ không hợp lệ và giao dịch sai lầm trong các thị trường không có xu hướng, chiến lược kết hợp chỉ số ADX để lọc các điều kiện thị trường biến động thấp. Các tín hiệu giao dịch chỉ được tạo ra khi giá trị ADX dưới ngưỡng. Khi ADX vượt quá ngưỡng, tất cả các vị trí được đóng để chờ điều kiện xu hướng.
Chiến lược này cũng thiết lập stop loss và take profit cho các giao dịch mở. Cụ thể, sau khi mở một vị trí, giá thấp nhất và giá cao nhất của N ngày trước được ghi lại như mức stop loss và take profit cho hướng đó. Điều này cho phép khóa lợi nhuận trong khi giảm lỗ từ đảo ngược.
Từ logic mã, chiến lược đầu tiên tính toán Bollinger Bands và tham số ADX. Sau đó nó kiểm tra xem giá có phá vỡ Bands trên hoặc dưới băng và nếu ADX dưới ngưỡng, để tạo ra tín hiệu giao dịch. Sau đó mức dừng lỗ và lấy lợi nhuận được cập nhật và theo dõi dựa trên hướng vị trí hiện tại.
Xem xét kết hợp với các chỉ số khác để xác nhận đột phá với khối lượng; tối ưu hóa bộ lọc ADX bằng cách sử dụng độ dốc để xác định những thay đổi xu hướng; mở rộng phạm vi dừng lỗ và lấy lợi nhuận để tránh thoát sớm.
Chiến lược này có một logic rõ ràng và đơn giản, sử dụng Bollinger Bands cho các tín hiệu đột phá rõ ràng, được lọc bởi ADX cho các điều kiện xu hướng, để nắm bắt các cơ hội xu hướng. Dừng lỗ và lấy lợi nhuận được sử dụng để kiểm soát rủi ro và khóa lợi nhuận. Dễ hiểu và thực hiện, chiến lược đáng để thử nghiệm và tối ưu hóa thêm như một hệ thống theo xu hướng cơ bản.
/*backtest start: 2023-10-26 00:00:00 end: 2023-11-02 00:00:00 period: 1m basePeriod: 1m 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/ // © tweakerID // This strategy uses Bollinger Bands to buy when the price // crosses over the lower band and sell when it crosses down // the upper band. It only takes trades when the ADX is // below a certain level, and exits all trades when it's above it. //@version=4 strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100) //Inputs i_reverse=input(false, title="Reverse Trades") i_ADXClose=input(true, title="ADX Close") i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit") i_SwingLookback=input(20, title="Swing Lo/Hi Lookback") i_SLExpander=input(defval=0, step=.5, title="SL Expander") i_TPExpander=input(defval=0, step=.5, title="TP Expander") //ADX Calculations adxlen = input(14, title="ADX Smoothing") dilen = input(20, title="DI Length") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) adxlevel=input(30, step=5) //BB Calculations BBCALC=input(false, title="-----------BB Inputs-----------") length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) MAlen=input(defval=9) source = close basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Entry Logic BUY = crossover(source, lower) and sig < adxlevel SELL = crossunder(source, upper) and sig < adxlevel //SL & TP Calculations SwingLow=lowest(i_SwingLookback) SwingHigh=highest(i_SwingLookback) bought=strategy.position_size != strategy.position_size[1] LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander) SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander) lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander)) sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander) islong=strategy.position_size > 0 isshort=strategy.position_size < 0 SL= islong ? LSL : isshort ? SSL : na TP= islong ? lTP : isshort ? sTP : na //Entries strategy.entry("long", long=i_reverse?false:true, when=BUY) strategy.entry("short", long=i_reverse?true:false, when=SELL) //EXITS if i_ADXClose strategy.close_all(when=sig > adxlevel) if i_SL strategy.exit("longexit", "long", stop=SL, limit=TP) strategy.exit("shortexit", "short", stop=SL, limit=TP) //Plots plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL") plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP") plot(upper) plot(lower)