Hull 이동 평균을 기반으로 한 반사형 EMA 추세 결정 전략

HMA EMA WMA
생성 날짜: 2024-11-29 16:35:43 마지막으로 수정됨: 2024-11-29 16:35:43
복사: 3 클릭수: 493
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Hull 이동 평균을 기반으로 한 반사형 EMA 추세 결정 전략

개요

이 전략은 헐 이동 평균 (Hull Moving Average, HMA) 의 반사 특성을 이용하여 시장의 흐름을 판단한다. 전략의 핵심은 단기 및 장기 헐 이동 평균 사이의 차이의 값을 계산하고, 이 차이의 반사 값을 통해 가격 움직임을 예측한다. 조정 가능한 비율 변수를 설정함으로써, 전략은 다른 거래 주기에 적응할 수 있어 더 정확한 추세를 판단하는 신호를 제공한다.

전략 원칙

전략은 36주기 및 44주기 두 개의 헐 이동 평균을 기본 지표로 사용합니다. 이 두 개의 이동 평균 사이의 절대적 차이를 계산하고, 현재 트렌드 방향과 결합하여 차이에 대한 반사 계산을 수행하여 반사 값을 얻습니다. 전략은 또한 밸런티드 이동 평균 ((WMA) 을 계산하기 위해 델타 값을 도입합니다. 이 델타 값과 반사 값을 교차하여 트렌드의 전환점을 결정합니다.

전략적 이점

  1. 헐 이동 평균을 채택하여 전통적인 이동 평균의 지연을 줄이고 시장 변화에 대한 전략의 대응 속도를 향상시킵니다.
  2. 트렌드 전환점을 더 정확하게 포착할 수 있는 반사값 개념을 도입합니다.
  3. 조정 가능한 수정 요소가 설계되어 정책이 더 잘 적응되도록 합니다.
  4. 절대적 차이의 계산으로 신호의 신뢰성이 향상
  5. 트렌드 제한 선의 동적 조정을 포함한 통합된 위험 제어 장치
  6. 시스템 자체 시각화 구성 요소로 거래자가 시장 상태를 직관적으로 판단할 수 있도록 지원

전략적 위험

  1. 수평 정리 시장에서 빈번한 잘못된 신호가 발생할 수 있습니다.
  2. 파라미터를 잘못 설정하면 신호가 지연되거나 과민하게 반응할 수 있다.
  3. 급격하게 변동하는 시장에서 트렌드 제한선은 적시에 조정되지 않을 수 있습니다.
  4. 전략은 역사적 데이터에 의존하고 시장의 갑작스러운 사건에 대해 충분히 빠르게 반응하지 않을 수 있습니다.

전략 최적화 방향

  1. 변동성 지표의 도입, 동적 조정 수정 인자, 시장 상태에 대한 전략의 적응력을 향상
  2. 시장 상태를 인식하는 메커니즘을 추가하여 다른 시장 환경에서 다른 파라미터 설정을 사용합니다.
  3. 역동적으로 변수를 조정할 수 있는 적응형 변수 최적화 시스템을 개발
  4. 트래픽 분석 모듈을 추가하여 신호의 신뢰성을 향상시킵니다.
  5. 리스크 제어 제도를 개선하고, 손해 방지 및 자금 관리 기능을 추가

요약하다

이 전략은 혁신적으로 헐 이동 평균과 반사 값 개념을 결합하여 반응 민감하고 적응력이 강한 트렌드 추적 시스템을 구축합니다. 전략의 핵심 장점은 트렌드 전환점을 정확하게 포착하는 능력이며, 조정 가능한 파라미터를 설정하여 다양한 시장 환경에서 전략의 적용성을 보장합니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-28 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Reflected EMA Difference (RED)", shorttitle="RED [by MarcosPna]", overlay=true) //mv30
// Análisis de Riesgo
// Risk Analysis
media_delta = ta.wma(2 * ta.wma(close, 8 / 2) - ta.wma(close, 8), math.floor(math.sqrt(8)))

// Calcular EMAs
// Calculate EMAs
ema_corta_delta = ta.hma(close, 36)
ema_larga_delta = ta.hma(close, 44)

// Calcular la diferencia entre las EMAs
// Calculate the difference between EMAs
diferencia_delta_ema = math.abs(ema_corta_delta - ema_larga_delta)

// Calcular el valor reflejado basado en la posición de la EMA corta
// Compute the reflected value based on the position of the short EMA
valor_reflejado_delta = ema_corta_delta + (ema_corta_delta > ema_larga_delta ? diferencia_delta_ema : -diferencia_delta_ema)

// Suavizar el valor reflejado
// Smooth the reflected value
periodo_suavizado_delta = input.int(2, title="Periodo extendido")
ema_suavizada_delta = ta.hma(valor_reflejado_delta, periodo_suavizado_delta)

// Ploteo de las EMAs y la línea reflejada
// Plot EMAs and the reflected line
plot(valor_reflejado_delta, title="Reflected EMA Difference (RED)", color=valor_reflejado_delta > ema_suavizada_delta ? color.rgb(253, 25, 238, 30) : color.rgb(183, 255, 30), linewidth=2, style=plot.style_line)

// Parámetros ajustables para la reversión de tendencia
// Adjustable parameters for trend reversal
factor_correccion_delta = input.float(title='Porcentaje de cambio', minval=0, maxval=100, step=0.1, defval=0.04)
tasa_correccion_delta = factor_correccion_delta * 0.01

// Variables para la reversión de tendencia
// Variables for trend reversal
var int direccion_delta_tendencia = 0
var float precio_maximo_delta = na
var float precio_minimo_delta = na
var float limite_tendencia_delta = na

// Inicializar precio máximo y mínimo con el primer valor de la EMA suavizada reflejada
// Initialize peak and trough prices with the first value of the smoothed reflected EMA
if na(precio_maximo_delta)
    precio_maximo_delta := ema_suavizada_delta
if na(precio_minimo_delta)
    precio_minimo_delta := ema_suavizada_delta

// Lógica de reversión de tendencia con la EMA suavizada reflejada
// Trend reversal logic with the smoothed reflected EMA
if direccion_delta_tendencia >= 0
    if ema_suavizada_delta > precio_maximo_delta
        precio_maximo_delta := ema_suavizada_delta
    limite_tendencia_delta := precio_maximo_delta - (precio_maximo_delta * tasa_correccion_delta)
    if ema_suavizada_delta <= limite_tendencia_delta
        direccion_delta_tendencia := -1
        precio_minimo_delta := ema_suavizada_delta
        strategy.entry("Venta", strategy.short)
else
    if ema_suavizada_delta < precio_minimo_delta
        precio_minimo_delta := ema_suavizada_delta
    limite_tendencia_delta := precio_minimo_delta + (precio_minimo_delta * tasa_correccion_delta)
    if ema_suavizada_delta >= limite_tendencia_delta
        direccion_delta_tendencia := 1
        precio_maximo_delta := ema_suavizada_delta
        strategy.entry("Compra", strategy.long)

// Ploteo y señales
// Plotting and signals
indice_delta_ascendente = plot(direccion_delta_tendencia == 1 ? limite_tendencia_delta : na, title="Aumento de valor", style=plot.style_linebr, linewidth=3, color=color.new(color.green, 0))
senal_compra_delta = direccion_delta_tendencia == 1 and direccion_delta_tendencia[1] == -1
plotshape(senal_compra_delta ? limite_tendencia_delta : na, title="Estilo señal alcista", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))

indice_delta_descendente = plot(direccion_delta_tendencia == 1 ? na : limite_tendencia_delta, title="Disminución de valor", style=plot.style_linebr, linewidth=3, color=color.new(color.red, 0))
senal_venta_delta = direccion_delta_tendencia == -1 and direccion_delta_tendencia[1] == 1
plotshape(senal_venta_delta ? limite_tendencia_delta : na, title="Estilo señal bajista", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))

// Variables para manejo de cajas
// Variables for box management
var box caja_tendencia_delta = na

// Condición: Cruce de HullMA hacia abajo
// Condition: HullMA crosses below reflected EMA value
cruce_bajista_delta = ta.crossunder(media_delta, valor_reflejado_delta)

// Condición: Cruce de HullMA hacia arriba
// Condition: HullMA crosses above reflected EMA value
cruce_alcista_delta = ta.crossover(media_delta, valor_reflejado_delta)

// Dibujar caja cuando HullMA cruza hacia abajo el valor reflejado de EMA
// Draw a box when HullMA crosses below the reflected EMA value
// if (cruce_bajista_delta) and direccion_delta_tendencia == 1
//     caja_tendencia_delta := box.new(left=bar_index, top=high, right=bar_index, bottom=low, text = "Critical Areas", text_color = color.white, border_width=2, border_color=color.rgb(254, 213, 31), bgcolor=color.new(color.red, 90))

// Cerrar caja cuando HullMA cruza hacia arriba el valor reflejado de EMA
// Close the box when HullMA crosses above the reflected EMA value
// if (cruce_alcista_delta and not na(caja_tendencia_delta))
//     box.set_right(caja_tendencia_delta, bar_index)
//     caja_tendencia_delta := na  // Remove the reference to create a new box at the next cross down