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

저자:차오장, 날짜: 2023-10-07 15:18:44
태그:

전반적인 설명

이 트레이딩 전략은 이중 이동 평균 크로스오버를 기반으로 합니다. 빠른 이동 평균과 느린 이동 평균의 상호 작용을 사용하여 시장 트렌드를 결정하고 거래 신호를 생성합니다. 빠른 MA가 느린 MA보다 높을 때 구매 신호가 생성됩니다. 빠른 MA가 느린 MA보다 낮을 때 판매 신호가 생성됩니다.

원칙

이 전략은 주로 이동 평균의 트렌드 추적 기능을 활용합니다. 이동 평균은 역사적 폐쇄 가격에 기초하여 특정 기간 동안 계산된 평균 가격입니다. 그들은 내일 소액 변동을 부드럽게하고 더 큰 시간 프레임 트렌드를 반영 할 수 있습니다. 빠른 MA는 짧은 기간을 사용하고 가격 변화에 더 빠르게 반응 할 수 있습니다. 느린 MA는 더 긴 기간을 사용하고 장기 트렌드를 나타냅니다. 느린 MA 위에 빠른 MA가 넘어가면 단기 동력이 장기 트렌드를 깨고 상승 추세가 시작되는 것을 나타냅니다. 반대로 느린 MA 아래에 빠른 MA가 넘어가면 장기 트렌드가 압력을 받고 가격이 떨어질 수 있습니다.

이 전략은 다양한 사이클 길이의 이동 평균을 설정하고 크로스오버를 사용하여 거래 신호를 생성합니다. 단기 주기의 MA가 긴 사이클 MA보다 높을 때 단기 추진력을 향상시키는 신호를 표시하고 구매 신호를 생성합니다. 단기 주기의 MA가 긴 사이클 MA보다 낮을 때 단기 트렌드를 약화시키는 신호를 나타내고 판매 신호를 생성합니다. 전략 코드는 MA를 플롯 함수로 그래프하고, MA의 크로스오버를 결정하기 위해 트렌드 변수를 사용하여 크로스오버가 발생하면 구매 및 판매 신호를 출력합니다.

장점

  • 트렌드 변화를 결정하기 위해 MA 크로스를 사용하는 것은 간단하고 효과적인 기술입니다.
  • 시장 관리 기관은 시장 소음을 효과적으로 필터링하고 윙사브를 피할 수 있습니다.
  • 빠른 및 느린 MA 기간을 조정하면 다른 시장 조건에 적응할 수 있습니다.
  • 시각적으로 트렌드 신호와 전환점을 나타냅니다.
  • 이해하기 쉬운, 유연한 매개 변수 조정

위험성

  • 듀얼 MA 크로스오버는 시간 지연이 있고 전환점을 놓칠 수 있습니다.
  • 범위 시장에 적합하지 않습니다, 더 많은 잘못된 신호를 생성 할 수 있습니다
  • 부적절한 MA 기간 설정으로 인해 과민성 또는 느려질 수 있습니다.
  • 트렌드 컨텍스트와 타이밍을 확인하기 위해 다른 지표가 필요합니다.

최적화 방향

  • 다른 MA 기간 매개 변수들의 수익성을 평가하고 최적의 매개 변수를 선택합니다.
  • 채널 표시기, 촛불 패턴 등과 같은 다른 필터를 추가합니다.
  • 스톱 로스를 최적화하고 이윤을 취하기 위해 변동성 지표를 포함합니다.
  • 기계 학습 알고리즘을 사용하여 매개 변수와 규칙을 자동으로 최적화합니다.
  • 자동 주문 실행을 위한 알고리즘 거래 모듈을 추가합니다.

요약

이중 MA 크로스오버 전략은 이동 평균의 트렌드 추적 능력을 활용하고 그 크로스 기반의 신호를 생성합니다. 간단하고 직관적이면서도 몇 가지 결함이 있습니다. 파라미터 튜닝, 확인 추가, 알고리즘 최적화 등을 통해 극복 할 수 있습니다. 전반적으로 이중 MA 전략은 매우 고전적이고 사용하기 쉬운 트렌드 다음 전략입니다.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic


//@version=4
strategy("pomila", overlay=true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

더 많은