다중 이동 평균 추세 포착 및 교차 확인 거래 시스템

EMA RSI MACD ATR 趋势跟踪 均线交叉 波动率过滤
생성 날짜: 2025-03-03 10:11:37 마지막으로 수정됨: 2025-03-03 10:11:37
복사: 0 클릭수: 399
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다중 이동 평균 추세 포착 및 교차 확인 거래 시스템 다중 이동 평균 추세 포착 및 교차 확인 거래 시스템

개요

다중 평균선 트렌드 캡처 및 교차 확인 거래 시스템은 비교적 강한 지표 (RSI), 이동 평균선 트렌드 차이 (MACD) 및 평균 실제 범위 (ATR) 를 보조 지표로 결합한 다중 주기 지수 이동 평균 (EMA) 의 조합을 기반으로 한 정량화 거래 전략입니다. 이 전략의 핵심은 다른 시간 기간의 평균선 위치 관계를 비교하여 시장의 트렌드 방향을 결정하고, 트렌드가 분명할 때 포지션을 열고, 추세가 약해지거나 역전될 때 평평합니다.

전략 원칙

이 전략의 핵심 원칙은 여러 개의 다른 주기의 지수 이동 평균 ((EMA) 를 사용하여 시장 추세를 판단하고 거래 기회를 잡는 것입니다. 전략에는 다섯 개의 EMA가 사용됩니다: 순간 평균 ((14 주기), 중간 평균 ((25 주기), 단기 평균 ((50 주기), 중간 평균 ((100 주기) 및 장기 평균 ((200 주기).

이 전략의 주요 논리는 다음과 같습니다.

  1. 트렌드 판단 메커니즘:

    • 상승 추세 조건: 단기, 중기 및 장기 평균보다 단기 평균, 중기 평균보다 단기 평균
    • 하향 추세 조건: 단기 평균은 단기, 중기 및 장기 평균보다 낮고 단기 평균은 장기 평균보다 낮습니다.
  2. 출입 신호:

    • 다중 입점: 상승 추세 조건을 충족하고 현재 지분을 보유하지 않은 경우
    • 공백 입시: 하향 추세 조건을 충족하고 현재 지분을 보유하지 않고 최소 ATR 조건을 충족하는 경우 (시장 변동성이 충분하다)
  3. 출구 신호:

    • 다중 평점: 단기 평균보다 순간 평균이 낮아지면
    • 빈 머리 평지: 순간 평균선에서 중기 평균선을 통과할 때
  4. 위험 관리:

    • ATR 지표를 변동성 필터로 사용하여, 변동성이 충분할 때만 (ATR이 평균보다 크다) 공백 거래
    • 통합 RSI 오버 바이 오버 시드 레벨을 잠재적인 추가 필터링 조건으로 (코드에 정의되어 있지만 현재 거래 논리에 사용되지 않습니다)
  5. 위치 추적:

    • 전략 부어 변수를 사용하여 현재 포지션의 여부와 포지션 방향에 대한 추적을 수행합니다.

전략적 이점

  1. 다중 평균선 확인: 여러 개의 다른 주기의 평균선을 통해 트렌드를 공동으로 확인하고, 가짜 돌파구와 잘못된 신호를 줄이고, 신호 품질을 향상한다.

  2. 트렌드를 정확히 파악하는 것: 단일 평행선 시스템과 비교하여, 다중 평행선 시스템은 시장 추세의 전환점을 더 정확하게 식별 할 수 있습니다. 특히 순간적으로 평행선이 다른 평행선과 상대적으로 위치가 변경되면.

  3. 유연한 위험 관리: 다중 헤드 및 공허 헤드에 대한 다른 입출자 기준을 적용하여 시장의 다른 방향의 위험에 대한 차별화된 처리를 나타냅니다. 공허 헤드 거래는 추가로 변동률 필터를 추가합니다.

  4. 시각화 거래 신호전략: 그래픽 표시를 통해 구매, 판매, 매각 지점을 명확하게 표시하여 추적 분석 및 실시간 모니터링을 용이하게 합니다.

  5. 트렌드 배경 시각화: 배경 컬러를 사용하여 상승 추세와 하락 추세를 구분하여 시장 환경을 직관적으로 표시하여 거래자가 현재 시장 상태를 신속하게 판단할 수 있습니다.

  6. 잠재적인 확장: RSI와 MACD 지표의 계산이 통합되어 있으며, 현재 거래 논리에 사용되지 않지만 전략의 미래 최적화에 기초를 제공합니다.

  7. 매개 변수 조정: 모든 핵심 매개 변수는 입력 제어로 조정할 수 있으며, 평균 주기, RSI 마이너스, MACD 매개 변수 및 ATR 설정을 포함하여 다양한 시장 환경 및 거래 유형에 따라 최적화 할 수 있습니다.

전략적 위험

  1. 평균선 뒤떨어짐: 모든 평행선을 기반으로 하는 시스템에는 어느 정도의 뒤처짐이 존재하며, 흔들림 시장이나 급격한 역전 시에는 큰 회전이 발생할 수 있다. 해결책은 평행선 주기를 조정하거나, 추가적인 흔들림 시장 필터 조건을 추가하는 것이다.

  2. 과도한 거래의 위험: 불안정한 시장에서, 순간 평균이 종종 단기 평균을 통과하여 과도한 거래가 발생할 수 있습니다. 최소 보유 시간을 늘리거나 추가 필터를 추가하여 유효하지 않은 거래를 줄일 수 있습니다.

  3. 다양한 시장 적응성 문제: 고정된 매개 변수의 평평선 전략은 다른 시장 환경과 거래 품종에 따라 성능이 큰 차이가 있다. 특정 시장에 대한 매개 변수를 최적화하거나, 적응 매개 변수를 사용하는 것을 고려해야 한다.

  4. 신호 충돌: 코드는 RSI와 MACD 지표를 계산하지만 거래 논리에 효과적으로 통합되지 않아 잠재적인 신호 충돌이나 최적화 기회를 놓칠 수 있습니다.

  5. 다목적 편향: 현재 전략은 다중 헤드와 공표에 대해 다른 기준을 사용하며, 다중 헤드는 변동률 필터가 없으며, 공표는 최소 ATR 조건을 충족해야 하며, 이는 상승 시장에서 전략을 더 적극적으로 만들고, 위험 구멍을 증가시킬 수 있다.

  6. 고정 출전 메커니즘전략은 고정된 기술 지표의 교차를 출발점으로 사용하며, 시장의 동적 상황에 따라 조정되는 중지 중지 손실 메커니즘이 없기 때문에 수익을 효과적으로 고정하거나 위험을 제어 할 수 없습니다.

  7. 매개변수 민감도이 전략은 여러 평균 주기 변수에 의존하며, 이 변수들의 미세한 변화는 거래 결과의 현저한 차이를 초래할 수 있으며, 과도한 적합성의 위험을 증가시킵니다.

전략 최적화 방향

  1. 통합된 계산된 지표전략은 RSI와 MACD 지표를 계산했지만 충분히 활용되지 않았습니다. RSI를 극한 시장 조건을 필터링하는 데 사용할 수 있으며, MACD는 트렌드 방향을 확인하고 신호 품질을 향상시키는 데 사용됩니다. 예를 들어, RSI가 과매구역에 있지 않은 다중 헤드 입구와 RSI가 과매구역에 있지 않은 공백 입구를 요구할 수 있습니다.

  2. 동적 손해 방지 시스템: ATR 기반의 동적 스톱 메커니즘을 도입하여 시장의 변동성에 따라 자동으로 스톱 거리를 조정하여 위험 관리 능력을 향상시킵니다. 이것은 입점 지점을 계산하여 특정 배수의 ATR 값을 더하거나 줄임으로써 달성 할 수 있습니다.

  3. 시장 상태 분류: 시장 상태에 대한 판단 메커니즘을 추가하기 (추세 시장 vs 흔들림 시장), 다른 시장 상태에 따라 다른 거래 전략을 채택한다. 예를 들어, 장기 평균선의 기울기 또는 ADX 지표를 통해 시장 추세 강도를 판단 할 수 있다.

  4. 다중 시간 프레임 분석: 더 높은 시간 주기의 트렌드 정보를 통합하고, 더 높은 시간 주기의 트렌드 방향이 일치할 때만 거래하여 승률을 높인다.

  5. 평균선 변수를 최적화: 현재 전략은 고정된 평균선 주기 ((14, 25, 50, 100, 200) 를 사용하며, 다양한 파라미터 조합을 재검토하여 특정 시장에 더 적합한 최적의 파라미터를 찾을 수 있다.

  6. 수량 확인: 트렌드 강도를 확인하기 위해 거래량 지표를 결합하고, 거래량이 지원되는 트렌드에서만 거래하여, 가짜 돌파구로 인한 손실을 줄인다.

  7. 출입 조건 변경: 더 대칭적으로 만들거나 다른 시장 방향 특성에 대한 더 정교한 조정을 위해 다중 헤드 및 빈 헤드의 입문 논리를 최적화하십시오. 예를 들어, 다중 헤드 입시에 변동율 필터를 추가하거나 트렌드 확인의 엄격성을 조정하는 것도 고려할 수 있습니다.

  8. 필터링 시간을 추가합니다.거래 시간 필터를 추가하여 시장의 변동성이 높거나 유동성이 떨어지는 시기를 피하십시오. 중요한 데이터 발표 또는 시장 개시 및 종료 시기와 같은 시간.

요약하다

다중평평선 트렌드 캡처 및 교차 확인 거래 시스템은 기술 분석에 기반한 정량 거래 전략으로, 여러 개의 다른 주기의 평평선 조합을 통해 시장 추세를 판단하고, 추세가 명확할 때 포지션을 열고, 추세가 약할 때 평평한 포지션을 낸다. 전략의 핵심 장점은 다중평평선 교차 확인 트렌드를 활용하여 잘못된 신호를 줄이고 거래 품질을 향상시키는 것이다.

이 전략은 트렌드가 뚜렷한 시장에서 잘 작동하지만, 흔들리는 시장에서 과다 거래의 위험에 직면할 수 있습니다. 계산된 RSI와 MACD 지표를 통합하여, 동적 중지 메커니즘을 도입하고, 평균 변수 조합을 최적화하고, 시장 상태 분류를 증가시킴으로써, 전략의 안정성과 적응성을 더욱 높일 수 있습니다.

실제 적용을 위해, 먼저 다양한 시장 환경과 거래 품종에 대한 충분한 회귀를 수행하고, 특정 시장 특성에 맞게 파라미터를 조정하고, 자금 관리 전략과 결합하여 단독 거래 위험을 제어하는 것이 좋습니다. 또한, 이 전략을 포트폴리오의 일부로 사용하여 다른 상호 보완 전략과 결합하여 거래 위험을 분산시키고 전체 포트폴리오의 안정성을 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2025-02-23 00:00:00
end: 2025-03-02 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("etude9", shorttitle="etude 9", overlay=true)
//on tente de comlbiner avec le RSi un stratégie pas si mauvaise sur les longs 
// un d7 r rsi qui donne des indiciataions pas mal pour les short pour les long pas très concluant 
// === Paramètres d'entrée ===
// Source de prix
// et merde rendement sur long est plus efficace sans condition sur ATR !!
// par contre j'ai l'imression que le rsi ça va être bien pour les shorts 
// bon avec le RSi ça donne rien, et avec le macd, ç ce stade c'est foireux mmm 
pricetype = input(close, title="Source de prix pour les moyennes mobiles")

// Périodes des moyennes mobiles
instant = input(14, title="Période de la moyenne instantanée (10)")
interm = input(25, title="Perdiode intermediaire (25)")
shortperiod = input(50, title="Période de la moyenne mobile courte (20)")
mediumperiod = input(100, title="Période de la moyenne mobile moyenne (50)")
longperiod = input(200, title="Période de la moyenne mobile longue (100)")

// Paramètres du RSI
rsi_length = input.int(14, title="Période RSI")
rsi_overbought = input.int(78, title="Niveau de surachat (RSI)")
rsi_oversold = input.int(30, title="Niveau de survente (RSI)")

// Paramètres pour le MACD
fast_length = input.int(12, title="Longueur Rapide MACD")
slow_length = input.int(26, title="Longueur Lente MACD")
signal_length = input.int(9, title="Longueur du Signal MACD")

// Paramètres de l'ATR
atr_length = input.int(14, title="Période ATR")
atr_multiplier = input.float(1.5, title="Multiplicateur ATR pour le Stop-Loss")

// Calcul de l'ATR
atr = ta.atr(atr_length)

// === Calcul des moyennes mobiles (EMA uniquement) ===
instant_ma = ta.ema(pricetype, instant) // Moyenne mobile instantanée
short_ma = ta.ema(pricetype, shortperiod)  // Moyenne mobile courte (20)
medium_ma = ta.ema(pricetype, mediumperiod)  // Moyenne mobile moyenne (50)
long_ma = ta.ema(pricetype, longperiod)    // Moyenne mobile longue (100)
interm_ma = ta.ema(pricetype, interm)

// Calcul du RSI
rsi = ta.rsi(close, rsi_length)

// Calcul du MACD
[macd_line, signal_line, hist_line] = ta.macd(close, fast_length, slow_length, signal_length)

// Stocker les résultats de crossover et crossunder dans des variables globales
is_crossover = ta.crossover(macd_line, signal_line)
is_crossunder = ta.crossunder(macd_line, signal_line)

// Filtre ATR : on ne trade que si la volatilité est suffisante
min_atr = atr > ta.sma(atr, atr_length)  // ATR supérieur à sa moyenne

// === Conditions de tendance ===
trending_up = instant_ma > short_ma and instant_ma > medium_ma and instant_ma > long_ma and short_ma > medium_ma   // Tendance haussière
trending_down = instant_ma< short_ma and instant_ma<medium_ma and instant_ma<long_ma and short_ma<long_ma  // Tendance baissière
// Filtre RSI
rsi_filter_buy = rsi < rsi_overbought  // RSI n'est pas en surachat pour un achat
rsi_filter_sell = rsi > rsi_oversold  // RSI n'est pas en survente pour une vente

// === Gestion des positions ===
var bool in_position = false  // Variable pour suivre si une position est ouverte
var bool is_long = false      // Variable pour suivre si la position est longue ou courte

// === Signaux d'ouverture et de fermeture ===
bool buy_signal = false  // Signal d'ouverture d'une position longue
bool close_signal = false  // Signal de fermeture d'une position longue
bool sell_signal = false  // Signal d'ouverture d'une position courte
bool close_short_signal = false  // Signal de fermeture d'une position courte


// Ouvrir une position longue
if (trending_up and not in_position)
    strategy.entry("Long", strategy.long)
    in_position := true
    is_long := true
    buy_signal := true  // Signal d'ouverture
else
    buy_signal := false

// Fermer la position longue si instant_ma < medium_ma
if (in_position and is_long and instant_ma < short_ma)
    strategy.close("Long")
    in_position := false
    is_long := false
    close_signal := true  // Signal de fermeture
else
    close_signal := false

// Ouvrir une position courte
if (trending_down and not in_position and min_atr)
    strategy.entry("Short", strategy.short)
    in_position := true
    is_long := false
    sell_signal := true  // Signal d'ouverture
else
    sell_signal := false
// Fermer la position courte si instant_ma > medium_ma
if (in_position and not is_long and instant_ma > medium_ma)
    strategy.close("Short")
    in_position := false
    close_short_signal := true  // Signal de fermeture
else
    close_short_signal := false
// === Affichage des signaux sur le graphique ===
plotshape(series=buy_signal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy", size=size.small)
plotshape(series=sell_signal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell", size=size.small)
plotshape(series=close_signal, title="Close Long Signal", location=location.abovebar, color=color.orange, style=shape.labeldown, text="Close Long", size=size.small)
plotshape(series=close_short_signal, title="Close Short Signal", location=location.belowbar, color=color.blue, style=shape.labelup, text="Close Short", size=size.small)

// === Affichage des moyennes mobiles sur le graphique ===
plot(short_ma, color=color.blue, title="Moyenne mobile courte (20)", linewidth=2)
plot(medium_ma, color=color.orange, title="Moyenne mobile moyenne (50)", linewidth=2)
plot(long_ma, color=color.red, title="Moyenne mobile longue (100)", linewidth=2)
plot(instant_ma, color=color.rgb(43, 14, 111), title="Moyenne mobile instantanée (10)", linewidth=2)
plot(interm_ma, color=color.rgb(26, 192, 34), title="Moyenne mobile instantanée (10)", linewidth=2)

// Coloration de fond pour les tendances
bgcolor(color=trending_up ? color.new(color.green, 90) : trending_down ? color.new(color.red, 90) : na, title="Coloration de fond")