
이 전략의 핵심 아이디어는 여러 지수 이동 평균 (EMA) 의 교차를 기반으로 거래 신호를 생성하는 것입니다. 단기 EMA에서 더 긴 EMA를 착용 할 때, 더 많이; 단기 EMA 아래에서 더 긴 EMA를 착용 할 때, 평점. 이 전략은 여러 EMA 주기를 구성 할 수 있으며, 각 EMA는 독립적으로 활성화 될 수 있으며, 전략은 모든 활성화 된 EMA에서 교차 거래를합니다.
이 전략은 8개의 EMA 주기를 설정하고 있는데, 각각 8일선, 13일선, 21일선, 34일선, 55일선, 89일선, 144일선, 233일선이다. 이 EMA는 독립적으로 활성화 또는 비활성화될 수 있도록 구성되어 있다.
더 짧은 EMA가 아래에서 더 긴 EMA를 뚫을 때, 구매 신호를 생성한다. 더 짧은 EMA가 위에서 아래에서 더 긴 EMA를 뚫을 때, 판매 신호를 생성한다. 두 개의 EMA가 모두 활성화되면, shorterEMA > longerEMA가 다중 신호로, shorterEMA
예를 들어, 55일 EMA와 89일 EMA를 활성화하면, 55일 EMA 위에 89일 EMA를 입으면, 더 많이 하고, 55일 EMA 아래에 89일 EMA를 입으면, 평점으로 한다. 이것은 이 전략의 동적으로 사용된 EMA 조합을 조정하여, 더 긴 주기에서 더 짧은 주기로 전환하거나, 또는 반대로 한다.
포지션 수를 계정 적당금으로 설정하여 close로 나눈 다음 EMA 그룹을 활성화하는 횟수로 나눈다. 이것은 각 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