이중 이동 평균 트렌드 전략

저자:차오장, 2024-03-22 13:56:44
태그:

img

전반적인 설명

이 전략은 시장 트렌드의 변화를 결정하기 위해 두 개의 이동 평균의 교차를 사용하여 트렌드 방향에 따라 구매/판매 결정을 내립니다. 단기 MA가 장기 MA보다 높을 때 길게 이동하고 단기 MA가 장기 MA보다 낮을 때 짧게 이동하여 트렌드를 따라가기를 목표로합니다.

전략 원칙

이 전략의 핵심은 두 개의 이동 평균입니다: 빠른 MA (부 default 기간 32) 및 느린 MA (또한 부 default 기간 32), 매개 변수를 통해 조정됩니다. 닫기 가격이 이 두 MA에 의해 형성 된 채널 위에 / 아래에 넘을 때, 트렌드 반전을 나타냅니다. 그리고 전략은 그에 따라 구매 / 판매 신호를 생성합니다.

  • 빠른 MA가 느린 MA를 넘어서면 길게 가세요
  • 빠른 MA가 느린 MA 아래로 넘어가면, 짧은 이동
  • 이미 긴 포지션을 보유하고 있는 경우, 빠른 MA가 느린 MA 아래로 넘어가면, 긴 포지션을 닫고 짧은 포지션을 가집니다.
  • 이미 짧은 포지션을 보유하고 있는 경우, 빠른 MA가 느린 MA를 넘으면, 짧은 포지션을 닫고 긴 포지션을 취합니다.

이 MA 크로스오버 방법을 통해 전략은 트렌드를 따라가며 상승 트렌드에서 긴 포지션과 하락 트렌드에서 짧은 포지션을 유지하여 반전 신호가 나타나기 전까지 할 수 있습니다.

이점 분석

  1. 트렌드 추적: 트렌드를 식별하기 위해 MA 크로스오버를 사용하여 전략은 주요 시장 트렌드를 효과적으로 파악하고 추적 할 수 있습니다.
  2. 간단하고 사용하기 쉬운: 전략 논리는 두 개의 MA만을 사용하여 명확합니다. 매개 변수 설정은 간단하고 이해하기 쉽고 마스터합니다.
  3. 폭넓은 적용 가능성: 전략은 다양한 도구와 시간 프레임에 광범위하게 적용되며 다양한 시장에서 사용할 수 있습니다.
  4. 적시에 스톱 로스: 트렌드가 역전되면 전략은 손실을 통제하기 위해 즉시 포지션을 닫을 수 있습니다.

위험 분석

  1. 시장에서 낮은 성과: 시장이 옆으로 움직일 때 빈번한 크로스오버 신호는 과도한 거래와 손실로 이어집니다.
  2. 극단적 움직임에 대한 부적절한 반응: 전략은 극단적 상황 (빠른 급증 또는 침몰과 같은) 에 너무 느리게 반응하여 큰 손실로 이어질 수 있습니다.
  3. 매개 변수 최적화의 어려움: MA 매개 변수를 최적화하는 데는 많은 양의 역사적 데이터와 백테스팅이 필요합니다. 최적화된 매개 변수는 미래 성능에 대한 제한된 지침을 가지고 있습니다.

이러한 위험을 해결하기 위해 ATR 또는 평균 진정한 범위 필터와 같은 적절한 필터를 추가하여 범위 시장에서 과잉 거래를 줄일 수 있으며 단일 거래 손실을 제어하기 위해 합리적인 스톱 손실을 설정하고 시장에 적응하기 위해 매개 변수를 지속적으로 최적화 할 수 있습니다. 그러나 전략의 고유 한계는 완전히 피하기가 어렵습니다.

최적화 방향

  1. 트렌드 확인: 거래 신호를 생성 한 후 MACD 또는 DMI와 같은 추가 트렌드 확인 지표가 추가로 신호를 필터링 할 수 있습니다.
  2. 동적 스톱 로스: 더 나은 위험 통제를 위해 고정 비율 또는 가격 스톱 대신 동적 스톱 로스 수준을 설정하기 위해 ATR와 같은 지표를 사용하십시오.
  3. 포지션 크기: 트렌드 강도, 변동성 및 기타 지표에 따라 포지션 크기를 동적으로 조정합니다. 트렌드가 강할 때 포지션을 증가시키고 약할 때 감소합니다.
  4. 다중 시간 프레임 분석: 매일 및 4 시간 MAs를 결합하는 것과 같은 다중 시간 프레임 MA 시스템을 고려하여 서로 필터링하고 확인하고 트렌드 식별의 정확성을 향상시킵니다.
  5. 적응적 매개 변수: 유전자 알고리즘과 같은 적응적 매개 변수 최적화 방법을 도입하여 전략 매개 변수가 다른 시장 조건에 적응 할 수 있도록합니다.

위의 최적화는 복잡한 시장을 처리 할 수있는 전략의 능력을 향상시킬 수 있지만 곡선 적합성과 미래 성과가 좋지 않을 수있는 과도한 최적화를 피하기 위해 주의해야합니다.

요약

이중 MA 트렌드 다음 전략은 MA 크로스오버를 통해 트렌드를 포착합니다. 간단하고 사용하기 쉽고 널리 적용됩니다. 그러나 시장 범위에서 성능이 좋지 않으며 극단적인 움직임에 적절히 반응하지 않으며 매개 변수 최적화에 어려움을 겪고 있습니다.

전략은 더 많은 필터링 지표, 동적 스톱 로스, 포지션 사이징, 멀티 타임프레임 분석 및 적응 매개 변수를 도입하여 최적화 할 수 있습니다. 그러나 MA 전략의 고유 한 한계는 완전히 피하기 어렵고 시장 특성에 따라 유연한 조정을 통해 실시간 거래에서 여전히 주의가 필요합니다.

전체적으로, 이 전략은 기본 트렌드를 따르는 전략으로 사용될 수 있지만, 단독으로 서 있는 것은 어렵고 전략 포트폴리오의 일부로 더 적합합니다.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)

// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true

// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)

// Calc MA for SSL Channel
calc_ma(close, len, type) =>
    float result = 0
    if type == 'SMA'  // Simple
        result := ta.sma(close, len)
        result
    if type == 'EMA'  // Exponential
        result := ta.ema(close, len)
        result
    if type == 'WMA'  // Weighted
        result := ta.wma(close, len)
        result    
    result

// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)

// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)

// Strategy
if shortCondition
    strategy.close('Long', comment='Long Exit', alert_message='JSON')

if longCondition
    strategy.close('Short', comment='Short Exit', alert_message='JSON')

if backtest_range and longCondition
    strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')

if backtest_range and shortCondition
    strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')


// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')


더 많은