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

저자:차오장, 날짜: 2023-11-13 10:55:09
태그:

img

전반적인 설명

이중 이동 평균 크로스오버 전략 (Dual Moving Average Crossover Strategy) 은 트렌드를 따르는 일반적인 전략이다. 트렌드 방향을 파악하고 크로스오버에 따라 거래 신호를 생성하기 위해 서로 다른 기간의 두 이동 평균을 사용합니다. 구체적으로, 짧은 기간 이동 평균이 긴 기간 중 하나를 넘을 때, 상승 추세를 나타내는 황금 십자가가 형성됩니다. 반대로, 짧은 MA가 더 긴 MA를 넘을 때, 하락 추세를 나타내는 죽음의 십자가가 형성됩니다.

전략 논리

이 전략은 주로 6주기, 14주기, 25주기 및 80주기 EMA 라인을 이용합니다. 먼저 이러한 MA 값을 계산하고, 6주기 EMA와 다른 세 개의 MA 사이의 교차에 기초하여 트렌드 방향을 식별합니다.

6주기 EMA가 14주기 또는 25주기 EMA를 넘어서 80주기 EMA를 넘어서면 구매 신호가 생성됩니다. 이것은 단기 MA가 중장기 MAs를 깨고 상승 추세가 시작될 수 있음을 나타냅니다. 따라서 구매를 고려할 수 있습니다.

반대로, 6주기 EMA가 14주기 또는 25주기 EMA보다 낮을 때, 80주기 EMA보다 낮을 때, 판매 신호가 생성됩니다. 이것은 단기 MA가 중장기 MA에 의해 깨지고 하락 추세가 시작될 수 있음을 나타냅니다. 그래서 우리는 판매를 고려할 수 있습니다.

신호가 생성되면 전략은 긴 또는 짧은 포지션을 열고 손실이 위험을 제어하기 위해 임계치를 초과하면 포지션을 종료하는 중지 손실 로직을 가지고 있습니다.

이점 분석

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

  1. 트렌드를 결정하기 위해 MA 크로스오버를 사용하는 것은 성숙하고 신뢰할 수 있는 기술 지표입니다.

  2. 여러 시간 프레임을 결합하면 잘못된 신호가 감소합니다. 6 기간 MA는 신호를 생성하고, 14 기간, 25 기간 MA는 확인하고, 80 기간 MA는 전체 추세를 정의합니다.

  3. 스톱 로즈는 위험을 통제하고 자본을 효과적으로 보호합니다.

  4. 논리는 간단하고 명확하고 이해하기 쉽고 검증하기 쉽습니다.

  5. MA 기간은 변화하는 시장 조건에 최적화 할 수 있습니다.

위험 분석

이 전략의 일부 위험은 다음과 같습니다.

  1. 가격은 범위 동안 MA 주위를 수 있으며 과도한 유효하지 않은 신호를 생성 할 수 있습니다.

  2. 고정 스톱 손실은 너무 딱딱할 수 있습니다. 대신 트레일링 스톱 또는 동적 스톱을 사용하는 것을 고려하십시오.

  3. 갑작스러운 가격 격차에 의해 스톱 손실이 발생할 위험이 있습니다. 그러한 경우 스톱 손실을 건너뛰기 위해 추가 논리를 추가하십시오.

  4. 단기 가격 변동에 반응할 수 없습니다. 다른 지표를 사용하여 필터를 추가합니다.

  5. 최적화 공간이 제한되어 있습니다. 적응적인 이동 평균을 사용해보세요.

최적화 방향

전략을 최적화하는 몇 가지 방법:

  1. 시장에 더 민감한 매개 변수를 찾기 위해 다른 MA 기간 조합을 테스트합니다.

  2. 스톱 러닝 위험을 줄이기 위해 후속 또는 동적 스톱을 사용하여 스톱 러닝 메커니즘을 개선하십시오.

  3. KDJ, MACD와 같은 필터 지표를 추가하여 범위 중 과도한 거래를 피합니다.

  4. 입력 규칙을 최적화하고, 잘못된 신호를 줄이기 위해 입력하기 전에 MA 크로스오버가 완전히 형성될 때까지 기다립니다.

  5. 변동성 기준으로 자동으로 기간을 조정하는 적응 이동 평균을 사용하십시오.

  6. 포지션 크기를 시장 조건에 따라 조정하기 위해 포지션 크기를 조정하는 규칙을 추가합니다.

  7. 이윤을 취득하는 출구를 포함합니다.

요약

요약하자면, 이 이중 이동 평균 크로스오버 전략은 간단한 MA 크로스오버 논리를 기반으로 트렌드 방향을 쉽게 식별하고 통제 가능한 위험을 가지고 있습니다. 중장기 트렌드를 추적하는 데 적합합니다. 그러나 전략은 엔트리 규칙, 스톱 손실 기술, 필터 조건 등을 통해 최적화 할 수있는 충분한 공간이 있습니다. 전반적으로 합리적인 장단점을 가진 전략에 따른 견고한 기본 트렌드 역할을합니다. 배우고 연습 할 가치가 있습니다.


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

//@version=3
strategy(title = " bhramaji EMA Cross Strategy", shorttitle = "EMA Cross",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
StartYear = input(2018, "Backtest Start Year")
StartMonth = input(1, "Backtest Start Month")
StartDay = input(1, "Backtest Start Day")
UseStopLoss = input(true,"UseStopLoss")


stopLoss = input(20, title = "Stop loss percentage(0.1%)")


maSource   = input(defval = close, title = "MA Source")
maLength6   = input(defval = 6, title = "MA Period 6", minval = 1)
maLength14  = input(defval = 14, title = "MA Period 14", minval = 1)
maLength25  = input(defval = 25, title = "MA Period 25", minval = 1)
maLength80  = input(defval = 80, title = "MA Period 80", minval = 1)

ma6 = ema(maSource, maLength6)
ma14 = ema(maSource, maLength14)
ma25 = ema(maSource, maLength25)
ma80 = ema(maSource, maLength80)

ma_6_plot = plot(ma6 , title = "MA  6", color = red, linewidth = 2, style = line, transp = 50)
ma14_plot = plot(ma14, title = "MA 14", color = green, linewidth = 2, style = line, transp = 50)
ma25_plot = plot(ma25, title = "MA 25", color = blue, linewidth = 2, style = line, transp = 50)
ma80_plot = plot(ma80, title = "MA 80", color = silver, linewidth = 2, style = line, transp = 50)


longEMA = (crossover(ma6, ma14) or crossover(ma6, ma25)) and (ma6>ma80) 
exitLong = (crossunder(ma6, ma14) or crossunder(ma6, ma25)) 

shortEMA = (crossunder(ma6, ma14) or crossunder(ma6, ma25)) and (ma6< ma80)
exitShort =(crossover(ma6, ma14) or crossover(ma6, ma25))

if (longEMA)
    strategy.entry("LongId", strategy.long)
 
if (shortEMA)
    strategy.entry("ShortId", strategy.short)

if (UseStopLoss)
    strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick)
    strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)





더 많은