
이중 이동 평균 크로스 오버 전략 (Dual Moving Average Crossover Strategy) 은 진입과 진출을 판단하기 위해 이중 이동 평균 크로스 오버와 이중 이동 평균 크로스 오버를 이용한 양적 거래 전략이다. 이 전략은 동시에 다른 주기의 평균을 결합하여 여러 층의 필터를 형성하여 가짜 신호를 효과적으로 감소시키고 거래 신호의 신뢰성을 향상시킬 수 있다.
이 전략의 핵심 논리는 3개의 시간 주기 ((180분, 60분, 120분) 의 2개의 이동 평균 ((10일선과 200일선) 을 추적하는 것이다. 빠른 선이 아래쪽에서 느린 선을 통과하면, 금색 포크 신호가 발생하며, 품종이 다목적 행태로 들어가는 것을 나타낸다. 빠른 선이 위쪽에서 아래쪽에서 느린 선을 통과하면, 죽은 포크 신호가 발생하여, 품종이 공허 행태로 들어가는 것을 나타낸다.
전략은 먼저 180분과 60분 주기에서 각각 10일선과 200일선을 계산한다. 180분 10일선이 200일선을 하향에서 통과하면 금포 신호가 발생하고, 위쪽에서 하향으로 통과하면 사포 신호가 발생한다. 이는 빠른 주기에서의 거래 신호에 해당한다.
그 다음, 전략은 120분 주기 200일 라인을 제어 라인으로 도입한다. 골드 포크 또는 데드 포크가 발생했을 때만, 60분 주기 200일 라인이 120분 주기 200일 라인보다 높거나 낮다는 것을 판단하여 거래를 시작할지 여부를 결정한다.
예를 들어, 180분이 골드 포크를 생성할 때, 60분 200일선이 120분 200일선보다 높으면 더 많이 보고; 이 조건에서만 더 많은 상자를 개설한다. 반대로, 60분 200일선이 120분 200일선보다 낮으면 더 많이 보고도, 입장을 개설하지도 않는다.
요약하자면, 이 전략은 서로 다른 시간 주기의 평평한 관계를 비교하여 여러 층의 필터를 형성하여 신호의 신뢰성을 높여주며, 일반적인 필터형 거래 전략에 속한다.
다주기 확인, 신호 정확도를 향상한다. 단일주기 판단에 비해, 이 전략은 180분, 60분, 120분 3주기의 평균선 관계를 사용하여 확인한다. 이는 가짜 신호를 크게 줄이고 거래 신호 품질을 향상시킨다.
동작 빈도 적당하다. 높은 주파수 거래 전략에 비해 이 전략의 거래 빈도는 낮고, 자주 작동할 필요가 없으며, 수동 계정에 더 적합하다.
구현이 간단하고 이해하기 쉽다. 이 전략은 평행한 지표만을 사용하고, 복잡한 논리가 없으며, 구현을 이해하기 매우 쉽다.
다른 주기 및 매개 변수에 따라 최적화할 수 있다. 이 전략의 평균선 주기 및 유형은 조정할 수 있으며, 다른 품종과 시장 환경에 적합한 매개 변수 조합을 연구할 수 있다.
평선 시스템은 지연되어 신속한 반전을 적시에 잡을 수 없다. 이 전략은 주로 평선 관계에 의존하며, 가격 변화에 대한 반응은 다소 지연되어 빠른 반전이 놓칠 수 있다.
큰 흔들림 시장에서 쉽게 멈출 수 있다. 시장에서 큰 흔들림이 발생했을 때, 평평선 관계가 자주 교차할 수 있으며, 이로 인해 자주 포지션을 열고 멈출 수 있다. 이것은 거래 비용과 손실 위험을 증가시킨다.
너무 많은 변수 최적화에 의존하여 과도하게 적합합니다. 이 전략은 주로 변수 최적화를 통해 알파를 얻습니다. 단일 데이터 집합 결과에 대한 이러한 의존은 과도한 최적화 및 과도한 적합성에 문제가 될 수 있습니다.
위험을 대응하는 해결책은 다음과 같습니다.
평균선 변수를 적절히 줄여서 반응속도를 가속화한다.
필터링 조건을 추가하여 불안정한 시장에서 자주 포지션을 열지 마십시오.
다양한 품종과 기간에 대한 데이터를 테스트하여 매개 변수의 안정성을 평가한다.
이 전략은 여전히 더 개선할 수 있습니다:
다양한 주기 조합과 평균선 변수를 시도하여 더 좋은 변수를 찾습니다. 더 좋은 변수 조합을 찾는데는 비약적 최적화와 기계 학습 방법을 사용할 수 있습니다.
Volume 및 대용량 트렌드 지표의 확인이 추가됩니다. 이것은 가짜 신호를 추가적으로 필터링 할 수 있습니다. 예를 들어, 볼륨이 부족하면 포지션을 열지 않습니다.
딥러닝 모델과 결합하여 곡선 모양을 예측한다. RNN와 같은 딥러닝 모델을 사용하여 미래의 가격을 예측하고, 의사 결정을 보조한다.
자기 적응 평균선을 사용하여 필터링 논리를 개선한다. 시장이 흔들리는 상태가 되면 평균선의 길이를 동적으로 조정하여 포지션 개시 빈도를 낮추는다.
쌍평등금叉死叉 알고리즘 거래 전략은 서로 다른 시간주기의 평평한 관계를 비교하여 여러 층의 필터를 구축하여 거래 신호의 질을 효과적으로 향상시킬 수 있습니다. 이 전략은 구현하기 쉽고 초보자 학습에 적합하며, 또한 다차원 확장 및 최적화를 수행 할 수 있으며, 깊이 있는 연구 및 응용에 가치가 있습니다.
/*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")