
Chiến lược này đánh giá xu hướng thị trường bằng cách sử dụng tính năng phản xạ của đường trung bình di chuyển Hull ((HMA)). Cốt lõi của chiến lược là tính toán giá trị chênh lệch giữa đường trung bình di chuyển Hull ngắn hạn và dài hạn và dự đoán xu hướng giá bằng cách sử dụng giá trị phản xạ của sự khác biệt này. Bằng cách thiết lập các tham số phần trăm có thể điều chỉnh, chiến lược có thể thích ứng với các chu kỳ giao dịch khác nhau, do đó cung cấp tín hiệu đánh giá xu hướng chính xác hơn.
Chiến lược sử dụng hai đường trung bình di chuyển của Hull trong 36 chu kỳ và 44 chu kỳ làm chỉ số cơ bản. Bằng cách tính toán chênh lệch tuyệt đối giữa hai đường trung bình di chuyển này và tính toán phản xạ đối với chênh lệch kết hợp với hướng xu hướng hiện tại, cuối cùng đạt được giá trị phản xạ. Chiến lược cũng đưa ra đường trung bình di chuyển có trọng lượng ((WMA) để tính toán giá trị delta, xác định điểm đảo chiều của xu hướng bằng cách giao thoa giá trị delta này với giá trị phản xạ. Trong quá trình đánh giá xu hướng, chiến lược đặt các nhân tố sửa đổi có thể điều chỉnh để kiểm soát độ nhạy cảm của việc đảo ngược xu hướng.
Chiến lược này được xây dựng một hệ thống theo dõi xu hướng nhạy cảm, thích ứng mạnh mẽ bằng cách kết hợp một cách sáng tạo giữa trung bình di chuyển của Hull và khái niệm giá trị phản xạ. Ưu điểm cốt lõi của chiến lược là khả năng nắm bắt chính xác các điểm thay đổi xu hướng, đồng thời đảm bảo khả năng áp dụng chiến lược trong các môi trường thị trường khác nhau thông qua các tham số có thể điều chỉnh được. Mặc dù có một số rủi ro vốn có, chiến lược này có khả năng trở thành một công cụ giao dịch ổn định và đáng tin cậy bằng cách tối ưu hóa và hoàn thiện liên tục.
/*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