리소스 로딩... 로딩...

다중 지표 동적 모멘텀 크로스 전략

저자:차오장, 날짜: 2025-01-06 14:00:47
태그:EMARSISMAMACDADX

img

전반적인 설명

이 전략은 여러 기술적 지표에 기반한 거래 시스템으로, 주로 기하급수적인 이동 평균 (EMA), 상대적 강도 지표 (RSI) 및 거리 계산을 결합합니다. 이 전략은 시장 트렌드 강도 및 동력 변화를 동적으로 모니터링하여 신호 안정성을 유지하면서 잘못된 브레이크와 불안정한 시장을 효과적으로 피합니다. 이 시스템은 여러 확인 메커니즘을 사용하고 정확한 시장 상태를 평가하기 위해 지표와 동적 임계 사이의 상대적 거리를 계산합니다.

전략 원칙

이 전략은 시장 방향 판단을 위해 RSI 지표 (14 기간) 로 강화 된 트렌드 프레임워크를 구축하기 위해 다른 기간 (5, 13, 40, 55) 의 네 개의 EMA를 사용합니다. 구체적으로:

  1. 5주기 EMA가 13주기 EMA를 넘고 40주기 EMA가 55주기 EMA를 넘을 때 긴 신호가 생성됩니다.
  2. 트렌드 확인은 RSI가 50 이상이고 14주기 평균보다 높아야 합니다.
  3. 시스템은 EMA5와 EMA13 사이의 거리를 계산하고, 트렌드 강도를 판단하기 위해 지난 5개의 촛불의 평균 거리와 비교합니다.
  4. 강한 구매 신호는 RSI가 60을 초과하고 강한 판매 신호는 40 이하로 발행됩니다.
  5. 트렌드 지속성은 EMA40과 EMA13 사이의 거리의 변화를 계산하여 검증됩니다.

전략적 장점

  1. 다중 확인 메커니즘은 잘못된 신호를 현저히 줄입니다.
  2. 동적 거리 계산은 트렌드 강도 변화를 식별하는 데 도움이됩니다.
  3. RSI 임계 설계는 추가 시장 강도 평가를 제공합니다.
  4. 신호 지속 메커니즘은 빈번한 거래 위험을 감소시킵니다.
  5. 트렌드 역전 초기 경고 기능
  6. 이 시스템은 다양한 시장 환경에 잘 적응할 수 있습니다.

전략 위험

  1. 부적절한 시장에서 과도한 중립 신호를 생성 할 수 있습니다.
  2. 여러 가지 지표가 신호 지연으로 이어질 수 있습니다.
  3. 매개 변수 최적화는 과도한 부착으로 이어질 수 있습니다.
  4. 급격한 트렌드 반전 시 큰 마취가 가능함
  5. EMA 크로스오버에서 거짓 파업은 추가 필터링이 필요합니다.

전략 최적화 방향

  1. 신호 신뢰성을 높이기 위해 볼륨 표시기를 포함합니다.
  2. 시장 전환점 예측을 개선하기 위해 RSI 매개 변수를 최적화하십시오.
  3. 동적 스톱 로스 조정을 위한 ATR 표시기를 추가합니다.
  4. 전략의 안정성을 높이기 위한 적응형 매개 변수 시스템을 개발
  5. 멀티 타임프레임 신호 확인 메커니즘을 구축
  6. 잘못된 신호를 줄이기 위해 변동성 필터를 구현합니다.

요약

이 전략은 여러 기술적 지표의 시너지 효과를 통해 신호 안정성을 유지하면서 효과적인 위험 통제를 달성합니다. 시스템 설계는 적응력을 높이기 위해 동적 임계 및 거리 계산을 사용하여 시장 다양성을 철저히 고려합니다. 지속적인 최적화와 개선을 통해 전략은 다양한 시장 조건에서 안정적인 성능을 유지하는 것을 약속합니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("EMA Crossover Strategy with RSI Average, Distance, and Signal Persistence", overlay=true, fill_orders_on_standard_ohlc=true)

// Define EMAs
ema5 = ta.ema(close, 5)
ema13 = ta.ema(close, 13)
ema40 = ta.ema(close, 40)
ema55 = ta.ema(close, 55)

// Calculate 14-period RSI
rsi = ta.rsi(close, 14)

// Calculate the RSI average
averageRsiLength = 14  // Length for RSI average
averageRsi = ta.sma(rsi, averageRsiLength)

// Define conditions
emaShortTermCondition = ema5 > ema13  // EMA 5 > EMA 13
emaLongTermCondition = ema40 > ema55  // EMA 40 > EMA 55
rsiCondition = rsi > 50 and rsi > averageRsi  // RSI > 50 and RSI > average RSI

// Track the distance between ema5 and ema13 for the last 5 candles
distance = math.abs(ema5 - ema13)
distanceWindow = 5
distances = array.new_float(distanceWindow, 0.0)
array.shift(distances)
array.push(distances, distance)

// Calculate the average distance of the last 5 distances
avgDistance = array.avg(distances)

// Track distance between EMA40 and EMA13 for the last few candles
distance40_13 = math.abs(ema40 - ema13)
distanceWindow40_13 = 5
distances40_13 = array.new_float(distanceWindow40_13, 0.0)
array.shift(distances40_13)
array.push(distances40_13, distance40_13)

// Calculate the average distance for EMA40 and EMA13
avgDistance40_13 = array.avg(distances40_13)

// Neutral condition: if the current distance is lower than the average of the last 5 distances
neutralCondition = distance < avgDistance or ema13 > ema5

// Short signal condition: EMA40 crosses above EMA55
shortCondition = ema40 > ema55

// Conditions for Green and Red signals (based on RSI thresholds)
greenSignalCondition = rsi > 60  // Green if RSI > 60, regardless of EMAs
redSignalCondition = rsi < 40  // Red if RSI < 40, regardless of EMAs

// Combine conditions for a buy signal (Long)
longCondition = emaShortTermCondition and emaLongTermCondition and rsiCondition and not neutralCondition

// Store the last signal (initialized as na)
var string lastSignal = na

// Track previous distance between EMA40 and EMA13
var float prevDistance40_13 = na

// Check if the current distance between EMA40 and EMA13 is greater than the previous
distanceCondition = (not na(prevDistance40_13)) ? (distance40_13 > prevDistance40_13) : true

// Update the lastSignal only if the current candle closes above EMA5, otherwise recalculate it
if (close > ema5)
    if (longCondition and distanceCondition)
        lastSignal := "long"
    else if (shortCondition and distanceCondition)
        lastSignal := "short"
    else if (neutralCondition)
        lastSignal := "neutral"
    // Add green signal based on RSI
    else if (greenSignalCondition)
        lastSignal := "green"
    // Add red signal based on RSI
    else if (redSignalCondition)
        lastSignal := "red"

// If current candle doesn't close above EMA5, recalculate the signal based on current conditions
if (close <= ema5)
    if (longCondition)
        lastSignal := "long"
    else if (shortCondition)
        lastSignal := "short"
    else if (greenSignalCondition)
        lastSignal := "green"
    else if (redSignalCondition)
        lastSignal := "red"
    else
        lastSignal := "neutral"

// Update previous distance for next comparison
prevDistance40_13 := distance40_13

// Set signal conditions based on lastSignal
isLong = lastSignal == "long"
isShort = lastSignal == "short"
isNeutral = lastSignal == "neutral"
isGreen = lastSignal == "green"
isRed = lastSignal == "red"

// Plot signals with preference for long (green) and short (red), no multiple signals per bar
plotshape(isLong, style=shape.circle, color=color.green, location=location.belowbar, size=size.tiny)
plotshape(isShort and not isLong, style=shape.circle, color=color.red, location=location.abovebar, size=size.tiny)
plotshape(isNeutral and not isLong and not isShort, style=shape.circle, color=color.gray, location=location.abovebar, size=size.tiny)
plotshape(isGreen and not isLong and not isShort and not isNeutral, style=shape.circle, color=color.green, location=location.belowbar, size=size.tiny)
plotshape(isRed and not isLong and not isShort and not isNeutral, style=shape.circle, color=color.red, location=location.abovebar, size=size.tiny)

// Plot EMAs for visualization
plot(ema5, color=color.blue, title="EMA 5")
plot(ema13, color=color.orange, title="EMA 13")
plot(ema40, color=color.green, title="EMA 40")
plot(ema55, color=color.red, title="EMA 55")

// Plot RSI average for debugging (optional, remove if not needed)
// plot(averageRsi, title="Average RSI", color=color.orange)
// hline(50, title="RSI 50", color=color.gray)  // Optional: Comment this out too if not needed


if isLong
    strategy.entry("Enter Long", strategy.long)
else if isShort
    strategy.entry("Enter Short", strategy.short)

관련

더 많은