
La estrategia es un sistema de negociación cuantitativa basado en análisis de múltiples marcos de tiempo, que utiliza principalmente el indicador MACD, el indicador RSI, la media VWAP y la señal integrada del filtro de fluctuación ATR en los marcos de tiempo de 30 minutos y 1 hora para ejecutar operaciones. La estrategia admite al mismo tiempo hacer más y hacer menos, mediante la confirmación de señales cruzadas de indicadores técnicos en diferentes marcos de tiempo, y se combina con filtración de condiciones de fluctuación para mejorar la calidad de las operaciones.
El principio central de esta estrategia es filtrar señales de baja calidad a través de la confirmación de múltiples condiciones, que contiene principalmente los siguientes componentes clave:
Señales cruzadas MACD de marco de tiempo múltiple:
El RSI está sobrecomprando y sobrevendendo:
Confirmación de la posición del precio de VWAP doble:
Filtros de fluctuación:
Mecanismo de salida a varios niveles:
A través de este filtro y confirmación de condiciones en varios niveles, las estrategias buscan capturar fluctuaciones de corto y medio plazo con una clara dirección, mientras que filtran señales de baja calidad, mejorando la ganancia y la rentabilidad.
Confirmación del marco temporal múltiple: La estrategia puede identificar mejor las tendencias reales y reducir el impacto de las falsas señales mediante la combinación de señales en los marcos de tiempo de 30 minutos y 1 hora. En particular, la función de confirmación de tendencias MACD de 1 hora ayuda a evitar el comercio de tendencias inversas.
Adaptabilidad a las fluctuacionesEl filtro de fluctuación ATR asegura que las estrategias solo entren en el mercado cuando hay suficiente dinámica para evitar el comercio en zonas de baja volatilidad, lo que reduce el riesgo de movimientos en zonas muertas.
Mecanismo de salida flexibleLa estrategia incluye no solo un stop loss fijo, sino también un mecanismo de salida dinámica basado en una reversión de indicadores, lo que permite salir a tiempo para proteger las ganancias cuando el precio no ha alcanzado el stop loss pero el mercado ha comenzado a invertir.
Confirmación de la posición de doble precio: Pide que el precio se encuentre simultáneamente por encima de los dos marcos de tiempo VWAP (hacer más) o por debajo de (hacer menos), lo que confirma aún más el movimiento y la dirección del precio y reduce las falsas rupturas.
Gestión de riesgos integradaLa estrategia incluye un mecanismo de stop loss y gestión de posiciones (el interés en la cuenta del 5% por cada transacción por defecto), lo que ayuda a controlar el margen de riesgo de cada transacción y a proteger el capital.
Desafío de las bajas tasas de éxitoComo se indica en el código, la estrategia puede tener problemas con la baja tasa de éxito. Esto se debe a que la selección de múltiples condiciones, aunque mejora la calidad de la señal, también reduce significativamente la frecuencia de las transacciones, lo que resulta en una muestra más pequeña y una significación estadística limitada.
Sensibilidad de los parámetrosLa estrategia utiliza varios parámetros ajustables, incluida la longitud MACD, el umbral RSI, los parámetros del filtro ATR, etc. Las pequeñas variaciones de estos parámetros pueden tener un impacto significativo en el rendimiento de la estrategia, con el riesgo de una optimización excesiva.
Limitaciones del porcentaje fijo de stop lossEl uso de la misma proporción de stop ((1.5%) y stop ((0.5%) para todos los entornos de mercado puede no adaptarse a diferentes entornos de volatilidad. En los mercados de alta volatilidad, el stop puede ser demasiado ajustado; en los mercados de baja volatilidad, el stop puede ser demasiado largo.
Retraso en el marco de tiempo múltipleEl uso de señales con un marco de tiempo más largo (por ejemplo, 1 hora) como confirmación puede introducir un retraso, lo que lleva a una oportunidad de entrada perdida o una salida retrasada.
Falta de capacidad de adaptación al entorno del mercado: La estrategia no incluye mecanismos para distinguir entre diferentes entornos de mercado (trend/vibración) y puede no funcionar bien en ciertas condiciones de mercado.
La solución:
Optimización de la parada de pérdidas dinámicas: Cambiar el porcentaje fijo de stop loss a un valor dinámico basado en el ATR, por ejemplo, usar 1.5×ATR como stop loss y 3×ATR como stop loss. Esto permite que la estrategia se adapte mejor a diferentes entornos de volatilidad del mercado, ofreciendo un stop loss más flexible en períodos de alta volatilidad y un objetivo de stop loss más estricto en períodos de baja volatilidad.
Clasificación del entorno del mercadoIntroducción de un mecanismo de identificación de entornos de mercado, que distingue entre mercados de tendencia y mercados de oscilación. Se puede usar el ADX, el ancho de banda de Brin o la relación de los precios con las medias móviles a largo plazo para identificar el estado del mercado y ajustar los parámetros de la estrategia o incluso cambiar la lógica de negociación por completo.
Optimización del tiempo de entradaLa estrategia actual: La entrada de la línea K actual que ocurre en una cruz MACD puede enfrentar un punto de deslizamiento o un retraso en la ejecución. Considere la entrada cuando se abra la siguiente línea K después de la confirmación de la cruz, o establezca un precio de límite para la entrada en una zona de precios específica para obtener un mejor precio de ejecución.
El filtro del tiempoAumentar los filtros de tiempo de negociación para evitar ciertos períodos de negociación ineficientes. Por ejemplo, se puede evitar la negociación en períodos de tiempo en los que la liquidez puede ser baja o fluctuar de manera irregular, como el final del horario asiático o el horario de intercambio entre Europa y los Estados Unidos.
Los parámetros del indicador se adaptanDiseñar los parámetros del MACD, RSI y ATR como valores de adaptación, basados en la volatilidad reciente del mercado o en ajustes automáticos periódicos. Por ejemplo, los parámetros más cortos del MACD se pueden usar en mercados de alta volatilidad y los más largos en mercados de baja volatilidad.
Grado de intensidad de la señalEstablecer un sistema de puntuación de intensidad para las señales de entrada, puntuar las señales en función de varios factores (como el tamaño de la columna MACD, la desviación RSI, la distancia VWAP, etc.), ejecutar solo operaciones cuya intensidad supere un umbral específico o ajustar el tamaño de la posición de acuerdo con la dinámica de la intensidad de la señal.
Aprendizaje automáticoIntroducción de modelos de aprendizaje automático para predecir qué señales son más propensas a generar operaciones rentables, identificación de la combinación de patrones más valiosa basado en modelos de entrenamiento de datos históricos. Esto puede mejorar la adaptabilidad y la tasa de éxito de la estrategia.
Estas orientaciones de optimización tienen como objetivo mejorar la solidez, adaptabilidad y rendimiento a largo plazo de las estrategias, manteniendo intacta su lógica central. A través de estas mejoras, las estrategias pueden responder mejor a los cambios en los diferentes entornos y condiciones del mercado.
La estrategia de comercio de fluctuación cruzada de la tasa de fluctuación de la MACD-RSI en el marco temporal múltiple es un sistema de negociación integral diseñado para identificar oportunidades de comercio de alta calidad mediante la combinación de múltiples indicadores técnicos y señales de varios marcos temporales. La ventaja central de la estrategia radica en su mecanismo de confirmación de señales en varios niveles y en la función de gestión de riesgos incorporada, que le permite controlar el riesgo al mismo tiempo que captura las fluctuaciones de precios.
A pesar de los desafíos de la baja probabilidad de éxito, la estrategia mantiene las expectativas positivas mediante la mejora de la rentabilidad promedio de las operaciones rentables. Se espera que el rendimiento de la estrategia mejore aún más mediante la implementación de las medidas de optimización recomendadas, en particular, el stop loss dinámico, la clasificación del entorno del mercado y la clasificación de la intensidad de la señal.
La estrategia es adecuada para los operadores de corto y medio plazo, especialmente aquellos que buscan un método de negociación sistematizado basado en el análisis técnico y que priorizan la gestión del riesgo. El mecanismo de confirmación condicional de la estrategia, aunque reduce la frecuencia de las operaciones, aumenta la calidad de cada operación, lo que está en consonancia con la filosofía de negociación de “menos es más”, que enfatiza la calidad en lugar de la cantidad.
En la práctica, se recomienda a los operadores que primero prueben la estrategia en un entorno simulado, en particular, que prueben el efecto de las medidas de optimización, y luego las apliquen con cautela a las operaciones reales. Al mismo tiempo, la monitorización continua de las condiciones cambiantes del mercado y el ajuste oportuno de los parámetros de la estrategia ayudarán a mantener un rendimiento estable a largo plazo.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading
//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen = input.int(12, title="MACD Fast EMA Length", minval=1)
slowLen = input.int(26, title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9, title="MACD Signal EMA Length", minval=1)
rsiLen = input.int(14, title="RSI Length", minval=1)
// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)
// ATR filter (30m)
atrLen = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen = input.int(20, title="ATR MA Length (30m)", minval=1)
// Take Profit / Stop Loss (percent)
tpPerc = input.float(1.5, title="Take Profit (%)", minval=0.1) / 100
slPerc = input.float(0.5, title="Stop Loss (%)", minval=0.1) / 100
// Toggle whether to use 1h trend confirmation
use1hTrend = input.bool(true, title="Use 1h MACD Trend Confirmation?")
// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m),
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.
[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m = ta.rsi(close, rsiLen)
atr30m = ta.atr(atrLen)
// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)
// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)
// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma
// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)
// 1h MACD trend confirmation
macdTrendUp1h = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h
// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY:
// • 30m MACD crossover
// • 30m RSI > rsiThreshLong30
// • (optionally) 1h MACD line > 1h MACD signal
// • Price > 30m VWAP AND Price > 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond =
longCross30m
and (rsi30m > rsiThreshLong30)
and (close > vwap30m)
and (close > vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendUp1h : true)
// LONG EXIT:
// • fixed TP/SL
// OR • 30m MACD crossunder
// OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false
if (strategy.position_size > 0)
// Price-based TP / SL checks
entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
longTPprice = entryPriceLong * (1 + tpPerc)
longSLprice = entryPriceLong * (1 - slPerc)
// check TP/SL first
longExitTP = high >= longTPprice
longExitSL = low <= longSLprice
// fallback: MACD crossunder on 30m OR 1h trend flips
macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
macdCross30m = shortCross30m
longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
entryPriceLong := na // reset when no position
// SHORT ENTRY:
// • 30m MACD crossunder
// • 30m RSI < rsiThreshShort30
// • (optionally) 1h MACD line < 1h MACD signal
// • Price < 30m VWAP AND Price < 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond =
shortCross30m
and (rsi30m < rsiThreshShort30)
and (close < vwap30m)
and (close < vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendDown1h : true)
// SHORT EXIT:
// • fixed TP/SL
// OR • 30m MACD crossover
// OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false
if (strategy.position_size < 0)
entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
shortTPprice = entryPriceShort * (1 - tpPerc)
shortSLprice = entryPriceShort * (1 + slPerc)
// check TP/SL first
shortExitTP = low <= shortTPprice
shortExitSL = high >= shortSLprice
macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
macdCrossUp30m = longCross30m
shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
entryPriceShort := na // reset when no position
// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (LT)", alert.freq_once_per_bar_close)
// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
strategy.close("Long")
label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (LT)", alert.freq_once_per_bar_close)
// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (ST)", alert.freq_once_per_bar_close)
// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
strategy.close("Short")
label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (ST)", alert.freq_once_per_bar_close)
// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)`
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.
// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1
// 1h VWAP
plot(vwap1h, title = "VWAP 1h", color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent
// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))
// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))
// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))