Tài nguyên đang được tải lên... tải...

Định hướng Multi-EMA theo chiến lược với bộ lọc biến động động động

Tác giả:ChaoZhang, Ngày: 2025-01-17 15:00:37
Tags:EMATRATR

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

Tổng quan

Chiến lược này là một hệ thống giao dịch thông minh kết hợp theo dõi xu hướng với lọc biến động. Nó xác định xu hướng thị trường bằng cách sử dụng Mức trung bình chuyển động (EMA), xác định thời gian vào thông qua True Range (TR) và bộ lọc biến động động, và quản lý rủi ro bằng cách sử dụng cơ chế dừng lỗ / lấy lợi nhuận dựa trên biến động. Chiến lược hỗ trợ hai chế độ giao dịch: Scalp và Swing, có thể được chuyển đổi linh hoạt dựa trên môi trường thị trường và phong cách giao dịch khác nhau.

Nguyên tắc chiến lược

Logic cốt lõi bao gồm các thành phần chính sau: 1. Xác định xu hướng: Sử dụng EMA 50 giai đoạn như một bộ lọc xu hướng, chỉ có các vị trí dài trên EMA và các vị trí ngắn dưới EMA. 2. Quá trình lọc biến động: Tính toán EMA của True Range (TR) và sử dụng hệ số lọc có thể điều chỉnh (bên mặc định 1.5) để lọc tiếng ồn thị trường. Điều kiện nhập cảnh: Kết hợp phân tích ba nến liên tiếp, yêu cầu chuyển động giá để hiển thị tính năng liên tục và tăng tốc. Dừng lỗ / lấy lợi nhuận: Được thiết lập dựa trên TR hiện tại trong chế độ da đầu và dựa trên mức cao / thấp trước đó trong chế độ swing, đạt được quản lý rủi ro năng động.

Ưu điểm chiến lược

  1. Khả năng thích nghi mạnh mẽ: Điều chỉnh với các môi trường thị trường khác nhau thông qua sự kết hợp của bộ lọc biến động năng động và theo xu hướng.
  2. Quản lý rủi ro toàn diện: Cung cấp các cơ chế dừng lỗ / lấy lợi nhuận năng động cho cả hai chế độ giao dịch, cho phép lựa chọn linh hoạt dựa trên đặc điểm thị trường.
  3. Khả năng điều chỉnh thông số tốt: Các thông số chính như hệ số lọc và thời gian xu hướng có thể được tối ưu hóa theo đặc điểm của công cụ giao dịch.
  4. Hiển thị xuất sắc: Cung cấp các dấu hiệu tín hiệu mua / bán rõ ràng và hiển thị mức dừng lỗ / lấy lợi nhuận để theo dõi giao dịch dễ dàng.

Rủi ro chiến lược

  1. Rủi ro đảo ngược xu hướng: Có thể gặp phải các sự dừng liên tiếp tại các điểm chuyển hướng xu hướng.
  2. Rủi ro phá vỡ sai: Có thể kích hoạt các tín hiệu sai trong khi biến động đột ngột tăng.
  3. Độ nhạy của tham số: Các thiết lập hệ số bộ lọc không đúng có thể dẫn đến quá nhiều hoặc quá ít tín hiệu.
  4. Tác động trượt: Có thể phải đối mặt với sự trượt đáng kể trên các thị trường nhanh, ảnh hưởng đến hiệu suất chiến lược.

Hướng dẫn tối ưu hóa chiến lược

  1. Thêm lọc sức mạnh xu hướng: Có thể giới thiệu các chỉ số như ADX để đánh giá sức mạnh xu hướng và cải thiện hiệu quả theo xu hướng.
  2. Tối ưu hóa Stop-Loss / Take-Profit: Có thể xem xét giới thiệu các điểm dừng để bảo vệ nhiều lợi nhuận hơn.
  3. Cải thiện chế độ chuyển đổi: Có thể thêm nhiều điều kiện cụ thể cho giao dịch chuyển đổi để tăng khả năng nắm giữ trung bình đến dài hạn.
  4. Thêm Phân tích khối lượng: Kết hợp các thay đổi khối lượng để xác nhận tính hợp lệ của sự đột phá.

Tóm lại

Chiến lược này xây dựng một hệ thống giao dịch hoàn chỉnh bằng cách kết hợp cơ bản theo xu hướng, lọc biến động và quản lý rủi ro năng động. Sức mạnh của nó nằm trong khả năng thích nghi, rủi ro có thể kiểm soát được, trong khi cung cấp tiềm năng tối ưu hóa đáng kể. Thông qua cài đặt tham số thích hợp và lựa chọn chế độ giao dịch thích hợp, chiến lược có thể duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau. Các nhà giao dịch được khuyên nên tiến hành kiểm tra kỹ lưỡng và tối ưu hóa tham số trước khi giao dịch trực tiếp và thực hiện các điều chỉnh thích hợp dựa trên các đặc điểm cụ thể của công cụ giao dịch.


/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-15 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Creativ3mindz

//@version=5
strategy("Scalp Slayer (I)", overlay=true)

// Input Parameters
filterNumber = input.float(1.5, "Filter Number", minval=1.0, maxval=10.0, tooltip="Higher = More aggressive Filter, Lower = Less aggressive")
emaTrendPeriod = input.int(50, "EMA Trend Period", minval=1, tooltip="Period for the EMA used for trend filtering")
lookbackPeriod = input.int(20, "Lookback Period for Highs/Lows", minval=1, tooltip="Period for determining recent highs/lows")
colorTP = input.color(title='Take Profit Color', defval=color.orange)
colorSL = input.color(title='Stop Loss Color', defval=color.red)

// Inputs for visibility
showBuyLabels = input.bool(true, title="Show Buy Labels")
showSellLabels = input.bool(true, title="Show Sell Labels")

// Alert Options
alertOnCondition = input.bool(true, title="Alert on Condition Met", tooltip="Enable to alert when condition is met")

// Trade Mode Toggle
tradeMode = input.bool(false, title="Trade Mode (ON = Swing, OFF = Scalp)", tooltip="Swing-mode you can use your own TP/SL.")

// Calculations
tr = high - low
ema = filterNumber * ta.ema(tr, 50)
trendEma = ta.ema(close, emaTrendPeriod)  // Calculate the EMA for the trend filter

// Highest and lowest high/low within lookback period for swing logic
swingHigh = ta.highest(high, lookbackPeriod)
swingLow = ta.lowest(low, lookbackPeriod)

// Variables to track the entry prices and SL/TP levels
var float entryPriceLong = na
var float entryPriceShort = na
var float targetPriceLong = na
var float targetPriceShort = na
var float stopLossLong = na
var float stopLossShort = na
var bool tradeActive = false

// Buy and Sell Conditions with Trend Filter
buyCondition = close > trendEma and  // Buy only if above the trend EMA
      close[2] > open[2] and close[1] > open[1] and close > open and 
      (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
      (math.abs(close - open) > math.abs(close[1] - open[1])) and 
      close > close[1] and close[1] > close[2] and tr > ema

sellCondition = close < trendEma and  // Sell only if below the trend EMA
       close[2] < open[2] and close[1] < open[1] and close < open and 
       (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
       (math.abs(close - open) > math.abs(close[1] - open[1])) and 
       close < close[1] and close[1] < close[2] and tr > ema

// Entry Rules
if (buyCondition and not tradeActive)
    entryPriceLong := close  // Track entry price for long position
    stopLossLong := tradeMode ? ta.lowest(low, lookbackPeriod) : swingLow  // Scalping: recent low, Swing: lowest low of lookback period
    targetPriceLong := tradeMode ? close + tr : swingHigh  // Scalping: close + ATR, Swing: highest high of lookback period
    tradeActive := true

if (sellCondition and not tradeActive)
    entryPriceShort := close  // Track entry price for short position
    stopLossShort := tradeMode ? ta.highest(high, lookbackPeriod) : swingHigh  // Scalping: recent high, Swing: highest high of lookback period
    targetPriceShort := tradeMode ? close - tr : swingLow  // Scalping: close - ATR, Swing: lowest low of lookback period
    tradeActive := true

// Take Profit and Stop Loss Logic
signalBuyTPPrint = (not na(entryPriceLong) and close >= targetPriceLong)
signalSellTPPrint = (not na(entryPriceShort) and close <= targetPriceShort)

signalBuySLPrint = (not na(entryPriceLong) and close <= stopLossLong)
signalSellSLPrint = (not na(entryPriceShort) and close >= stopLossShort)

if (signalBuyTPPrint or signalBuySLPrint)
    entryPriceLong := na  // Reset entry price for long position
    targetPriceLong := na  // Reset target price for long position
    stopLossLong := na  // Reset stop-loss for long position
    tradeActive := false

if (signalSellTPPrint or signalSellSLPrint)
    entryPriceShort := na  // Reset entry price for short position
    targetPriceShort := na  // Reset target price for short position
    stopLossShort := na  // Reset stop-loss for short position
    tradeActive := false

// Plot Buy and Sell Labels with Visibility Conditions
plotshape(showBuyLabels and buyCondition, "Buy", shape.labelup, location=location.belowbar, color=color.green, text="BUY", textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and sellCondition, "Sell", shape.labeldown, location=location.abovebar, color=color.red, text="SELL", textcolor=color.white, size=size.tiny)

// Plot Take Profit Flags
plotshape(showBuyLabels and signalBuyTPPrint, title="Take Profit (buys)", text="TP", style=shape.flag, location=location.abovebar, color=colorTP, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellTPPrint, title="Take Profit (sells)", text="TP", style=shape.flag, location=location.belowbar, color=colorTP, textcolor=color.white, size=size.tiny)

// Plot Stop Loss "X" Marker
plotshape(showBuyLabels and signalBuySLPrint, title="Stop Loss (buys)", text="X", style=shape.xcross, location=location.belowbar, color=colorSL, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellSLPrint, title="Stop Loss (sells)", text="X", style=shape.xcross, location=location.abovebar, color=colorSL, textcolor=color.white, size=size.tiny)

// Alerts

alertcondition(buyCondition and alertOnCondition, title="Buy Alert", message='{"content": "Buy {{ticker}} at {{close}}"}')
alertcondition(sellCondition and alertOnCondition, title="Sell Alert", message='{"content": "Sell {{ticker}} at {{close}}"}')
alertcondition(signalBuyTPPrint and alertOnCondition, title="Buy TP Alert", message='{"content": "Buy TP {{ticker}} at {{close}}"}')
alertcondition(signalSellTPPrint and alertOnCondition, title="Sell TP Alert", message='{"content": "Sell TP {{ticker}} at {{close}}"}')
alertcondition(signalBuySLPrint and alertOnCondition, title="Buy SL Alert", message='{"content": "Buy SL {{ticker}} at {{close}}"}')
alertcondition(signalSellSLPrint and alertOnCondition, title="Sell SL Alert", message='{"content": "Sell SL {{ticker}} at {{close}}"}')

if buyCondition
    strategy.entry("Enter Long", strategy.long)
else if sellCondition
    strategy.entry("Enter Short", strategy.short)

Có liên quan

Thêm nữa