이 전략의 핵심 아이디어는 복수의 기하급수적 이동 평균 (EMA) 의 크로스오버를 기반으로 거래 신호를 생성하는 것입니다. 단기 EMA가 아래에서 장기 EMA를 넘을 때 길게 이동하고, 단기 EMA가 장기 EMA를 넘을 때 포지션을 닫습니다. 이 전략은 여러 EMA 기간을 구성 할 수 있으며 각 EMA는 독립적으로 활성화 될 수 있습니다. 전략은 모든 활성화 된 EMA에서 크로스오버를 거래합니다.
다중 시간 프레임 동적 EMA 거래 전략
이 전략은 8일, 13일, 21일, 34일, 55일, 89일, 144일, 233일 8개의 EMA 기간을 설정합니다. 이 EMA는 독립적으로 활성화 또는 비활성화 될 수 있습니다.
단기 EMA가 아래에서 장기 EMA를 넘을 때 긴 신호를 생성합니다. 단기 EMA가 위에서 장기 EMA를 넘을 때 출구 신호를 생성합니다. 따라서 두 개의 EMA가 활성화되면, 짧은 EMA > 더 긴 EMA는 긴 신호이며, 짧은 EMA < 더 긴 EMA는 출구 신호입니다.
예를 들어, 55일 EMA와 89일 EMA가 활성화되면, 55일 EMA가 89일 EMA를 넘어서면 전략이 길게 진행되며, 55일 EMA가 89일 EMA를 넘어서면 종료됩니다. 이것은 전략이 사용된 EMA 조합을 동적으로 조정하여 더 긴 시간 프레임에서 더 짧은 시간 프레임으로 전환하거나 그 반대의 경우입니다.
포지션 크기는 계정 자기자본을 닫기 (close) 에 나누고 허용된 EMA의 수로 나누는 것으로 설정됩니다. 이것은 각 EMA 크로스오버에 대한 포지션 크기가 동일하다는 것을 보장합니다.
EMA를 다른 지표와 결합하는 것을 고려하십시오. 예를 들어 채널 또는 오시레이터에서 신호를 필터하거나 트렌드 및 역전 지표를 통합하십시오. 또한 EMA 매개 변수를 최적화하는 것이 매우 중요합니다. 다른 시장에 대한 조정이 필요합니다.
이 전략은 몇 가지 측면에서 최적화 될 수 있습니다.
매개 변수 스캔을 통해 EMA 매개 변수를 최적화하고 앞으로 걸어가는 분석을 통해 가장 좋은 EMA 조합을 찾습니다.
거짓 신호를 피하기 위해 EMA 크로스오버에 필터 조건을 추가합니다. 예를 들어 볼륨 필터, 변동성 필터 등.
MACD, KDJ, 볼링거 밴드 같은 다른 지표와 결합하여 상호 보완성을 활용합니다.
시장 변동성이나 트렌드 강도에 따라 각 EMA의 포지션 크기를 동적으로 조정합니다.
최대의 리스크/이익 비율을 달성하기 위해 스톱 로스를 최적화하고 수익 수준을 취합니다.
전체적으로 이것은 EMA 크로스오버에서 신호를 생성하여 단기 및 중장기 트렌드를 파악하는 매우 간단하고 직설적인 전략입니다. 주요 장점은 트레이더들이 자신에게 적합한 EMA를 선택할 수 있도록 높은 구성성과 유연성에 있습니다. 그러나 EMA만으로는 가장 큰 위험이있는 잘못된 신호를 쉽게 줄 수 있습니다. 다른 지표와 매개 변수 최적화와 결합하면 더 나은 거래 성과를 얻을 수 있습니다.
/*backtest start: 2023-11-11 00:00:00 end: 2023-12-11 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMA Fan", shorttitle = "EMA Fan", overlay=true) // Revision: 1 // Author: @ToS_MavericK buyprice = 0.0 buyprice := buyprice[1] // === INPUT SMA === EMA1 = input(8) EMA2 = input(13) EMA3 = input(21) EMA4 = input(34) EMA5 = input(55) EMA6 = input(89) EMA7 = input(144) EMA8 = input(233) EnableEMA1 = input(true) EnableEMA2 = input(true) EnableEMA3 = input(true) EnableEMA4 = input(true) EnableEMA5 = input(true) EnableEMA6 = input(true) EnableEMA7 = input(true) EnableEMA8 = input(true) //Profit = input(defval = 5, type = integer, title = "Profit", minval = 1, step = 1) //StopLoss = input(defval = 15, type = integer, title = "StopLoss", minval = 1, step = 1) // === 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 = 2018, title = "From Year", minval = 2012) 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 = 2020, title = "To Year", minval = 2012) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" // === SERIES SETUP === vEMA1 = ema(close, EMA1) vEMA2 = ema(close, EMA2) vEMA3 = ema(close, EMA3) vEMA4 = ema(close, EMA4) vEMA5 = ema(close, EMA5) vEMA6 = ema(close, EMA6) vEMA7 = ema(close, EMA7) vEMA8 = ema(close, EMA8) count = -1 if (EnableEMA1 == true) count := count + 1 if (EnableEMA2 == true) count := count + 1 if (EnableEMA3 == true) count := count + 1 if (EnableEMA4 == true) count := count + 1 if (EnableEMA5 == true) count := count + 1 if (EnableEMA6 == true) count := count + 1 if (EnableEMA7 == true) count := count + 1 if (EnableEMA8 == true) count := count + 1 // set position size Amount = 1 / (close * count) // === EXECUTION === strategy.entry("EMA1", strategy.long, qty = Amount, when = window() and crossover(vEMA1,vEMA2) and EnableEMA1 and EnableEMA2) strategy.close("EMA1", time > finish or crossunder(vEMA1,vEMA2)) strategy.entry("EMA2", strategy.long, qty = Amount, when = window() and crossover(vEMA2,vEMA3) and EnableEMA2 and EnableEMA3) strategy.close("EMA2", time > finish or crossunder(vEMA2,vEMA3)) strategy.entry("EMA3", strategy.long, qty = Amount, when = window() and crossover(vEMA3,vEMA4) and EnableEMA3 and EnableEMA4) strategy.close("EMA3", time > finish or crossunder(vEMA3,vEMA4)) strategy.entry("EMA4", strategy.long, qty = Amount, when = window() and crossover(vEMA4,vEMA5) and EnableEMA4 and EnableEMA5) strategy.close("EMA4", time > finish or crossunder(vEMA4,vEMA5)) strategy.entry("EMA5", strategy.long, qty = Amount, when = window() and crossover(vEMA5,vEMA6) and EnableEMA5 and EnableEMA6) strategy.close("EMA5", time > finish or crossunder(vEMA5,vEMA6)) strategy.entry("EMA6", strategy.long, qty = Amount, when = window() and crossover(vEMA6,vEMA7) and EnableEMA6 and EnableEMA7) strategy.close("EMA6", time > finish or crossunder(vEMA6,vEMA7)) strategy.entry("EMA7", strategy.long, qty = Amount, when = window() and crossover(vEMA7,vEMA8) and EnableEMA7 and EnableEMA8) strategy.close("EMA7", time > finish or crossunder(vEMA7,vEMA8)) plot(vEMA1, title = 'EMA1', color = red, linewidth = 2, style = line) // plot FastMA plot(vEMA2, title = 'EMA2', color = orange, linewidth = 2, style = line) // plot SlowMA plot(vEMA3, title = 'EMA3', color = yellow, linewidth = 2, style = line) // plot SlowMA plot(vEMA4, title = 'EMA4', color = green, linewidth = 2, style = line) // plot SlowMA plot(vEMA5, title = 'EMA5', color = teal, linewidth = 2, style = line) // plot SlowMA plot(vEMA6, title = 'EMA6', color = blue, linewidth = 2, style = line) // plot SlowMA plot(vEMA7, title = 'EMA7', color = maroon, linewidth = 2, style = line) // plot SlowMA plot(vEMA8, title = 'EMA8', color = white, linewidth = 2, style = line) // plot SlowMA //plot(long_stop, title = 'High-ATR', color = red, linewidth = 2, style = line) // plot SlowMA //plot(short_stop, title = 'Low+ATR', color = green, linewidth = 2, style = line) // plot SlowMA