이동 평균 크로스오버 전략

저자:차오장, 날짜: 2023-11-03 17:23:54
태그:

img

전반적인 설명

이동 평균 크로스오버 전략 (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 출구

전략 의 장점

  1. 전략 아이디어는 간단하고 명확하고 이해하기 쉽고 실행하기 쉽습니다
  2. 다양한 시장과 제품에 적합하며 널리 사용됩니다.
  3. 유연한 매개 변수 설정, 조정 가능한 이동 평균 유형 및 기간
  4. 위험 조절을 돕기 위해 ATR 스톱 로스를 사용

전략 의 위험

  1. 이동 평균 전략은 빈번한 거래와 스톱 로스를 생성하는 경향이 있으며 수익 잠재력을 감소시킵니다.
  2. 매우 변동적인 시장에서, 이동 평균은 잘못된 신호를 생성 할 수 있습니다.
  3. ATR 스톱 손실 범위 너무 넓거나 너무 좁을 수 있습니다, 거대한 손실을 방지하지

위험을 해결하기 위해 다음과 같은 측면에서 최적화를 할 수 있습니다.

  1. 이동 평균 기간을 조정, 더 긴 기간 이동 평균을 사용
  2. 휘발성 시장에서 빈번한 거래를 피하기 위해 필터 조건을 추가합니다.
  3. ATR 매개 변수를 최적화하거나 다른 중지 손실 방법을 사용
  4. 전체 트렌드를 결정하기 위해 트렌드 지표를 결합하고, 역 트렌드 거래를 피하십시오.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 비합리적인 파장을 피하기 위해 부피, 변동성 같은 필터 조건을 추가합니다.
  2. 적응형 ATR 스톱 로스를 사용 하 여 시장 변동과 함께 스톱 로스 범위가 변경 됩니다
  3. 신호 품질을 향상시키기 위해 여러 요소 확인을 위해 Stoch, RSI 및 기타 지표를 결합하십시오.
  4. 트렌드 반대 거래를 피하기 위해 트렌드 결정을 추가합니다.
  5. 시간 출구를 사용하여 너무 오랫동안 패자를 유지하는 것을 피하십시오.
  6. 가장 좋은 매개 변수 조합을 찾기 위해 이동 평균 기간 매개 변수를 최적화

요약

이동 평균 크로스오버 전략은 매우 전형적이고 일반적으로 사용되는 기술 분석 전략이다. 전략의 핵심 아이디어는 간단하고 쉽게 구현할 수 있으며 다양한 시장에 적합하며 입문 수준의 양 거래 전략 중 하나입니다. 그러나 전략에는 빈번한 신호를 생성하고 손실을 멈추는 경향이있는 것과 같은 몇 가지 문제가 있습니다. 적절한 최적화로 성능을 크게 향상시킬 수 있습니다. 전반적으로 이동 평균 크로스오버 전략은 전략 개발에 매우 좋은 틀을 제공하고 양적 거래 전략 학습의 초석입니다.


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


더 많은