Chiến lược này kết hợp các điểm trục SuperTrend và chỉ số ADX cho giao dịch tần số cao. Các đường SuperTrend tính toán động các mức hỗ trợ và kháng cự mới nhất để xác định xu hướng giá và tạo ra tín hiệu giao dịch. Chỉ số ADX đo cường độ xu hướng và hoạt động như một bộ lọc, chỉ giao dịch khi xu hướng đủ mạnh.
Tính toán các đường hỗ trợ và kháng cự trục trục. Lấy giá đóng cửa và thêm / trừ một phạm vi ATR trên và dưới. Việc phá vỡ các đường này báo hiệu đảo ngược xu hướng.
ADX xác định sức mạnh của xu hướng. Giá trị ADX cao cho thấy xu hướng mạnh mẽ.
Kết hợp cả hai cho các tín hiệu giao dịch. Đi dài / ngắn chỉ trên pivot break và ADX cao.
Ưu điểm của chiến lược này:
Đường siêu xu hướng năng động nhanh chóng xác định sự đột phá.
Bộ lọc ADX tránh các tín hiệu sai trong các thị trường giới hạn phạm vi.
Tỷ lệ rủi ro-lợi nhuận tốt và kiểm soát rút tiền.
Rủi ro của chiến lược này:
Các bước Gap có thể vô hiệu hóa đường SuperTrend.
Thiết lập ngưỡng ADX kém ảnh hưởng đến hiệu suất.
Tần suất giao dịch cao làm tăng chi phí giao dịch.
Giải pháp:
Tối ưu hóa các tham số để cho phép phạm vi đột phá rộng hơn.
Kiểm tra giá trị ADX tốt hơn.
Giảm tần suất giao dịch.
Các lĩnh vực cần cải thiện:
Tối ưu hóa hệ số ATR cho các đường dây mạnh mẽ hơn.
Kiểm tra các thông số ADX khác nhau.
Thêm stop-loss để giới hạn lỗ.
Chiến lược này kết hợp các điểm mạnh của SuperTrend và ADX để xác định các điểm đảo ngược xu hướng có khả năng cao, được lọc bởi ADX về chất lượng.
/*backtest start: 2023-02-12 00:00:00 end: 2024-02-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("STPP20 + ADX", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50) AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1) AtrPd=input(defval = 20, title = "ATR Period", minval=1) float ph = na float pl = na ph := pivothigh(PPprd, PPprd) pl := pivotlow(PPprd, PPprd) float center = na center := center[1] float lastpp = ph ? ph : pl ? pl : na if lastpp if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * atr(AtrPd)) Dn = center + (AtrFactor * atr(AtrPd)) float TUp = na float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 25 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 = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) outMA = sma(srcMA, lenMA) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy) // .order // Tuned version strategy.entry("Buy", strategy.long) if (sell) and (strategy.position_size > 0) strategy.order("Sell", false, when = sell)