이 전략은 주로 트렌드를 식별하기 위해 이중 EMA 모멘텀과 DEMA 모멘텀의 크로스오버를 사용하며, 가짜 브레이크오프를 필터링하기 위해 ATR 변동성 지수를 통합하여 이중 모멘텀 지표와 변동성 필터링을 가진 양적 거래 전략을 구현합니다.
이 전략의 주요 구성 요소는 다음과 같습니다.
가격의 EMA와 DEMA를 이중 모멘텀 지표로 계산합니다. 더 긴 기간 EMA는 장기 트렌드를 반영하며, DEMA는 더 민감한 단기 모멘텀 지표로 사용됩니다. DEMA가 EMA를 넘을 때 구매 신호가 생성됩니다.
ATR 변동성 지수를 계산한다. ATR 값을 사용하여 시장 변동성과 유동성 조건을 결정한다. 변동성이 너무 높을 때 모멘텀 지표 신호를 필터링하여 잘못된 파장을 피한다.
ATR 변동성은 매개 변수화 된 이동 평균 선에 의해 높거나 낮다고 판단됩니다. 모멘텀 지표 신호는 ATR 변동성이 이동 평균 선 아래에있을 때만 활성화됩니다.
매개 변수들은 ATR 시간 프레임, ATR 길이, ATR 이동 평균의 종류와 길이를 제어합니다.
장기 포지션에 대한 스톱 로스, 수익 취득 및 후속 스톱 규칙을 설정합니다.
이중 EMA 필터는 기본 EMA 크로스 전략에 비해 잘못된 신호와 오버 트레이딩을 크게 줄일 수 있습니다. ATR 변동성 지수를 추가하면 사소한 변동으로부터 잘못된 신호를 효과적으로 필터링하고 함락되는 것을 피할 수 있습니다.
단일 모멘텀 지표와 비교하여 이중 설계는 판단 효과를 향상시킬 수 있습니다. 더 반응적인 단기 모멘텀 지표로서, 안정적인 장기 EMA와 결합된 DEMA는 신뢰할 수있는 콤보 신호를 형성합니다.
ATR 매개 변수를 조정하면 다른 틱어에 대한 적절한 변동성 임계값을 설정하여 전략 적응성을 향상시킬 수 있습니다.
가장 큰 위험은 잘못된 매개 변수 설정으로 인해 거래 신호가 너무 적을 수 있다는 것입니다. 너무 긴 DEMA와 EMA 길이나 너무 높은 ATR 변동성 문턱이 모두 실제 전략 성능을 약화시킬 수 있습니다. 최적의 매개 변수 조합을 찾기 위해 반복된 백테스트가 필요합니다.
또 다른 잠재적인 위험은 극단적인 시장 조건에서 가격 변동이 손실로 이어지는 ATR 매개 변수 제약을 위반할 수 있다는 것입니다. 필요한 경우 전략 실행을 일시 중단하기 위해 시장 이상에 대한 수동 모니터링이 필요합니다.
최적의 설정을 찾기 위해 서로 다른 운동량 지표 매개 변수 조합을 테스트합니다.
듀얼 EMA에서 MACD 또는 다른 지표로 모멘텀 지표를 대체하는 것을 시도하십시오.
전체 역사 ATR, 시장 변동성 지수 등과 같은 다른 변동성 지수 구성을 테스트합니다.
부피 필터링을 추가하여 잘못된 가격 유출의 위험을 피합니다.
스톱 로스 매커니즘을 최적화하고 수익을 취하여 리스크/이익 비율을 향상시킵니다.
이 전략은 탄탄한 이론적 기초와 동력 분석과 변동성 연구를 통합합니다. 매개 변수 조정 및 논리 최적화를 통해 안정적이고 신뢰할 수있는 알고리즘 거래 시스템이 될 수 있습니다. 명확한 거래 신호와 제어 가능한 위험으로 실시간 거래에서 검증하고 구현하는 것이 좋습니다.
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 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/ // © Qorbanjf //@version=4 strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true) // DEMA length = input(10, minval=1, title="DEMA LENGTH") src = input(close, title="Source") e1 = ema(src, length) e2 = ema(e1, length) dema1 = 2 * e1 - e2 plot(dema1, "DEMA", color=color.yellow) //EMA len = input(25, minval=1, title="EMA Length") srb = input(close, title="Source") offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) ema1 = ema(srb, len) plot(ema1, title="EMA", color=color.blue, offset=offset) // Inputs atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution) atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer) useMA = input(title = "Show Moving Average?", type = input.bool, defval = true) maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type") maLength = input(defval = 20, title = "Moving Average Period", minval = 1) //longLossPerc = input(title="Long Stop Loss (%)", // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 longTrailPerc = input(title="Trail stop loss (%)", type=input.float, minval=0.0, step=0.1, defval=50) * 0.01 longProfitPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=3000) / 100 // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2017, title = "From Year", minval = 2000) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30) atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback)) atrp = (atrValue/close)*100 // Moving Average Logic ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength)) // variables for enter position enterLong = crossover(dema1, ema1) and atrp < maFilter // variables for exit position sale = crossunder(dema1, ema1) // stop loss //longStopPrice = strategy.position_avg_price * (1 - longLossPerc) // trail stop // Determine trail stop loss prices longStopTrail = 0.0 longStopTrail := if (strategy.position_size > 0) stopValue = close * (1 - longTrailPerc) max(stopValue, longStopTrail[1]) else 0 //Take profit Percentage longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) //Enter trades when conditions are met strategy.entry(id="long", long=strategy.long, when=enterLong, comment="long") // strategy.close("long", when = sale, comment = "Sell") //place exit orders (only executed after trades are active) strategy.exit(id="sell", limit = longExitPrice, stop = longStopTrail, comment = "SL/TP")