이중 EMA 크로스오버에 기반한 양적 거래 전략

저자:차오장, 날짜: 2023-11-21 11:41:40
태그:

img

전반적인 설명

이 전략은 시장 추세를 결정하기 위해 서로 다른 기간의 EMA 라인 사이의 교차를 계산하여 거래 신호를 생성합니다. 짧은 기간 EMA가 더 긴 기간 EMA를 넘어서면 상승 추세를 나타내고, 짧은 기간 EMA가 더 긴 기간 EMA를 넘어서면 하락 추세를 나타낼 때 긴 포지션을 열고, 짧은 기간 EMA가 더 긴 기간 EMA를 넘어서면 포지션을 닫습니다.

원칙

이 전략은 주로 이중 EMA 라인의 황금 십자가와 죽음의 십자가 이론을 적용합니다. 이중 EMA 라인은 긴 EMA와 짧은 EMA로 구성됩니다. 짧은 EMA 매개 변수는 10 일, 긴 EMA 매개 변수는 21 일로 설정됩니다.

짧은 EMA가 긴 EMA를 넘을 때 구매 신호가 생성됩니다. 짧은 EMA가 긴 EMA를 넘을 때 판매 신호가 생성됩니다. 전략은 또한 성장률의 문턱을 설정하여 성장이 긍정적 인 문턱을 초과 할 때만 긴 포지션을 열고 감소가 부정적인 문턱을 초과 할 때만 포지션을 닫습니다.

구체적으로, 구매 조건은 짧은 EMA가 긴 EMA보다 높고 주식 성장률이 긍정적 인 임계치를 초과 할 때입니다. 닫은 포지션 조건은 짧은 EMA가 긴 EMA보다 낮고 주식 성장률이 부정적인 임계치를 넘을 때입니다.

장점

  • 단순성과 신뢰성을 위해 이중 EMA 라인의 황금 십자가와 죽음의 십자가 이론을 활용합니다.
  • 성장률의 문턱을 추가하여 성장률이 약할 때 잘못된 거래를 피합니다.
  • 최대 손실 비율을 엄격히 제어 할 수 있습니다.
  • EMA 기간 매개 변수는 다른 주기에 대해 유연하게 조정할 수 있습니다.

위험 분석

  • EMA 라인은 후진 효과, 아마도 가격 반전 포인트가 빠진 경우
  • 노선 교차선에는 약간의 지연이 있으며, 아마도 가장 좋은 입구 지점이 부족할 수 있습니다.
  • 매개 변수 최적화에 의존하고, 부적절한 설정은 오버 트레이딩 또는 불충분한 신호를 유발할 수 있습니다.

최적화 방향

  • 신호 정확성을 향상시키기 위해 MACD, KD 등과 같은 다른 지표와 결합
  • 수익을 극대화하기 위해 후속 스톱 손실과 같은 스톱 손실 전략을 추가하십시오.
  • 다양한 제품에서 최적의 설정을 위해 EMA 기간 매개 변수를 최적화
  • 동적 매개 변수 조정 및 최적화를 위해 실시간 데이터 및 기계 학습 방법을 통합

요약

전체 전략은 비교적 간단하고 신뢰할 수 있으며, 가격 추세를 결정하고 거래 신호를 생성하기 위해 성장률 임계치를 설정하기 위해 이중 EMA 크로스오버를 사용합니다. 단일 라인 크로스오버와 비교하면 일부 잘못된 신호를 필터링 할 수 있습니다. 그러나 EMA 라인 자체는 지체 문제가 있습니다. 다른 지표 또는 동적 매개 변수 조정을 결합하면 전략 성능을 더욱 향상시킬 수 있습니다.


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

//@version=3
strategy(title="ema(ema10-21)", overlay=true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 15000, commission_type = strategy.commission.percent, commission_value = 0.2)

useTimeLimit    = input(defval = false, title = "Use Start Time Limiter?")
startYear       = input(defval = 2016, 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() => true

lenght0 = input(10)
lenght1 = input(21)

source = close

EmaShort = ema(ema(source, lenght0), lenght0)
EmaLong = ema(ema(source, lenght1),lenght1)
plot(EmaShort, color=red)
plot(EmaLong, color=purple)

growth = ((EmaShort-EmaLong)*100)/((EmaShort+EmaLong)/2)
thresholdUp = input(defval=0.05, title="Threshold Up", type=float, step=0.01)
thresholdDown = input(defval=-0.165, title="Threshold Down", type=float, step=0.001)

if( startTimeOk() )
    buy_condition = EmaShort > EmaLong and growth > thresholdUp
    buy_exit_condition = EmaShort < EmaLong and growth < thresholdDown
    strategy.entry("buy", strategy.long, comment="buy", when=buy_condition)
    strategy.close(id='buy', when=buy_exit_condition)

더 많은