
Chiến lược này sử dụng chỉ số Bollinger Bands để tìm các điểm phá vỡ không gian và kết hợp với chỉ số ADX để lọc các hành vi bất lợi của biến động giảm để thực hiện theo dõi xu hướng.
Chiến lược này chủ yếu dựa trên chỉ số Brin để đánh giá hướng trống. Đường trung tâm của Brin là đường trung bình di chuyển của giá đóng cửa vào ngày N, và băng thông được tính bằng chênh lệch tiêu chuẩn. Khi giá phá vỡ đường ray, đánh giá là tín hiệu đa đầu; Khi giá phá vỡ đường ray, đánh giá là tín hiệu trống.
Để tránh các giao dịch sai lầm do phá vỡ không hiệu quả của các xu hướng không theo xu hướng, chiến lược này kết hợp các chỉ số ADX để lọc các xu hướng biến động thấp. Chỉ khi ADX thấp hơn ngưỡng thiết lập, tín hiệu mua và bán sẽ được phát ra. Khi ADX cao hơn ngưỡng, tất cả các vị trí sẽ được xóa và chờ đợi xu hướng biến đổi.
Chiến lược này cũng đặt lệnh dừng lại và dừng lại theo dõi lên. Cụ thể, sau mỗi lần mở vị trí, giá thấp nhất trong ngày N trước đó sẽ được ghi lại là lệnh dừng lại theo hướng đó và giá cao nhất là lệnh dừng lại theo hướng lên. Điều này có thể khóa lợi nhuận và giảm thiểu thiệt hại do đảo ngược.
Từ logic của mã, chiến lược này đầu tiên tính toán các tham số chỉ số của vùng Brin và ADX. Sau đó, đánh giá xem giá có phá vỡ vùng Brin xuống đường hay không, đồng thời xem giá trị ADX có thấp hơn ngưỡng thấp hay không, và nếu đáp ứng, sẽ tạo ra tín hiệu mua và bán. Sau đó, tùy thuộc vào vị trí và hướng giữ vị trí, cập nhật và theo dõi điểm dừng lỗ trong thời gian thực.
Có thể xem xét kết hợp với các chỉ số khác để hỗ trợ giá trị phán đoán, đảm bảo phá vỡ VALID; tối ưu hóa điều kiện lọc ADX, sử dụng độ dốc đường cong ADX để đánh giá điểm chuyển hướng xu hướng; Giảm phạm vi dừng lỗ thích hợp, ngăn chặn quá gần bị dừng.
Chiến lược tổng thể được thiết kế rõ ràng và đơn giản, sử dụng Brin để đánh giá các tín hiệu phá vỡ đa không rõ ràng, và sử dụng chỉ số ADX để lọc các giao dịch Choppy không có xu hướng rõ ràng, do đó khóa cơ hội xu hướng. Đồng thời thiết lập dừng điều chỉnh và theo dõi dừng để kiểm soát rủi ro và khóa lợi nhuận. Chiến lược này dễ hiểu thực hiện, đáng để kiểm tra và tối ưu hóa hơn nữa, có thể trở thành chiến lược theo dõi 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)