Chiến lược này kết hợp chỉ số chuyển động theo hướng (ADX), chỉ số chuyển động theo hướng (DI +) và trung bình di chuyển nhanh và chậm để xác định hướng và thời gian nắm giữ thị trường. Nó thuộc về các chiến lược giao dịch theo xu hướng. Chiến lược có thể nắm bắt hiệu quả các điểm đảo ngược trong trung bình và ngắn hạn và hoạt động tốt trong thị trường biến động thấp và xu hướng rõ ràng.
Khái niệm cơ bản của chiến lược này là tạo ra tín hiệu mua khi đường +DI vượt qua trên đường ADX từ dưới lên, và tạo ra tín hiệu bán khi đường +DI vượt qua dưới đường ADX từ trên xuống. Do đó, chiến lược này dựa trên sự chéo chéo giữa DI và ADX để xác định xu hướng thị trường và điểm đảo ngược. Đồng thời, mối quan hệ giữa trung bình di chuyển nhanh và chậm được sử dụng để xác định xu hướng thị trường tổng thể.
Cụ thể, tín hiệu mua sẽ được kích hoạt khi các điều kiện sau được đáp ứng:
Một tín hiệu bán sẽ được kích hoạt khi các điều kiện sau được đáp ứng:
Chiến lược cũng kết hợp logic dừng lỗ để thoát khỏi tất cả các vị trí khi giá giảm xuống dưới mức dừng lỗ.
Chiến lược kết hợp các chỉ số DI, ADX và trung bình động để xác định hiệu quả các bước chuyển đổi trong xu hướng thị trường.
Có một số rủi ro cần lưu ý với chiến lược này:
Những rủi ro này có thể được giải quyết bằng cách tối ưu hóa ADX và các thông số trung bình động, điều chỉnh mức dừng lỗ, thêm các bộ lọc để xác nhận vv.
Có chỗ cho những cải tiến khác:
Nói chung, chiến lược xu hướng chéo ADX này khá ổn định, có khả năng nắm bắt hiệu quả các sự đảo ngược sớm, nhưng kiểm soát rủi ro là rất quan trọng. Tăng cường thêm các tham số, tuân thủ nghiêm ngặt các quy tắc nhập cảnh và dừng lỗ có thể dẫn đến lợi nhuận điều chỉnh rủi ro tốt. Chiến lược phù hợp với các tài khoản dài hạn nắm giữ các vị trí trung hạn đến ngắn hạn.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h 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/ // © mohanee //@version=4 //ADX strategy SmoothedTrueRange=0.00 SmoothedDirectionalMovementPlus=0.00 SmoothedDirectionalMovementMinus=0.00 strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3, initial_capital=10000, currency=currency.USD) len = input(11, title="ADX Length", minval=1) threshold = input(30, title="threshold", minval=5) fastEma=input(13, title="Fast EMA",minval=1, maxval=50) slowEma=input(55, title="Slow EMA",minval=10, maxval=200) stopLoss =input(8, title="Stop Loss",minval=1) // TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) plot(DIPlus, color=color.green, title="DI+") //plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") hline(threshold, color=color.black, linestyle=hline.style_dashed) fastEmaVal=ema(close,fastEma) slowEmaVal=ema(close,slowEma) //long condition longCondition= ADX < threshold and crossover(DIPlus,ADX) and fastEmaVal > slowEmaVal barcolor(longCondition ? color.yellow: na) strategy.entry(id="ADXLE", long=true, when= longCondition and strategy.position_size<1) barcolor(strategy.position_size>1 ? color.blue: na) bgcolor(strategy.position_size>1 ? color.blue: na) //Add strategy.entry(id="ADXLE", comment="Add", long=true, when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) //calculate stop Loss stopLossVal = strategy.position_avg_price - (strategy.position_avg_price*stopLoss*0.01) strategy.close(id="ADXLE",comment="SL Exit", when=close<stopLossVal) //close all on stop loss //exit condition exitCondition= ADX > threshold and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal strategy.close(id="ADXLE",comment="TPExitAll", qty=strategy.position_size , when= exitCondition) //close all