이동 평균 크로스오버 전략 (moving average crossover strategy) 은 매우 고전적이고 일반적으로 사용되는 기술 분석 전략이다. 이 전략의 핵심 아이디어는 다른 기간의 이동 평균 사이의 크로스오버를 거래 신호로 사용하는 것이다. 단기 이동 평균이 아래에서 장기 이동 평균을 넘을 때 구매 신호가 생성된다. 단기 이동 평균이 위에서 장기 이동 평균을 넘을 때 판매 신호가 생성된다.
이 전략은 입력값을 사용하여 이동 평균의 종류 (SMA, EMA, WMA, RMA) 와 기간을 설정하고 백테스팅 시간 범위를 사용합니다.
다양한 유형의 이동 평균은 변수 함수에서 계산됩니다. 계산된 이동 평균은 ma 변수에 저장됩니다.
클로즈 가격이 ma를 넘을 때 구매 신호가 생성됩니다. 클로즈 가격이 ma를 넘을 때 판매 신호가 생성됩니다.
스톱 로스를 설정하기 위해, 14 기간 평균 진정한 범위 atr를 계산합니다. 기준으로 크로스오버 포인트를 받아, 스톱 로스 범위로 2 배 atr를 더하거나
구체적인 입출입 논리는 다음과 같습니다.
긴 입구: 마 이상과 백테스트 시간 범위 내에서 밀접한 교차점, 중지 손실 포인트는 입구 지점입니다.
긴 출구: 마 마이너스 2 배 atr 아래로 닫는 출구 또는 가장 높은 가격은 영업 출구에 대한 입구 지점을 닫고 2 배 atr를 초과합니다.
짧은 입력: 마 아래와 백테스트 시간 범위 내에서 닫는 교차, 중지 손실 포인트는 입력 포인트를 닫습니다
짧은 출구: 마 이상의 클로즈 크로스 + 2 배 atr Stop Loss 출구 또는 엔트리 포인트보다 낮은 최저 가격 클로즈 마이너스 2 배 atr Take Profit 출구
위험을 해결하기 위해 다음과 같은 측면에서 최적화를 할 수 있습니다.
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
이동 평균 크로스오버 전략은 매우 전형적이고 일반적으로 사용되는 기술 분석 전략이다. 전략의 핵심 아이디어는 간단하고 쉽게 구현할 수 있으며 다양한 시장에 적합하며 입문 수준의 양 거래 전략 중 하나입니다. 그러나 전략에는 빈번한 신호를 생성하고 손실을 멈추는 경향이있는 것과 같은 몇 가지 문제가 있습니다. 적절한 최적화로 성능을 크게 향상시킬 수 있습니다. 전반적으로 이동 평균 크로스오버 전략은 전략 개발에 매우 좋은 틀을 제공하고 양적 거래 전략 학습의 초석입니다.
/*backtest start: 2023-10-03 00:00:00 end: 2023-11-02 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA Cross Strategy", overlay=true,commission_value = 0.1) type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"]) length = input(28) source = close // === INPUT BACKTEST RANGE === FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2000, title = "From Year", minval = 2000) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" variant(type, src, len) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v5 = wma(src, len) // Weighted v7 = rma(src, len) // Smoothed type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1 ma = variant(type,source, length) atr = security(syminfo.tickerid, "D", atr(14)) range = valuewhen(cross(close,ma), (atr*2), na) ep = valuewhen(cross(close,ma), close, na) plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1) plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999) strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep ) strategy.exit("Long Exit", "Long Entry", stop = ep-range) strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] ) strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep ) strategy.exit("Short Exit", "Short Entry", stop = ep+range) strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )