리소스 로딩... 로딩...

동적 변동성 필터와 함께 멀티 EMA 트렌드 다음 전략

저자:차오장, 날짜: 2025-01-17 15:00:37
태그:EMATRATR

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

전반적인 설명

이 전략은 변동성 필터링과 트렌드 추적을 결합한 지능형 거래 시스템이다. 기하급수적인 이동 평균 (EMA) 을 사용하여 시장 트렌드를 식별하고, 진정한 범위 (TR) 및 동적 변동성 필터를 통해 입시 시기를 결정하고, 변동성에 기반한 동적 스톱 로스/트레이프 메커니즘을 사용하여 위험을 관리합니다. 이 전략은 두 가지 거래 모드를 지원합니다. 두개골과 스윙, 다른 시장 환경과 거래 스타일에 따라 유연하게 전환 할 수 있습니다.

전략 원칙

핵심 논리는 다음의 주요 구성 요소를 포함합니다. 트렌드 식별: 트렌드 필터로서 50 기간 EMA를 사용하며, EMA 위의 긴 포지션과 EMA 아래의 짧은 포지션을만 취합니다. 변동성 필터링: 진정한 범위 (TR) 의 EMA를 계산하고 조정 가능한 필터 계수 (예정 1.5) 를 사용하여 시장 소음을 필터합니다. 3. 입시 조건: 연속성 및 가속성 특성을 보여주기 위해 가격 움직임을 요구하는 세 개의 촛불의 분석을 결합합니다. 4. 스톱 로스/트레이프: 스칼프 모드의 현재 TR와 스윙 모드의 이전 최고/하위 기준으로 설정하여 역동적인 리스크 관리를 달성합니다.

전략적 장점

  1. 강한 적응력: 동적 변동성 필터링과 트렌드 추적을 결합하여 다른 시장 환경에 적응합니다.
  2. 포괄적 리스크 관리: 시장 특성에 따라 유연한 선택을 허용하는 두 가지 거래 방식에 동적인 스톱 로스/익기 메커니즘을 제공합니다.
  3. 좋은 매개 변수 조정성: 필터 계수와 트렌드 기간과 같은 주요 매개 변수는 거래 도구 특성에 따라 최적화 될 수 있습니다.
  4. 우수한 시각화: 명확한 구매/판매 신호 마커와 손해를 멈추고/이익을 취하는 레벨 디스플레이를 제공하여 무역을 쉽게 모니터링 할 수 있습니다.

전략 위험

  1. 트렌드 역전 위험: 트렌드 전환점에 연속적으로 중단될 수 있습니다.
  2. 거짓 파업 위험: 갑작스러운 변동성 증가시 잘못된 신호를 유발할 수 있습니다.
  3. 파라미터 민감도: 필터 계수 설정이 잘못되면 신호가 너무 많거나 너무 적을 수 있습니다.
  4. 미끄러짐 영향: 전략 성과에 영향을 미치는 빠른 시장에서 중요한 미끄러짐에 직면 할 수 있습니다.

전략 최적화 방향

  1. 트렌드 강도 필터링을 추가하십시오. ADX와 같은 지표를 도입하여 트렌드 강도를 평가하고 트렌드 다음 효과를 향상시킬 수 있습니다.
  2. 스톱 로스/트랙 프로피트 최적화: 더 많은 이익을 보호하기 위해 후속 스톱을 도입하는 것을 고려할 수 있습니다.
  3. 스윙 모드를 개선합니다. 중장기 보유 능력을 향상시키기 위해 더 많은 스윙 거래 특수한 조건을 추가 할 수 있습니다.
  4. 부피 분석을 추가합니다. 부피 변경을 결합하여 파업 유효성을 확인합니다.

요약

이 전략은 트렌드 추적, 변동성 필터링 및 동적 리스크 관리를 유기적으로 결합하여 완전한 거래 시스템을 구축합니다. 이 전략의 장점은 적응력, 제어 가능한 리스크에 있으며 상당한 최적화 잠재력을 제공합니다. 적절한 매개 변수 설정 및 적절한 거래 모드 선택을 통해 전략은 다른 시장 환경에서 안정적인 성능을 유지할 수 있습니다. 거래자는 라이브 거래 전에 철저한 백테스팅과 매개 변수 최적화를 수행하고 특정 거래 도구 특성에 따라 적절한 조정을 수행하는 것이 좋습니다.


/*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)

관련

더 많은