이중 이동 평균의 크로스오버 전략

저자:차오장, 날짜: 2023-12-11 15:21:58
태그:

img

전반적인 설명

이중 이동 평균 크로스오버 전략은 트렌드를 따르는 전략으로, 다른 기간의 두 이동 평균의 크로스오버를 거래 신호로 사용합니다. 빠른 MA가 느린 MA보다 높거나 낮을 때 긴 또는 짧은 지위에 들어가 크로스오버 이후의 트렌드 방향을 결정합니다. 과도한 변동으로 인한 불필요한 거래 빈도를 줄이는 동시에 중장기 트렌드를 포착 할 수 있습니다.

전략 논리

이 전략은 두 개의 이동 평균을 사용합니다: 단기 가격 움직임을 포착하기 위해 짧은 기간 (15 기간) 을 가진 빠른 MA, 주요 트렌드 방향을 식별하기 위해 더 긴 기간 (21 기간) 을 가진 느린 MA. 거래 신호는 두 MA 사이의 교차에서 생성됩니다. 느린 MA 위에 있는 빠른 MA가 구매 신호를 주고, 아래에 있는 빠른 MA가 판매 신호를 주고.

MA 기간 조합을 조정함으로써 전략은 추세를 포착하는 시간 프레임을 조정할 수 있습니다. 짧은 MA 컴보는 단기 오스실레이션을 목표로하고 더 긴 MA 컴보는 소음을 필터링하여 장기 트렌드에만 초점을 맞출 수 있습니다.

이 전략은 또한 리스크 관리 모듈을 포함합니다. 이윤을 취하고, 손실을 멈추고, 손실을 멈추는 것을 포함합니다. 이들은 개별 거래의 최대 이익/손실을 제한하고 전반적인 위험을 포함합니다.

장점

이중 MA 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 간단한 논리와 이해하기/시행하기 쉬운 것
  2. 시장 조건에 적응할 수 있는 유연성
  3. 더 적은 거래 신호로 인한 안정성
  4. 스톱 로스를 통해 효과적인 리스크 제어
  5. MA, 위험 매개 변수 등에 대한 최적화 용이성

위험성

또한 고려해야 할 몇 가지 위험이 있습니다.

  1. 범위를 제한하는 시장에서 과도한 크로스오버와 거래 빈도
  2. 지연된 MAs는 가격 반전 지점을 놓치고 적시에 손실을 멈추지 못할 수 있습니다.
  3. 부득이한 손실을 초래하는 거짓 파업에 대한 취약성
  4. MAs의 지연으로 인한 일반적인 가격 추적의 부정확성.

이러한 약점은 신호 필터링, 트레일링 스톱 로스 등 최적화로 완화 될 수 있습니다.

더 나은 기회

이 전략은 다음과 같은 측면에서 향상 될 수 있습니다.

  1. 부피나 변동성에 필터를 추가하여 윙사브를 피합니다.
  2. 더 많은 MA 유형과 다양한 제품과 시간 틀에 맞게 정밀 조정 기간/수식을 테스트합니다.
  3. 가장 빠른 가격 추적을 위해 EMA, LWMA와 같은 MA 유형을 검토합니다.
  4. 기계 학습을 통해 MA 조정 및 스톱 손실 크기를 자동화합니다.
  5. 다른 스톱 로스 기법, 예를 들어, 격차, 평균 가격, 사다리.

이 증가는 승률을 크게 높이고 위험 조정 수익을 기대합니다.

결론

전체적으로, 이중 이동 평균 크로스오버 전략은 단순성과 유연성 및 제어 가능한 위험을 제공합니다. 구현 및 최적화 용이성은 이상적인 초기 양 전략으로 만듭니다. 반복적인 테스트와 조정으로 시간이 지남에 따라 견고한 시스템으로 진화 할 자격증이 있습니다.


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

더 많은