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

저자:차오장, 날짜: 2024-02-27 16:21:02
태그:

img

전반적인 설명

이 전략은 일반적인 이동 평균 크로스오버 전략으로, 하나의 빠른 평균과 하나의 느린 이동 평균의 두 세트를 사용합니다. 빠른 이동 평균이 느린 이동 평균을 넘을 때 구매 신호가 생성됩니다. 빠른 이동 평균이 느린 이동 평균 아래를 넘을 때 판매 신호가 생성됩니다. 전략은 EMA와 SMA를 모두 이동 평균으로 사용하고, EMA는 빠른 라인이며 SMA는 느린 라인입니다. 여러 이동 평균을 사용하면 잘못된 신호를 필터링하고 신뢰성을 향상시킬 수 있습니다.

전략 논리

핵심 논리는 엔트리와 출구를 결정하기 위해 빠르고 느린 이동 평균 선 사이의 교차에 의존합니다.

구체적으로 두 개의 빠른 평균과 느린 이동 평균 세트를 계산합니다.

  • 1단기 EMA, 길이는 8일
  • 2단기 EMA, 길이 21일
  • 1차 느린 SMA, 길이는 50일
  • 두 번째 느린 SMA, 길이는 200일

다음으로 빠른 EMA와 느린 SMA 사이의 크로스오버가 확인됩니다.

  • 8일 EMA가 50일 SMA를 넘으면 황금 십자 신호
  • 8일 EMA가 50일 SMA 아래로 넘어가면 사상 신호

거짓 신호를 필터링하기 위해 확인을 위해 두 번째 EMA/SMA 크로스오버가 필요합니다.

  • 21일 EMA가 50일 SMA를 넘어서거나 그 아래로 넘어갈 때만 거래 신호가 발사됩니다.

두 개의 빠른 / 느린 MA 크로스오버를 요구함으로써 많은 잘못된 신호를 필터링하고 신뢰성을 향상시킬 수 있습니다.

시그널 트리거를 구매할 때, 길게, 시그널 트리거를 판매할 때, 짧게

이 전략은 또한 입상 가격의 입력 비율에 따라 수익을 취하고 손실을 멈추는 것을 설정합니다.

이점 분석

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

  1. 듀얼 MA 설계는 거짓 신호를 필터링하고 정확도를 향상시킵니다.
  2. EMA와 SMA의 조합은 EMA의 민감성과 SMA의 부드러움을 이용합니다.
  3. 이윤을 취득하고 손실을 중지하여 이윤을 차단하고 위험을 제어합니다.
  4. 간단한 논리 쉽게 이해하고 수정 할 수 있습니다
  5. 사용자 정의 가능한 매개 변수는 다른 시장 환경에 적합합니다

위험 분석

전략의 위험:

  1. MA 계층은 불안정한 시장에서 많은 작은 이득/손실을 낳는 경향이 있습니다.
  2. 강한 트렌드 시장에서 큰 손실을 입을 수 있습니다.
  3. 부적절한 매개 변수 조정 또한 저성능으로 이어집니다.

위험 통제:

  1. 다른 시장 조건에 따라 매개 변수를 조정
  2. 목표 시장에 맞게 백테스트를 기반으로 최적화
  3. 손실 크기를 제한하기 위해 Stop Loss를 사용

개선 방향

이 전략은 다음과 같이 더 최적화 될 수 있습니다.

  1. 가장 좋은 방법을 찾기 위해 더 많은 빠른/ 느린 MA 조합을 테스트합니다.
  2. 자동 최적화를 위해 기계 학습이나 유전적 알고리즘을 사용
  3. 트렌드 필터를 추가하여 트렌드 반대 거래를 피합니다.
  4. 수익을 잠금하기 위해 후속 스톱 손실을 추가
  5. 신호를 확인하기 위해 볼륨 또는 변동성 필터를 탑재하는 장치
  6. 낮은 상관관계를 이용하기 위해 다른 계층/제품과 결합

결론

요약하자면, 이중 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)


더 많은