//@version=6
strategy("Manual Operativo MTF (D+TF) - RSI integrado, senales visibles", overlay=true, initial_capital=10000, pyramiding=3, default_qty_type=strategy.percent_of_equity, default_qty_value=1, max_labels_count=500)
//================ Inputs ================
timingTF = input.timeframe("240", "TF de timing (dispara senales)")
emaLen1 = input.int(15, "EMA corta D")
emaLen2 = input.int(28, "EMA media D")
emaLen3 = input.int(60, "EMA larga D")
rsiLen = input.int(14, "RSI periodo D")
rsiOB = input.float(85.0, "RSI sobrecompra >=")
rsiOS = input.float(20.0, "RSI sobreventa <=")
macdFast = input.int(12, "MACD rapida")
macdSlow = input.int(26, "MACD lenta")
macdSig = input.int(9, "MACD senal")
showEMAs = input.bool(true, "Mostrar EMAs Diarias")
showOrders = input.bool(true, "Abrir ordenes (backtest)")
scaleOutPct= input.int(33, "Parcial en largos cuando RSI >= OB (%)", minval=1, maxval=100)
// Texto corto del TF para etiquetas
tfDisp = timingTF == "240" ? "4H" : timingTF == "60" ? "1H" : timingTF == "D" ? "1D" : timingTF
//================ Diario (filtros) ================
rsiD = request.security(syminfo.tickerid, "D", ta.rsi(close, rsiLen), barmerge.gaps_off, barmerge.lookahead_off)
[macdD, macdSigD, macdHistD] = request.security(syminfo.tickerid, "D", ta.macd(close, macdFast, macdSlow, macdSig), barmerge.gaps_off, barmerge.lookahead_off)
ema1D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen1), barmerge.gaps_off, barmerge.lookahead_off)
ema2D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen2), barmerge.gaps_off, barmerge.lookahead_off)
ema3D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen3), barmerge.gaps_off, barmerge.lookahead_off)
// Tendencia por EMAs
trendUp = ema1D > ema2D and ema2D > ema3D
trendDown = ema1D < ema2D and ema2D < ema3D
// Estado MACD diario (no requiere cruce en la misma barra)
macdUp = macdD > macdSigD
macdDown = macdD < macdSigD
// Reglas RSI del Manual
rsiOverbought = rsiD >= rsiOB
rsiOversold = rsiD <= rsiOS
// Si la tendencia diaria es bajista, SOLO se permite comprar cuando RSI <= 20.
// En cualquier otra situacion (alcista o lateral), no restringimos por RSI para la compra.
rsiBuyFilter = (trendDown and rsiOversold) or not trendDown
// Para ventas/shorts, si la tendencia es alcista podemos exigir rsiOverbought para ser mas estrictos.
// Mantendremos coherencia con el manual (enfoque principal en parciales de largos con RSI>=85).
rsiSellFilter = (trendUp and rsiOverbought) or trendDown or not trendUp
//================ Timing (TF elegido) ================
closeT = request.security(syminfo.tickerid, timingTF, close, barmerge.gaps_off, barmerge.lookahead_off)
ema15T = request.security(syminfo.tickerid, timingTF, ta.ema(close, 15), barmerge.gaps_off, barmerge.lookahead_off)
// Confirmar cierre de barra del TF de timing
timingBarClosed = request.security(syminfo.tickerid, timingTF, barstate.isconfirmed, barmerge.gaps_off, barmerge.lookahead_off)
// Disparadores por cruce precio vs EMA15 del TF de timing (una vez por cierre)
longTrigger = ta.crossover(closeT, ema15T) and timingBarClosed
shortTrigger = ta.crossunder(closeT, ema15T) and timingBarClosed
//================ Senales finales ====================
// Largos solo si: tendencia alcista, MACD diario arriba de su senal, cruce timing y filtro RSI segun manual.
longSignal = trendUp and macdUp and longTrigger and rsiBuyFilter
// Cortos solo si: tendencia bajista, MACD diario debajo de su senal, cruce timing y filtro RSI (relajado).
shortSignal = trendDown and macdDown and shortTrigger and rsiSellFilter
//================ Ordenes (opcional backtest) ================
if showOrders and longSignal
strategy.entry("Long", strategy.long)
if showOrders and shortSignal
strategy.entry("Short", strategy.short)
// Parcial en largos cuando RSI >= 85 (segun manual)
rsiCrossOB = ta.crossover(rsiD, rsiOB)
if rsiCrossOB and strategy.position_size > 0
strategy.order("ParcialLong_RSI_OB", strategy.short, qty=math.abs(strategy.position_size) * (scaleOutPct * 0.01))
//================ Senales graficas ===================
atrD = request.security(syminfo.tickerid, "D", ta.atr(14), barmerge.gaps_off, barmerge.lookahead_off)
sigOffset = atrD * 0.30
bothSame = longSignal and shortSignal
// Tarjetas
if longSignal
label.new(bar_index, low - sigOffset, "COMPRA " + tfDisp, xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_up, size=size.normal, color=color.new(color.green, 0), textcolor=color.white)
if shortSignal
label.new(bar_index, high + (bothSame ? sigOffset * 2.0 : sigOffset), "VENTA " + tfDisp, xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_down, size=size.normal, color=color.new(color.red, 0), textcolor=color.white)
// Flechas globales
plotshape(longSignal, title="Flecha Compra", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.new(color.green, 0))
plotshape(shortSignal, title="Flecha Venta", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.new(color.red, 0))
// Sombreado y alertas (mensajes constantes)
bgcolor(longSignal ? color.new(color.green, 92) : na)
bgcolor(shortSignal ? color.new(color.red, 92) : na)
alertcondition(longSignal, title="Alerta Compra TF timing", message="Senal de COMPRA segun TF de timing")
alertcondition(shortSignal, title="Alerta Venta TF timing", message="Senal de VENTA segun TF de timing")
//================ EMAs diarias ======================
plot(showEMAs ? ema1D : na, "EMA15 D", color=color.new(color.green, 0))
plot(showEMAs ? ema2D : na, "EMA28 D", color=color.new(color.orange, 0))
plot(showEMAs ? ema3D : na, "EMA60 D", color=color.new(color.red, 0))
CON RSI
El texto proporcionado es el código fuente de una estrategia de trading para Pine Script, diseñada para operar en TradingView. Esta estrategia, titulada "Estrategia MTF con RSI y MACD Diario," implementa un enfoque de marco temporal múltiple (MTF), utilizando un marco temporal diario para filtros de tendencia y osciladores, mientras que un marco temporal más rápido (como 4H o 1H) se emplea para las señales de disparo (timing). Los filtros diarios se basan en el cruce de tres Medias Móviles Exponenciales (EMAs) (15, 28 y 60), el Índice de Fuerza Relativa (RSI) para sobrecompra/sobreventa, y el MACD para confirmar la dirección. Las señales finales de compra o venta (longSignal y shortSignal) requieren la alineación de la tendencia diaria con los filtros de osciladores, además de un cruce del precio con una EMA15 en el marco temporal de timing. Finalmente, la estrategia incluye la lógica para gestionar órdenes, backtesting y representaciones gráficas como flechas y colores de fondo.
--------------------------------------------------------------------------------
Este manual tiene como propósito fundamental proporcionar a un operador discrecional un conjunto de reglas mecánicas, claras y precisas para ejecutar una estrategia de trading Multi-Timeframe (MTF). La filosofía central de este sistema es utilizar un marco de tiempo superior, el gráfico Diario (D), para definir la tendencia y el momentum predominantes, actuando como un filtro robusto. Posteriormente, se emplea un marco de tiempo inferior, o de Sincronización (4H), para identificar puntos de entrada de alta probabilidad que se alineen con la dirección establecida por el filtro de orden superior.
La lógica fundamental de la estrategia reside en una confluencia de tres pilares técnicos. Primero, utiliza un sistema de Medias Móviles Exponenciales (EMAs) para definir la estructura de la tendencia principal. Segundo, requiere una confirmación de momentum a través del indicador MACD, asegurando que la fuerza acompaña a la tendencia. Finalmente, emplea el Índice de Fuerza Relativa (RSI) para evaluar condiciones de sobre-extensión del mercado, añadiendo un filtro condicional que refina las decisiones. Esta combinación crea un enfoque sistemático diseñado para filtrar el ruido de corto plazo y permitir al operador posicionarse a favor de la fuerza principal del mercado.
La correcta configuración del espacio de trabajo es el primer paso indispensable para aplicar esta metodología de manera consistente y sin ambigüedades.
Es de vital importancia que la configuración de los gráficos e indicadores sea idéntica a la especificada por el sistema. Cualquier desviación en los parámetros puede conducir a una interpretación incorrecta de las condiciones del mercado y, en consecuencia, a una toma de decisiones incoherente con la lógica de la estrategia. La consistencia en la ejecución comienza con una configuración precisa del entorno de análisis.
A continuación, se detallan todos los componentes y parámetros necesarios:
Componente
Marco Temporal
Parámetro
Valor
Marco de Filtro
N/A
Timeframe
Diario (D)
Marco de Sincronización
N/A
Timeframe
4 Horas (4H)
EMA 1
Diario
Periodo
15
EMA 2
Diario
Periodo
28
EMA 3
Diario
Periodo
60
MACD
Diario
Rápida / Lenta / Señal
12 / 26 / 9
RSI
Diario
Periodo
14
RSI
Diario
Nivel Sobrecompra
>= 85.0
RSI
Diario
Nivel Sobreventa
<= 20.0
EMA de Sincronización
4 Horas
Periodo
15
Una vez que los gráficos estén configurados con estos parámetros exactos, el siguiente paso es realizar el análisis del marco temporal Diario para determinar la dirección operativa permitida.
El análisis del gráfico Diario cumple una función puramente estratégica: establecer un sesgo direccional claro ("bias"). Esta fase no busca generar señales de entrada directas, sino autorizar o prohibir la búsqueda de operaciones en una dirección específica. Las operaciones de compra o venta solo se considerarán si el filtro del marco temporal superior da su aprobación explícita.
Evaluación de la Tendencia Principal (EMAs)
La tendencia se define exclusivamente por el orden secuencial de las tres Medias Móviles Exponenciales.
Tendencia Alcista Fuerte: Se confirma cuando la EMA de 15 está por encima de la EMA de 28, y a su vez, la EMA de 28 está por encima de la EMA de 60.
Tendencia Bajista Fuerte: Se confirma cuando la EMA de 15 está por debajo de la EMA de 28, y a su vez, la EMA de 28 está por debajo de la EMA de 60.
Nota Crítica: Si las EMAs no están perfectamente ordenadas para una tendencia alcista o bajista fuerte, la condición de tendencia principal no se cumple. Dado que esta condición es un requisito obligatorio para cualquier nueva señal, no se generarán órdenes de entrada en estas circunstancias. La estrategia está diseñada exclusivamente para operar en mercados con una tendencia fuerte y definida.
Filtro de Momentum (MACD)
Además de una tendencia definida, la estrategia requiere una confirmación de que el momentum apoya dicha tendencia.
Momentum Alcista: Se confirma cuando la línea MACD (12, 26) se encuentra por encima de su Línea de Señal (9).
Momentum Bajista: Se confirma cuando la línea MACD (12, 26) se encuentra por debajo de su Línea de Señal (9).
Reglas Condicionales del Filtro RSI
Este filtro añade una capa de confirmación adicional, pero su aplicación está subordinada a la condición de tendencia principal.
Filtro de Compra: La regla subyacente del filtro RSI permite compras en tendencia alcista sin condiciones, pero si la tendencia fuera bajista, solo las permitiría con un RSI en sobreventa (<= 20.0).
Filtro de Venta: La regla subyacente del filtro RSI permite ventas en tendencia bajista sin condiciones, pero si la tendencia fuera alcista, solo las permitiría con un RSI en sobrecompra (>= 85.0).
Es crucial entender que, si bien hemos definido estas condiciones de filtro, la generación final de señales de la estrategia es máximamente conservadora. Una nueva señal de entrada solo se activará cuando exista una alineación perfecta de una tendencia fuerte (EMAs ordenadas) y el momentum correspondiente (confirmación del MACD). Como resultado, las condiciones más complejas del RSI actúan como una comprobación secundaria, pero para la generación de una nueva entrada, la condición de tendencia principal asegura que el filtro RSI se cumpla automáticamente.
Una vez se ha determinado un sesgo direccional claro y autorizado en el gráfico Diario, el operador debe dirigir su atención al marco temporal de sincronización para esperar el disparador de entrada preciso.
Esta fase representa el momento de la ejecución táctica. Mientras que el gráfico Diario establece "en qué dirección operar", el gráfico de Sincronización de 4 Horas (4H) define "exactamente cuándo apretar el gatillo". El objetivo es encontrar un punto de entrada de bajo riesgo que se alinee con la marea del marco temporal superior.
El único mecanismo de disparo de la estrategia se basa en la interacción del precio con la Media Móvil Exponencial de 15 periodos (EMA de 15) en el gráfico de 4 Horas.
Disparador de Compra (Long): Se produce cuando el precio de cierre de una vela de 4H cruza y cierra por encima de la EMA de 15. Es imperativo que la vela haya finalizado su periodo; la señal no es válida en una vela en formación.
Disparador de Venta (Short): Se produce cuando el precio de cierre de una vela de 4H cruza y cierra por debajo de la EMA de 15. Al igual que en la compra, la señal solo se confirma una vez que la vela ha cerrado.
La siguiente sección unificará los filtros de la Fase 1 con estos disparadores de la Fase 2 en un checklist final de operaciones, que debe ser la guía definitiva para actuar.
Esta sección es la guía de referencia final y no negociable antes de ejecutar cualquier operación. Una oportunidad de trading solo se considera válida si se cumplen absolutamente todos los criterios listados para la dirección correspondiente. No hay espacio para la ambigüedad.
Filtro de Tendencia (Diario): ¿La EMA de 15 > EMA de 28 Y la EMA de 28 > EMA de 60?
Filtro de Momentum (Diario): ¿La línea MACD está por encima de su Línea de Señal?
Confirmación de Regla RSI (Diario): Dado que la tendencia es alcista, la condición RSI se cumple automáticamente y no impone restricciones adicionales.
Disparador de Entrada (4H): ¿Una vela de 4H acaba de cerrar por encima de la EMA de 15?
Filtro de Tendencia (Diario): ¿La EMA de 15 < EMA de 28 Y la EMA de 28 < EMA de 60?
Filtro de Momentum (Diario): ¿La línea MACD está por debajo de su Línea de Señal?
Confirmación de Regla RSI (Diario): Dado que la tendencia es bajista, la condición RSI se cumple automáticamente y no impone restricciones adicionales.
Disparador de Entrada (4H): ¿Una vela de 4H acaba de cerrar por debajo de la EMA de 15?
Una vez se ha entrado en una posición siguiendo rigurosamente este checklist, la atención del operador debe pasar de la ejecución a la gestión activa de la operación.
Una entrada excelente puede ser arruinada por una mala gestión de la posición. Esta sección detalla las reglas de salida que están codificadas en la estrategia, proporcionando un marco para la toma de beneficios y la gestión del riesgo.
Regla de Salida Parcial
La estrategia incluye una única regla explícita para la toma de beneficios parcial, aplicable solo a las posiciones largas.
Toma de Beneficios Parcial en Posiciones Largas: Si se mantiene una posición de compra activa y el RSI Diario (14) cruza por encima del nivel de sobrecompra de 85.0, se debe vender el 33% de la posición abierta.
Aclaraciones sobre Otras Salidas y Gestión de Riesgo
Es crucial entender los siguientes comportamientos del sistema para una gestión completa:
Ausencia de Stop Loss Explícito: La estrategia codificada no define un nivel de stop loss mecánico. Esto implica que el operador discrecional es responsable de implementar su propia política de gestión de riesgo para definir el punto de invalidación de cada operación y proteger su capital.
Sistema de Reversión: El sistema está diseñado para estar siempre en el mercado, ya sea en una posición larga o corta. Una señal de venta válida y confirmada no solo abrirá una nueva posición de venta, sino que también cerrará cualquier posición de compra existente. De manera análoga, una señal de compra válida cerrará cualquier posición de venta abierta y establecerá una nueva posición de compra.
Una vez comprendidas las reglas de entrada y salida, el pilar final para el éxito es la disciplina inquebrantable en su aplicación.
La efectividad de cualquier sistema de trading no reside en su complejidad, sino en la capacidad del operador para ejecutarlo de manera consistente y sin desviaciones emocionales. Este manual traduce un código en un plan de acción, pero es la disciplina del operador la que lo convierte en resultados.
Los pilares fundamentales de esta estrategia se pueden resumir en tres principios clave:
Paciencia: La habilidad de esperar a que el marco temporal Diario alinee de forma inequívoca la tendencia y el momentum. Operar sin esta confirmación es operar en contra de la lógica del sistema.
Precisión: La disciplina para actuar únicamente cuando el marco temporal de 4 Horas proporcione un disparador de entrada claro y confirmado al cierre de la vela. Las entradas prematuras o tardías invalidan la ventaja estadística.
Consistencia: El compromiso de aplicar las reglas de entrada, salida parcial y gestión de riesgo de forma idéntica en cada operación, sin excepción. Cada operación es una instancia en una larga serie, y el rendimiento a largo plazo depende de seguir el proceso rigurosamente.
El objetivo final es internalizar estas reglas hasta que su aplicación se vuelva metódica, sistemática y automática. Esta es la base sobre la que se construye un trading profesional y disciplinado.
//@version=6
//Desarrollado por Yoguis y ChatGPT
strategy("Manual Operativo MTF (D+TF) - Senales visibles (fix v6 sin strategy.risk.max_entries)",
overlay=true, initial_capital=10000,
pyramiding=3, default_qty_type=strategy.percent_of_equity, default_qty_value=1,
max_labels_count=500)
//===== Inputs
timingTF = input.timeframe("240", "TF de timing (dispara senales)")
emaLen1 = input.int(15, "EMA corta D")
emaLen2 = input.int(28, "EMA media D")
emaLen3 = input.int(60, "EMA larga D")
rsiLen = input.int(14, "RSI periodo D")
macdFast = input.int(12, "MACD rapida")
macdSlow = input.int(26, "MACD lenta")
macdSig = input.int(9, "MACD senal")
showEMAs = input.bool(true, "Mostrar EMAs Diarias")
showOrders= input.bool(true, "Abrir ordenes (backtest)")
// Texto corto del TF para etiquetas
tfDisp = timingTF == "240" ? "4H" : timingTF == "60" ? "1H" : timingTF == "D" ? "1D" : timingTF
//===== Filtros Diario (mapeados sin lookahead)
rsiD = request.security(syminfo.tickerid, "D", ta.rsi(close, rsiLen), barmerge.gaps_off, barmerge.lookahead_off)
[macdD, macdSigD, macdHistD] = request.security(syminfo.tickerid, "D", ta.macd(close, macdFast, macdSlow, macdSig), barmerge.gaps_off, barmerge.lookahead_off)
ema1D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen1), barmerge.gaps_off, barmerge.lookahead_off)
ema2D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen2), barmerge.gaps_off, barmerge.lookahead_off)
ema3D = request.security(syminfo.tickerid, "D", ta.ema(close, emaLen3), barmerge.gaps_off, barmerge.lookahead_off)
trendUp = ema1D > ema2D and ema2D > ema3D
trendDown = ema1D < ema2D and ema2D < ema3D
macdUp = macdD > macdSigD
macdDown = macdD < macdSigD
//===== Timing en TF elegido (proyectado a cualquier periodo)
closeT = request.security(syminfo.tickerid, timingTF, close, barmerge.gaps_off, barmerge.lookahead_off)
ema15T = request.security(syminfo.tickerid, timingTF, ta.ema(close, 15), barmerge.gaps_off, barmerge.lookahead_off)
// Evaluar cruces solo al cierre de la barra del TF de timing
timingBarClosed = request.security(syminfo.tickerid, timingTF, barstate.isconfirmed, barmerge.gaps_off, barmerge.lookahead_off)
longTrigger = ta.crossover(closeT, ema15T) and timingBarClosed
shortTrigger = ta.crossunder(closeT, ema15T) and timingBarClosed
// Señales finales (visibles en 4H y en cualquier TF del grafico)
longSignal = trendUp and macdUp and longTrigger
shortSignal = trendDown and macdDown and shortTrigger
//===== Ordenes (opcional para backtest)
if showOrders and longSignal
strategy.entry("Long", strategy.long)
if showOrders and shortSignal
strategy.entry("Short", strategy.short)
//===== Offset visual con ATR diario
atrD = request.security(syminfo.tickerid, "D", ta.atr(14), barmerge.gaps_off, barmerge.lookahead_off)
sigOffset = atrD * 0.30
bothSameBar = longSignal and shortSignal
//===== Etiquetas (tarjetas) con TF en texto
if longSignal
label.new(bar_index, low - sigOffset, "COMPRA " + tfDisp, xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_up, size=size.normal, color=color.new(color.green, 0), textcolor=color.white)
if shortSignal
label.new(bar_index, high + (bothSameBar ? sigOffset * 2.0 : sigOffset), "VENTA " + tfDisp, xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_down, size=size.normal, color=color.new(color.red, 0), textcolor=color.white)
//===== Flechas globales
plotshape(longSignal, title="Flecha Compra", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.new(color.green, 0))
plotshape(shortSignal, title="Flecha Venta", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.new(color.red, 0))
//===== Resaltado y alertas (mensajes const)
bgcolor(longSignal ? color.new(color.green, 92) : na)
bgcolor(shortSignal ? color.new(color.red, 92) : na)
alertcondition(longSignal, title="Alerta Compra TF timing", message="Senal de COMPRA segun TF de timing")
alertcondition(shortSignal, title="Alerta Venta TF timing", message="Senal de VENTA segun TF de timing")
//===== EMAs diarias
plot(showEMAs ? ema1D : na, "EMA15 D", color=color.new(color.green, 0))
plot(showEMAs ? ema2D : na, "EMA28 D", color=color.new(color.orange, 0))
plot(showEMAs ? ema3D : na, "EMA60 D", color=color.new(color.red, 0))
El texto proporcionado consiste en extractos de un script de estrategia de trading llamado "Manual Operativo MTF (D+TF) - Senales visibles", escrito en el lenguaje de programación Pine Script (indicado por //@version=6). Esta estrategia fue desarrollada por Yoguis y ChatGPT e implementa un sistema operativo multiframe temporal (MTF) que utiliza filtros diarios junto con una sincronización en un marco temporal menor (timingTF) para generar señales de compra y venta. La lógica central se basa en la tendencia diaria definida por tres medias móviles exponenciales (EMA) y la dirección del indicador MACD, combinada con el cruce de precios sobre una EMA corta en el marco temporal de sincronización. Además de las órdenes de estrategia para backtesting, el código incluye la visualización de las señales mediante etiquetas y flechas, así como la configuración de alertas para notificar a los usuarios.
Este documento sirve como una guía técnica exhaustiva para desarrolladores y analistas cuantitativos que necesiten comprender, mantener o modificar el script "Manual Operativo MTF". Su propósito es desglosar la arquitectura, lógica y configuración de un sistema de trading algorítmico diseñado para generar señales operativas.
La arquitectura fundamental de la estrategia es un sistema Multi-Timeframe (MTF). Utiliza un marco de tiempo superior (Diario) para establecer un filtro de tendencia principal y un marco de tiempo inferior (de "timing") para identificar puntos de entrada precisos alineados con dicha tendencia.
El objetivo del script es generar señales de compra/venta visuales y ejecutables para backtesting, basadas en la confluencia de condiciones técnicas en ambos marcos de tiempo. Con la configuración de la estrategia establecida, la siguiente sección detalla las propiedades que rigen su comportamiento en el motor de backtesting.
La función strategy() es la cabecera que define el comportamiento fundamental del script en la plataforma de trading. Esta declaración establece las reglas para la ejecución del backtest, la gestión de capital y la presentación visual.
Propiedad
Descripción
title
Nombre descriptivo de la estrategia que aparece en la UI.
overlay
true: Renderiza los elementos visuales de la estrategia directamente sobre el gráfico de precios principal.
initial_capital
10000: Fija el capital inicial hipotético para los cálculos del backtesting.
pyramiding
3: Permite hasta un máximo de 3 entradas en la misma dirección antes de cerrar la posición.
default_qty_type
strategy.percent_of_equity: Configura el cálculo del tamaño de la posición como un porcentaje del capital total.
default_qty_value
1: Configura el motor de backtesting para abrir posiciones dimensionadas al 1% del capital actual de la estrategia en el momento de la entrada. Esto define el tamaño de la posición, no el riesgo, el cual dependería de un stop-loss no implementado en esta estrategia.
max_labels_count
500: Limita el número máximo de etiquetas (label) renderizadas para optimizar el rendimiento del gráfico.
Con los parámetros del backtest definidos, la siguiente sección detalla las entradas configurables por el usuario que gobiernan la lógica central de la estrategia.
Esta sección define los parámetros que el usuario puede personalizar desde la interfaz, lo que permite adaptar y optimizar la estrategia sin modificar el código fuente.
Variable
Etiqueta en UI
Tipo de Dato
Descripción Funcional
timingTF
TF de timing (dispara senales)
Timeframe
Marco de tiempo inferior (def: "240") utilizado para generar las señales de entrada.
emaLen1
EMA corta D
Integer
Período (def: 15) para la media móvil exponencial más rápida del filtro de tendencia Diario.
emaLen2
EMA media D
Integer
Período (def: 28) para la EMA intermedia del filtro de tendencia Diario.
emaLen3
EMA larga D
Integer
Período (def: 60) para la EMA más lenta del filtro de tendencia Diario.
rsiLen
RSI periodo D
Integer
Nota: Período (def: 14) para el RSI Diario. Actualmente, este parámetro es vestigial, ya que el valor del RSI calculado no se utiliza en la lógica de generación de señales.
macdFast
MACD rapida
Integer
Período de la EMA rápida (def: 12) para el cálculo del MACD.
macdSlow
MACD lenta
Integer
Período de la EMA lenta (def: 26) para el cálculo del MACD.
macdSig
MACD senal
Integer
Período de la línea de señal (def: 9) para el cálculo del MACD.
showEMAs
Mostrar EMAs Diarias
Boolean
Controla la visibilidad (def: true) de las tres EMAs del marco de tiempo Diario en el gráfico.
showOrders
Abrir ordenes (backtest)
Boolean
Habilita o deshabilita (def: true) la ejecución de órdenes en el motor de backtesting.
Adicionalmente, la variable tfDisp deriva de timingTF para crear una representación textual abreviada (ej. "4H") utilizada en las etiquetas visuales de las señales.
El núcleo conceptual de la estrategia reside en su arquitectura MTF. Este enfoque disocia la lógica en un filtro de tendencia macro (Diario) y un disparador de entrada micro (Timing TF), con el objetivo de ejecutar operaciones únicamente en la dirección de la tendencia principal.
Esta sección del código establece la dirección predominante del mercado utilizando datos del marco de tiempo "D". La función request.security se emplea para obtener los valores de los indicadores de este timeframe superior, utilizando barmerge.gaps_off y barmerge.lookahead_off para prevenir el repintado y el sesgo de anticipación, garantizando así la integridad histórica de las señales.
Se definen las siguientes condiciones booleanas en el contexto diario:
trendUp / trendDown: Determinan la tendencia principal basándose en el ordenamiento de las EMAs (ema1D, ema2D, ema3D). trendUp es true si ema1D > ema2D > ema3D, y viceversa para trendDown.
macdUp / macdDown: Actúan como filtro de momentum. macdUp es true cuando la línea MACD diaria cruza por encima de su línea de señal.
Cálculo Vestigial: Se calcula un RSI diario (rsiD) utilizando el input rsiLen. Es crucial señalar que esta variable no interviene en ninguna de las condiciones de señal (longSignal o shortSignal), por lo que su cálculo no tiene impacto operativo en la versión actual del script.
Una vez establecida la dirección por el filtro diario, esta lógica identifica el momento preciso de entrada en el marco de tiempo inferior (timingTF).
Se obtienen el precio de cierre (closeT) y una EMA de 15 períodos (ema15T) del timingTF. Es importante destacar que el período de esta EMA (15) está hardcodeado en el código y no es configurable a través de los inputs.
La variable timingBarClosed es de importancia crítica. Utiliza request.security para consultar barstate.isconfirmed en el timingTF. Dado que el script se ejecuta en el timeframe del gráfico, timingBarClosed garantiza que la estrategia no actúe sobre un cruce en el timingTF hasta que la vela de ese timeframe superior haya cerrado oficialmente. Esto previene la ejecución de señales falsas intra-vela que podrían revertirse antes del cierre.
Las variables longTrigger y shortTrigger se activan mediante ta.crossover y ta.crossunder del precio respecto a la EMA de 15 períodos, condicionado a que timingBarClosed sea true.
La interacción entre el filtro diario y este disparador conforma la base para la generación de señales.
En esta sección, las condiciones de ambos marcos de tiempo convergen para generar las señales operativas finales. La lógica de confluencia se define de la siguiente manera:
longSignal: true cuando (trendUp AND macdUp) en el marco de tiempo Diario converge con longTrigger en el marco de tiempo de Timing.
shortSignal: true cuando (trendDown AND macdDown) en el marco de tiempo Diario converge con shortTrigger en el marco de tiempo de Timing.
Posteriormente, la ejecución de las órdenes de entrada (strategy.entry) está condicionada por el input booleano showOrders, permitiendo al usuario utilizar el script para análisis visual sin ejecutar el backtest.
Los elementos visuales son cruciales para la interpretación de las señales. El script implementa los siguientes componentes para comunicar la lógica de la estrategia de forma efectiva.
Etiquetas de Señal Se utiliza label.new para crear etiquetas de "COMPRA" y "VENTA" cuando longSignal o shortSignal se activan. La posición vertical de estas etiquetas se ajusta dinámicamente con un offset (sigOffset) derivado del ATR diario (atrD) para mejorar la legibilidad. Una lógica adicional (bothSameBar) gestiona la posición si ambas señales ocurren en la misma barra para evitar solapamientos.
Flechas de Señal La función plotshape dibuja flechas triangulares (shape.triangleup y shape.triangledown) en las velas de señal, proporcionando un indicador visual inmediato y discreto.
Resaltado de Fondo del Gráfico La función bgcolor colorea el fondo del gráfico (verde para compra, rojo para venta) para destacar las zonas de activación de señales, ofreciendo un contexto visual rápido.
Visualización de EMAs Diarias Las tres EMAs del marco de tiempo diario se dibujan mediante plot, con su visibilidad controlada por el input showEMAs.
Configuración de Alertas Se utiliza alertcondition para exponer las señales longSignal y shortSignal al sistema de alertas de la plataforma, permitiendo al usuario crear notificaciones personalizadas.
Estos componentes transforman la lógica abstracta de la estrategia en una herramienta de análisis práctico e interactivo.