트렌드 추적 이동 평균 크로스오버 전략

저자:차오장, 날짜: 2024-01-29 16:52:46
태그:

img

전반적인 설명

이 전략은 다른 동전 쌍과 함께 잘 작동하는 간단한 이동 평균 기반 전략이다. 이동 평균 오픈 가격과 종료 가격을 그래프화하고 두 라인이 서로 교차했는지 여부에 따라 긴 포지션을 입력하거나 종료하기로 결정합니다. 아이디어는 평균 종료 가격이 증가 할 때 포지션을 입력하여 가격의 상승 동력을 나타낼 수 있습니다. 평균 종료 가격이 감소 할 때 포지션을 종료하여 하락 동력을 나타낼 수 있습니다. 이것은 투기적이지만 때로는 가격 행동을 매우 잘 예측할 수 있습니다.

전략 논리

이 전략은 먼저 EMA, SMA, RMA, WMA 및 VWMA를 포함한 이동 평균의 유형을 선택합니다. 그런 다음 이동 평균의 룩백 기간을 설정합니다. 일반적으로 10 ~ 250 바 사이입니다. 이동 평균 유형과 룩백 기간의 다른 조합은 다른 동전 쌍에서 매우 다른 결과를 얻을 수 있습니다.

구체적인 거래 논리는 다음과 같습니다.

  1. 오픈 가격과 클로즈 가격의 이동 평균을 계산합니다.
  2. 클로즈 가격과 오픈 가격의 이동 평균 값을 비교합니다.
  3. 닫힌 가격 이동 평균이 오픈 가격 이동 평균을 넘으면 긴 포지션을 입력합니다.
  4. 긴 포지션을 닫는 경우 닫힌 가격 이동 평균이 개방 가격 이동 평균보다 낮습니다.

포지션에 진입하면 상승 가격 움직임의 신호로 간주되며 종료하면 하락 가격 움직임으로 간주됩니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 더 나은 특수성을 위해 다른 동전 쌍에 최적화 할 수있는 유연한 매개 변수 설정;
  2. 이해하기 쉽고 구현하기 쉬운 간단한 논리
  3. 일부 동전 쌍에서 매우 높은 수익을 얻을 수 있으며 일반적으로 안정성이 좋습니다.
  4. 다양한 지표를 표시하는 데 높은 사용자 정의성.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 일부 동전 쌍과 매개 변수에서 수익률과 안정성은 낮을 수 있습니다.
  2. 단기 가격 변동에 잘 대응할 수 없고, 높은 휘발성 동전들의 성과가 좋지 않다.
  3. 이동평균 뷰백 기간의 선택은 과학적으로 충분하지 않습니다. 다소 주관적입니다.

솔루션과 최적화:

  1. 12H, 1D와 같은 더 긴 시간 프레임을 사용하여 불필요한 거래를 줄이고 안정성을 향상시킵니다.
  2. 파라미터 최적화 함수를 추가하여 최적 파라미터를 위해 다른 파라미터 조합을 자동으로 테스트합니다.
  3. 이동 평균 뷰백 기간의 적응 선택을 추가하여 시스템이 자동으로 최적 기간을 결정하도록하십시오.

결론

요약하자면, 이것은 가격 추세와 굴곡점을 결정하기 위해 이동 평균 지표를 사용하는 간단한 전략입니다. 매개 변수를 조정함으로써 매우 좋은 결과를 얻을 수 있으며, 추가 개선 및 적용 가치가있는 효과적인 트렌드 추적 전략입니다. 그러나 위험 관리는 주목해야하며, 적절한 동전 쌍과 매개 변수를 선택하여 유용성을 극대화해야합니다.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Author @divonn1994

initial_balance = 100
strategy(title='Close v Open Moving Averages Strategy', shorttitle = 'Close v Open', overlay=true, pyramiding=0, default_qty_value=100, default_qty_type=strategy.percent_of_equity, precision=7, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent, initial_capital=initial_balance)

//Input for number of bars for moving average, Switch to choose moving average type, Display Options and Time Frame of trading----------------------------------------------------------------

bars = input.int(66, "Moving average length (number of bars)", minval=1, group='Strategy') //66 bars and VWMA for BTCUSD on 12 Hours.. 35 bars and VWMA for BTCUSD on 1 Day
strategy = input.string("VWMA", "Moving Average type", options = ["EMA", "SMA", "RMA", "WMA", "VWMA"], group='Strategy')

redOn = input.string("On", "Red Background Color On/Off", options = ["On", "Off"], group='Display')
greenOn = input.string("On", "Green Background Color On/Off", options = ["On", "Off"], group='Display')
maOn = input.string("On", "Moving Average Plot On/Off", options = ["On", "Off"], group='Display')

startMonth = input.int(title='Start Month 1-12 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=12, group='Beginning of Strategy')
startDate = input.int(title='Start Date 1-31 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=31, group='Beginning of Strategy')
startYear = input.int(title='Start Year 2000-2100 (set any start time to 0 for furthest date)', defval=2011, minval=2000, maxval=2100, group='Beginning of Strategy')

endMonth = input.int(title='End Month 1-12 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=12, group='End of Strategy')
endDate = input.int(title='End Date 1-31 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=31, group='End of Strategy')
endYear = input.int(title='End Year 2000-2100 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=2100, group='End of Strategy')

//Strategy Calculations-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

inDateRange = true

maMomentum = switch strategy
    "EMA" => (ta.ema(close, bars) > ta.ema(open, bars)) ? 1 : -1
    "SMA" => (ta.sma(close, bars) > ta.sma(open, bars)) ? 1 : -1
    "RMA" => (ta.rma(close, bars) > ta.rma(open, bars)) ? 1 : -1
    "WMA" => (ta.wma(close, bars) > ta.wma(open, bars)) ? 1 : -1
    "VWMA" => (ta.vwma(close, bars) > ta.vwma(open, bars)) ? 1 : -1
    =>
        runtime.error("No matching MA type found.")
        float(na)

openMA = switch strategy
    "EMA" => ta.ema(open, bars)
    "SMA" => ta.sma(open, bars)
    "RMA" => ta.rma(open, bars)
    "WMA" => ta.wma(open, bars)
    "VWMA" => ta.vwma(open, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)
        
closeMA = switch strategy
    "EMA" => ta.ema(close, bars)
    "SMA" => ta.sma(close, bars)
    "RMA" => ta.rma(close, bars)
    "WMA" => ta.wma(close, bars)
    "VWMA" => ta.vwma(close, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)

//Enter or Exit Positions--------------------------------------------------------------------------------------------------------------------------------------------------------------------

if ta.crossover(maMomentum, 0)
    if inDateRange
        strategy.entry('long', strategy.long, comment='long')
if ta.crossunder(maMomentum, 0)
    if inDateRange
        strategy.close('long')

//Plot Strategy Behavior---------------------------------------------------------------------------------------------------------------------------------------------------------------------

plot(series = maOn == "On" ? openMA : na, title = "Open moving Average", color = color.new(color.purple,0), linewidth=3, offset=1)
plot(series = maOn == "On" ? closeMA : na, title = "Close Moving Average", color = color.new(color.white,0), linewidth=2, offset=1)
bgcolor(color = inDateRange and (greenOn == "On") and maMomentum > 0 ? color.new(color.green,75) : inDateRange and (redOn == "On") and maMomentum <= 0 ? color.new(color.red,75) : na, offset=1)

더 많은