이중 이동 평균 크로스오버 거래 전략 (Dual Moving Average Crossover Trading Strategy) 은 이동 평균 크로스오버를 사용하여 진입 및 출구 신호를 결정하는 양적 거래 전략이다. 이 전략은 다양한 시간 프레임의 이동 평균을 결합하여 여러 층의 필터링을 만들고 더 신뢰할 수있는 거래 신호를 위해 잘못된 신호를 줄이도록합니다.
이 전략의 핵심 논리는 3 시간 프레임 (180 분, 60 분, 120 분) 에 걸쳐 2 개의 이동 평균 (10 일 및 200 일) 을 추적하는 것입니다. 더 빠른 이동 평균이 느린 이동 평균보다 높을 때 금색 크로스오버가 생성되며 기기가 상승 추세에 있음을 나타냅니다. 더 빠른 이동 평균이 느린 평균보다 낮을 때 사망 크로스오버가 생성되며 하락 추세를 나타냅니다.
먼저, 10일 및 200일 이동 평균은 180분 및 60분 시간 프레임에 대해 별도로 계산된다. 180분 시간 프레임에서 10일 MA가 200일 MA를 넘을 때, 황금 크로스오버 신호가 생성된다. 아래를 넘을 때, 죽음의 크로스오버 신호가 생성된다. 이것은 빠른 사이클 거래 신호를 제공한다.
다음으로, 전략은 120 분 시간 프레임에서 200 일 MA를 이동 평균으로 도입합니다. 180/60 분 주기에 크로스오버가 발생할 때만, 60 분 200 일 MA가 120 분 200 일 MA보다 높거나 낮는지 확인하면 잘못된 신호를 필터링하기 위해 거래가 이루어져야하는지 결정할 것입니다.
예를 들어, 180 분 주기에 황금 크로스오버가 발생했을 때, 60 분 200 일 MA가 120 분 200 일 MA보다 높으면 전략이 길어집니다. 이 조건이 충족 될 때만 긴 포지션이 열립니다. 반대로, 60 분 200 일 MA가 120 분 MA보다 낮으면 긴 포지션이 취하지 않습니다.
요약하자면, 다른 시간 프레임에 걸쳐 이동 평균 관계를 비교함으로써, 이 전략은 신호 신뢰성을 향상시키기 위해 여러 층의 필터링을 생성하여 필터 기반 거래 전략의 일반적인 유형이됩니다.
멀티 타임프레임 확인을 통한 향상된 정확성. 단일 타임프레임 신호에 비해 180/60/120 분 MA를 사용하면 잘못된 신호를 크게 줄이고 거래 신호 품질을 향상시킵니다.
합리적인 운영 주파수. 고 주파수 전략과 달리 이 전략은 더 자주 거래하여 시장을 지속적으로 모니터링 할 필요가 없습니다. 수동 거래에 더 적합합니다.
단순하고 이해하기 쉽다. 복잡한 논리가 없는 기본적인 이동 평균만을 사용함으로써 이 전략은 진입 장벽이 낮고 초보자들도 쉽게 이해할 수 있다.
기간 및 매개 변수에서 최적화 할 수 있습니다. 사용 된 MA 유형 및 기간은 조정 가능합니다. 다른 제품과 시장 체제에 대해 다른 매개 변수 세트를 테스트 할 수 있습니다.
지연 표시 및 느린 반응. 핵심 이동 평균은 설계에 의해 지연되어 있으며 종종 빠른 트렌드 반전을 포착하지 못합니다.
범위 시장에서 높은 휘프사 주파수 시장에서 범위가 있을 때, MA 관계는 매우 자주 교차 할 수 있으며 과도한 입출입과 스톱 손실을 유발하여 비용과 손실 위험을 높일 수 있습니다.
파라미터 최적화에서 발생하는 과잉 적합 위험. 알파는 제한된 데이터 세트에 기반한 파라미터 튜닝에서 주로 발생합니다. 이것은 과잉 최적화 및 과잉 적합 문제로 이어질 가능성이 있습니다.
해결책:
아직 더 많은 최적화를 할 수 있습니다.
다른 시간 프레임 조합을 시도하고 MA 기간을 조정하여 더 나은 매개 변수를 찾습니다. 무력 최적화와 기계 학습 기술을 통해요.
추가 신호 확인을 위해 볼륨 및 더 높은 시간 프레임 트렌드 분석을 포함하십시오. 예를 들어 낮은 거래량 동안 항목을 피하십시오.
RNN 같은 심층 학습 모델을 사용하여 결정에 도움이 되는 곡선 패턴을 미리 예측합니다.
필터링 논리를 개선하기 위해 적응 가능한 이동 평균을 도입하십시오. 시장 불확실성 중 입력을 줄이기 위해 MA 기간을 동적으로 조정하십시오.
이중 이동 평균 크로스오버 거래 전략은 잘못된 신호를 필터링하여 신호 신뢰성을 향상시키기 위해 여러 시간 프레임에 걸쳐 이동 평균 관계를 비교합니다. 이 유형의 필터 기반 알고리즘 전략은 초보자에게 일반적이며 쉽게 구현되며 여러 차원에서 광범위한 최적화를 허용하며 연구와 적용 가치가 있습니다.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-28 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(shorttitle = "ALGO 3-1-2", title="ALGO 3h, 1h, 2h", overlay=true) bool startLONGBOTandDEAL = false bool stopLONGBOTandDEAL = false bool openLONG = false bool closeLONG = false bool startSHORTBOTandDEAL = false bool stopSHORTBOTandDEAL = false bool openSHORT = false bool closeSHORT = false MA1Period = ema(close, 10) MA2Period = ema(close, 200) MA3Period = ema(close, 200) MA1 = security(syminfo.tickerid, "180", MA1Period) MA2 = security(syminfo.tickerid, "60", MA2Period) MA3 = security(syminfo.tickerid, "120", MA3Period) MA12Crossover = crossover(MA1, MA2) MA12Crossunder = crossunder(MA1, MA2) MA23Crossover = crossover(MA2, MA3) MA23Crossunder = crossunder(MA2, MA3) if MA23Crossover startLONGBOTandDEAL := true //stop shortBOT and DEAL code in the TV alert as well, probably stop first w/ a delay on startlong lblBull = label.new(bar_index, na, ' BULL Time Open LONG', color=color.blue, textcolor=color.black, style=label.style_label_up, size=size.small) label.set_y(lblBull, MA2) strategy.close("go Short") strategy.entry("go Long", strategy.long, comment="go Long") if MA23Crossunder //not sure if i should set alert for stop and start each bot, or just put start appropriate bot and stop its opposite in the same alert. startSHORTBOTandDEAL := true lblBull = label.new(bar_index, na, ' BEAR Time - Open SHORT', color=color.orange, textcolor=color.black, style=label.style_label_down, size=size.small) label.set_y(lblBull, MA2) strategy.close("go Long") strategy.entry("go Short", strategy.short, comment="go Short") if MA12Crossover if MA2 >= MA3 openLONG := true lup1 = label.new(bar_index, na, ' OPEN LONG ', color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small, yloc=yloc.belowbar) strategy.entry("go Long", strategy.long, comment="go Long") if MA2 <= MA3 closeSHORT := true lup1 = label.new(bar_index, na, ' CLOSE SHORT ', color=color.gray, textcolor=color.black, style=label.style_label_up, size=size.small, yloc=yloc.belowbar) strategy.close("go Short") if MA12Crossunder if MA2 >= MA3 closeLONG := true lun1 = label.new(bar_index, na, ' CLOSE LONG ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar) strategy.close("go Long") if MA2 <= MA3 openSHORT := true lun1 = label.new(bar_index, na, ' OPEN SHORT ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar) strategy.entry("go Short", strategy.short, comment="go Short") plot(MA1, color=color.green, linewidth=2, title="MA1") plot(MA2, color=color.yellow, linewidth=3, title="MA2") plot(MA3, color=color.red, linewidth=4, title="MA3") alertcondition(startLONGBOTandDEAL, title="Start LONG BOT and DEAL", message="Start Long Bot and Deal") alertcondition(stopLONGBOTandDEAL, title="Stop LONG BOT and DEAL", message="Stop Long Bot and Deal") alertcondition(openLONG, title="Open LONG DEAL", message="Open Long Deal") alertcondition(closeLONG, title="Close LONG DEAL", message="Close Long Deal") alertcondition(stopSHORTBOTandDEAL, title="Stop SHORT BOT and DEAL", message="Stop Short Bot and Deal") alertcondition(openSHORT, title="Open SHORT DEAL", message="Open Short Deal") alertcondition(closeSHORT, title="Close SHORT DEAL", message="Close Short Deal")