Chiến lược khớp trung bình động kép dựa trên Bollinger Bands là một chiến lược theo xu hướng chạy với giá và khối lượng trên thị trường. Nó sử dụng sự chéo chéo của Bollinger Bands và trung bình động như các tín hiệu giao dịch để thực hiện một chiến lược định lượng có thể tự động xác định xu hướng thị trường và giao dịch với các quy tắc dừng lợi nhuận và dừng lỗ.
Chiến lược này chủ yếu dựa trên các tín hiệu chéo của chỉ số Bollinger Bands và chỉ số trung bình động cho giao dịch. Cụ thể, nó sử dụng đường ray giữa, đường ray trên của Bollinger Bands và 7 đường trung bình động với độ dài từ 5 đến 200 ngày cùng một lúc. Nó tạo ra tín hiệu mua khi giá vượt qua đường ray giữa và dưới của Bollinger Bands từ dưới lên trên; nó tạo ra tín hiệu bán khi giá vượt qua đường ray trên của Bollinger Bands từ trên lên để đạt được xu hướng sau.
Ngoài ra, chiến lược cũng giới thiệu chỉ số moveToFract để đánh giá các vị trí dài và ngắn. Chỉ số này xác định xu hướng thị trường hiện tại là tăng hay giảm bằng cách tính toán thứ tự sắp xếp các đường trung bình động ngắn hạn và dài hạn, do đó tránh tạo ra các tín hiệu sai trong các thị trường giới hạn phạm vi. Cuối cùng, kết hợp với các quy tắc dừng lợi nhuận và dừng lỗ có thể cấu hình, nó tạo thành một xu hướng hoàn chỉnh hơn sau chiến lược giao dịch.
Nói chung, đây là một chiến lược theo xu hướng rất thực tế. Nó sử dụng crossover chỉ số để ra quyết định, và cũng kết hợp một mô-đun đánh giá xu hướng để lọc hiệu quả các tín hiệu sai. Sau khi cấu hình stop profit và stop loss, nó có thể hoàn toàn theo xu hướng giao dịch và có lợi nhuận tốt. Bằng cách điều chỉnh các kết hợp tham số và thêm nhiều bộ lọc, chiến lược này có thể được tối ưu hóa hơn nữa để thích nghi với nhiều môi trường thị trường hơn, và có nhiều cơ hội để cải thiện và triển vọng ứng dụng.
/*backtest start: 2023-10-24 00:00:00 end: 2023-11-23 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"]) LookbackPeriod = input(30, minval=10,step=10) BBStdDev = input(2, minval=1, maxval=10, step=0.5) BBLength = input(60, minval=5, step=5) atrLength = input(22) atrMult = input(6) tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) backtestYears = input(10, minval=1, step=1) includePartiallyAligned = true f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma f_getTrailingStop(atr, atrMult)=> stop = close - atrMult*atr stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop stop f_getMaAlignment(MAType, includePartiallyAligned)=> ma5 = f_getMovingAverage(close,MAType,5) ma10 = f_getMovingAverage(close,MAType,10) ma20 = f_getMovingAverage(close,MAType,20) ma30 = f_getMovingAverage(close,MAType,30) ma50 = f_getMovingAverage(close,MAType,50) ma100 = f_getMovingAverage(close,MAType,100) ma200 = f_getMovingAverage(close,MAType,200) upwardScore = 0 upwardScore := close > ma5? upwardScore+1:upwardScore upwardScore := ma5 > ma10? upwardScore+1:upwardScore upwardScore := ma10 > ma20? upwardScore+1:upwardScore upwardScore := ma20 > ma30? upwardScore+1:upwardScore upwardScore := ma30 > ma50? upwardScore+1:upwardScore upwardScore := ma50 > ma100? upwardScore+1:upwardScore upwardScore := ma100 > ma200? upwardScore+1:upwardScore upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200 downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200 upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0 inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0) exitBySignal = exitType == "Signal" or exitType == "Both" exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both" maAlignment = f_getMaAlignment(MAType,includePartiallyAligned) atr = atr(atrLength) trailingStop = f_getTrailingStop(atr, atrMult) maAligned = highest(maAlignment,LookbackPeriod) [middle, upper, lower] = bb(close, BBLength, BBStdDev) buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle)) buyExitCondition = crossunder(close, upper) strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy") strategy.close("Buy", when=buyExitCondition and exitBySignal) strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )