
이 전략은 헐 이동 평균 (Hull Moving Average, HMA) 의 반사 특성을 이용하여 시장의 흐름을 판단한다. 전략의 핵심은 단기 및 장기 헐 이동 평균 사이의 차이의 값을 계산하고, 이 차이의 반사 값을 통해 가격 움직임을 예측한다. 조정 가능한 비율 변수를 설정함으로써, 전략은 다른 거래 주기에 적응할 수 있어 더 정확한 추세를 판단하는 신호를 제공한다.
전략은 36주기 및 44주기 두 개의 헐 이동 평균을 기본 지표로 사용합니다. 이 두 개의 이동 평균 사이의 절대적 차이를 계산하고, 현재 트렌드 방향과 결합하여 차이에 대한 반사 계산을 수행하여 반사 값을 얻습니다. 전략은 또한 밸런티드 이동 평균 ((WMA) 을 계산하기 위해 델타 값을 도입합니다. 이 델타 값과 반사 값을 교차하여 트렌드의 전환점을 결정합니다.
이 전략은 혁신적으로 헐 이동 평균과 반사 값 개념을 결합하여 반응 민감하고 적응력이 강한 트렌드 추적 시스템을 구축합니다. 전략의 핵심 장점은 트렌드 전환점을 정확하게 포착하는 능력이며, 조정 가능한 파라미터를 설정하여 다양한 시장 환경에서 전략의 적용성을 보장합니다.
/*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