이 전략은 일반적인 이동 평균 크로스오버 전략으로, 하나의 빠른 평균과 하나의 느린 이동 평균의 두 세트를 사용합니다. 빠른 이동 평균이 느린 이동 평균을 넘을 때 구매 신호가 생성됩니다. 빠른 이동 평균이 느린 이동 평균 아래를 넘을 때 판매 신호가 생성됩니다. 전략은 EMA와 SMA를 모두 이동 평균으로 사용하고, EMA는 빠른 라인이며 SMA는 느린 라인입니다. 여러 이동 평균을 사용하면 잘못된 신호를 필터링하고 신뢰성을 향상시킬 수 있습니다.
핵심 논리는 엔트리와 출구를 결정하기 위해 빠르고 느린 이동 평균 선 사이의 교차에 의존합니다.
구체적으로 두 개의 빠른 평균과 느린 이동 평균 세트를 계산합니다.
다음으로 빠른 EMA와 느린 SMA 사이의 크로스오버가 확인됩니다.
거짓 신호를 필터링하기 위해 확인을 위해 두 번째 EMA/SMA 크로스오버가 필요합니다.
두 개의 빠른 / 느린 MA 크로스오버를 요구함으로써 많은 잘못된 신호를 필터링하고 신뢰성을 향상시킬 수 있습니다.
시그널 트리거를 구매할 때, 길게, 시그널 트리거를 판매할 때, 짧게
이 전략은 또한 입상 가격의 입력 비율에 따라 수익을 취하고 손실을 멈추는 것을 설정합니다.
이 전략의 장점은 다음과 같습니다.
전략의 위험:
위험 통제:
이 전략은 다음과 같이 더 최적화 될 수 있습니다.
요약하자면, 이중 MA 크로스오버 전략은 빠른 / 느린 MA 크로스, 세트가 리스크를 제어하기 위해 수익을 취하고 손실을 멈추는 신호를 생성하며 간단하고 직관적이며 구현하기가 쉽습니다. 매개 변수는 더 나은 성능을 위해 다른 지표와 조율하고 결합 할 수 있습니다. 양적 거래에서 큰 유용성을 가지고 있습니다.
/*backtest start: 2023-02-20 00:00:00 end: 2024-02-26 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/ // © JMLSlop //@version=4 src = close strategy("Crossover moving averages", shorttitle="Cross MA-EMA", overlay=true, calc_on_order_fills=false) // first fast EMA len = input(8, "Length", type=input.integer, minval=1) doma1 = input(true, title="EMA") out1 = ema(src, len) //Second fast EMA len2 = input(21, minval=1, title="Length") doma2 = input(true, title="EMA") out2 = ema(src, len2) //First slow MA len3 = input(50, minval=1, title="Length") doma3 = input(true, title="SMA") out3 = sma(src, len3) //Second slow MA len4 = input(200, minval=1, title="Length") doma4 = input(true, title="SMA") out4 = sma(src, len4) // Profit profit = input(8, "Profit/lost %", type=input.float, minval=1) * 0.01 plot(doma1 and out1 ? out1: na, color=color.blue, linewidth=1, title="1st EMA") plot(doma2 and out2 ? out2: na, color=color.red, linewidth=1, title="2nd EMA") plot(doma3 and out3 ? out3: na, color=color.green, linewidth=2, title="1st MA") plot(doma4 and out4 ? out4: na, color=color.orange, linewidth=3, title="2nd MA") // Orders config takeProfitPrice = (strategy.position_size > 0) ? strategy.position_avg_price + open*profit : (strategy.position_size < 0) ? strategy.position_avg_price - (open*profit) : na longStopPrice = strategy.position_avg_price * (1 - profit) shortStopPrice = strategy.position_avg_price * (1 + profit) longCondition2 = (out2>out3 and (crossover(out1, out4) or crossover(out1[1], out4[1]) or crossover(out1[2], out4[2]) or (crossover(out1[3], out4[3]))) or (out2>out3 and (crossover(out1, out3) or crossover(out1[1], out3[1]) or crossover(out1[2], out3[2]) or crossover(out1[3], out3[3])))) if (longCondition2) strategy.entry("Enter L", strategy.long) shortCondition2 = (out2<out3 and (crossunder(out1, out4) or crossunder(out1[1], out4[1]) or crossunder(out1[2], out4[2]) or crossunder(out1[3], out4[3]))) or (out2<out3 and (crossunder(out1, out3) or crossunder(out1[1], out3[1]) or crossunder(out1[2], out3[2]) or crossunder(out1[3], out3[3]))) if (shortCondition2) strategy.entry("Enter S", strategy.short) if (strategy.position_size > 0) strategy.exit("Exit L", limit=takeProfitPrice, stop=longStopPrice) if (strategy.position_size < 0) strategy.exit("Exit S", limit=takeProfitPrice, stop=shortStopPrice)