Mariel Lang Sáez

Trader sistemática · fundadora de Trade It Simple

MarielLang Sáez

Sin gurú, sin promesas: evidencia.

02 · Quién soy

Quién soy

De todo lo que se publica sobre trading, casi nada sobrevive a una medición honesta. Mi trabajo es medir — y operar solo lo que aguanta.

01

Venezolana

Trader
sistemática

  1. Datos
  2. Reglas
  3. Robots
  4. Dinero real

Automatizo solo lo que sobrevive al protocolo.

02

Código abierto · Pine

4 scripts publicados en TradingView

BTC Confluencia, ELON e ITF26 SOL, con su código Pine; el RSI2, protegido. Ver la galería ↓

03

Fundadora

Trade It
Simple

Logo de Trade It Simple Solutions

Trade It Simple Solutions · escuela y comunidad

Ponente · Sersan Trading Summit 2026

Misma sala.

De quién aprendí y quiénes son mis amigos.

Mariel Lang Sáez con Sergi Sánchez en un estadio
Con Sergi Sánchez · Sersan
Ralph Vince, Andrea Unger, Mariel Lang Sáez e Iván Shcherman, ponentes del Sersan Trading Summit 2026

Ralph Vince · Andrea Unger · Mariel Lang Sáez · Iván Shcherman

Ponentes · Sersan Trading Summit · oct 2026foto oficial

Escenarios · octubre 2026

Mira mis últimas charlas.

  1. Portada: Por qué sistemático y el método TIS, Reto Cueva de Trading

    23–27 oct 2026 · Reto Cueva de Trading

    «Por qué sistemático y el método TIS»

  2. Portada: Inteligencia artificial en trading sistemático, Rankia Markets Experience Madrid 2026

    23 oct 2026 · Rankia Markets Experience · Madrid

    «Inteligencia artificial en trading sistemático: tu mejor aliado o tu peor enemigo»

  3. Portada: Caminos opuestos, misma apuesta, una sola solución, Sersan Trading Summit 2026

    17 oct 2026 · Sersan Trading Summit · Reus

    «Caminos opuestos, misma apuesta, una sola solución»

    Ver el caso de la charla ↗
  4. Portada: Bienvenida a la Mega Cueva, Mega Cueva Sessions

    6–8 oct 2026 · Mega Cueva Sessions · 3 días

    «Bienvenida a la Mega Cueva»

03 · Recursos y acceso

Recursos.

tandyclues.tradeitsimplesolutions.com
Captura real de AED CLUES, la herramienta de análisis exploratorio

Gratis · corre en tu navegador

AED Clues

Sube el histórico del activo que quieras y replica el mismo proceso con el que encontré el caso BTC de la charla.

Abrir AED Clues ↗

tandyclues.tradeitsimplesolutions.com

TIS-RSI2-Research — terminal

$ git clone https://github.com/tradeitsimplesolutions/TIS-RSI2-Research

Cloning into 'TIS-RSI2-Research'...

$ cd TIS-RSI2-Research

# motor de backtest reproducible

# datos que cualquiera puede descargar

# y verificar línea a línea

$

TIS · RSI2Research

Repo público · GitHub

La investigación pública del sistema RSI(2): motor de backtest reproducible, con datos que cualquiera puede verificar.

Ver en GitHub ↗

github.com/tradeitsimplesolutions/TIS-RSI2-Research

RSI2 TIS · script publicado

RSI2 TISen TradingView

Indicador · TradingView

El RSI2 TIS publicado como script, listo para cargar en tu gráfico.

Abrir el script ↗

es.tradingview.com/script/u8LQInYf

TANDY 1000: análisis exploratorio de datos para encontrar el edge

Trade It
Simple

Escuela online · formación

El método completo, sin señales y sin humo: aprender a medir.

  • Hipótesis
  • AED
  • Backtest
  • Robustez
  • Sizing
  • Cuenta real

Ir a la escuela ↗

www.tradeitsimplesolutions.com

Cueva Alpha · monitor de estrategias
PlanSistemaForwardCapitalCobro

Cueva
Alpha

Comunidad privada

Investigación de edges en vivo, monitor de estrategias y una ruta de capital por hitos. Para quien ya se cansó de pagar evaluaciones a ciegas.

Acceso desde la web ↗

www.tradeitsimplesolutions.com

03 · Recursos · TradingView

Mis estrategias en TradingView.

Publicadas con mi nombre. Tres son open-source: aquí tienes su código Pine, tal cual lo publiqué. El RSI2 es de código protegido. Cómo las mido, en el método.

  1. 01TIS - BTC ESTRATEGIA Momentum + ConfluenciaOpen-source · Pine v6
  2. 02ELON - long/short para SpaceXOpen-source · Pine v6
  3. 03ITF26 BB Fade SOL 1mOpen-source · Pine v6
  4. 04TIS · RSI2 · ConnorsCódigo protegido

Open-source script

01TIS - BTC ESTRATEGIA Momentum + Confluencia

Compra la fuerza a favor de la tendencia, pero solo cuando el diario confirma. Opera en 4 horas; si las dos escalas no coinciden, no hay trade.

Es la regla de BTC Confluencia, el caso del Sersan Trading Summit.

Abrir en TradingView ↗

es.tradingview.com/script/k9nauxnv-TIS-BTC-ESTRATEGIA-Momentum-Confluencia

01 / 04

pine script · fuente publicado en TradingView65 líneas
//@version=6strategy("TIS - BTC Momentum + Confluencia",     overlay                 = true,     initial_capital         = 100000,     default_qty_type        = strategy.fixed,     commission_type         = strategy.commission.percent,     commission_value        = 0.0,     slippage                = 5,     process_orders_on_close = true,     calc_on_every_tick      = false)// ---- Inputs ----maLen     = input.int(50,    "Media de tendencia (SMA)", minval = 2)streakLen = input.int(3,     "Velas verdes para momentum", minval = 2)atrLen    = input.int(14,    "ATR (largo)", minval = 1)atrMult   = input.float(3.0, "ATR - distancia de riesgo", step = 0.5)riskPct   = input.float(1.0, "Riesgo por trade (% equity)", step = 0.1)tailMult  = input.float(2.0, "Corte de cola (x ATR adverso)", step = 0.5)confMult  = input.float(1.5, "Multiplicador por confluencia", step = 0.1)htf       = input.timeframe("1D", "Timeframe mayor (confluencia)")capPct    = input.float(40,  "Tope de exposicion (% equity)", step = 5)// ---- Indicadores ----ma      = ta.sma(close, maLen)atr     = ta.atr(atrLen)trendUp = close > ma// Momentum = racha de N velas verdesvar int green = 0green := close > open ? green + 1 : 0mom = green >= streakLen// Momentum en el timeframe mayor (diario), sin mirar el futurof_htfMom() =>    var int g = 0    g := close > open ? g + 1 : 0    g >= streakLenhtfMom = request.security(syminfo.tickerid, htf, f_htfMom(), lookahead = barmerge.lookahead_off)// ---- CONFLUENCIA: entra solo si 4h Y diario tienen momentum ----longSignal = trendUp and mom and htfMom// ---- Sizing por riesgo (ATR) + confluencia, con tope ----riskDollars = strategy.equity * riskPct / 100.0stopDist    = atr * atrMultqtyRaw      = stopDist > 0 ? (riskDollars / stopDist) * confMult : 0.0qtyCap      = close > 0 ? (strategy.equity * capPct / 100.0) / close : 0.0qty         = math.min(qtyRaw, qtyCap)// ---- Entradas / Salidas ----if longSignal and strategy.position_size == 0 and qty > 0    strategy.entry("LONG", strategy.long, qty = qty)if strategy.position_size > 0 and close < ma    strategy.close("LONG", comment = "Giro de media")if strategy.position_size > 0 and (open - close) > tailMult * atr    strategy.close("LONG", comment = "Corte de cola")// ---- Visual ----plot(ma, "SMA tendencia", color = color.new(color.orange, 0), linewidth = 2)plotshape(longSignal and strategy.position_size == 0, "Compra",     style = shape.triangleup, location = location.belowbar,     color = color.new(#26d97e, 0), size = size.small)bgcolor(htfMom ? color.new(#26d97e, 92) : na, title = "Momentum diario")

Open-source script

02ELON - long/short para SpaceX

Opera la ruptura del rango de los primeros 10 minutos de SpaceX, en los dos sentidos. Sin indicadores. Una operación al día.

Abrir en TradingView ↗

es.tradingview.com/script/8DFw4ClI-ELON-long-short-para-SpaceX

02 / 04

pine script · fuente publicado en TradingView546 líneas
//@version=6// =============================================================================////   ESTRATEGIA ELON//   long/short para SpaceX////   Trade It Simple//// =============================================================================////// LA REGLA. Son cuatro líneas.////   1. Mides el rango de los primeros 10 minutos de Nueva York.//   2. Sale por arriba, compras. Sale por abajo, vendes.//   3. Objetivo: 0.60 de ese rango. Stop: 0.40 de ese rango.//   4. Una operación al día. Nunca duermes con la posición abierta.//// Eso es TODO.//// Sin indicadores. Sin medias móviles. Sin filtros de tendencia.// Sin confluencias. Sin "esperar confirmación".////// ¿Y POR QUÉ FUNCIONA?//// Los primeros minutos ordenan el día.//// Ahí se cruzan todas las órdenes que se acumularon con el mercado cerrado.// Noticias de la noche, resultados, gente que decidió a las 3am.//// Ese primer rango es el acuerdo temporal entre compradores y vendedores.//// Cuando el precio lo rompe, los que apostaron al otro lado tienen que cerrar.// Y cerrar empuja el precio en la misma dirección.//// Esa prisa es el movimiento. No hay más magia.////// AHORA LO QUE CASI NADIE TE DICE//// Estos números no salieron del estudio.//// El 10 minutos, el 0.60 y el 0.40 llevan AÑOS en mi portafolio.// Son la combinación original con la que trabajo.//// Lo que hice fue lo contrario de lo que hace todo el mundo.//// No me puse a probar mil cosas para ver cuál salía bonita y publicar esa.// Me puse a probar mil cosas sobre la que YA uso, a ver si en todos estos// años se me había escapado algo mejor.//// Ese es el estudio que tienes debajo. No es una búsqueda. Es un examen.//// Y el examen lo hice para mí, no para venderte nada.////// EL EXAMEN//// 769 configuraciones distintas sobre el mismo histórico.////   - 169 combinaciones de objetivo y stop. Las 169 ganan dinero.//   - Esa misma tabla completa otras tres veces: con el rango de 20 minutos,//     solo comprando y solo vendiendo.//   - 66 formas distintas de salir. Ninguna mejora esta.//   - 11 duraciones de rango, 9 ventanas de entrada, 7 niveles de buffer.//// ¿Y dónde queda la mía en esa tabla de 169?//// En el medio. 62 rinden más que ella. 106 rinden menos.//// Que quede en el medio es la mejor noticia posible. Si estuviera arriba del// todo habría que sospechar que alguien la movió hasta que salió bonita.//// No se podía. Ya estaba escrita desde hace años.////// EL RESULTADO EN UNA CUENTA DE VERDAD//// 100.000 dólares. Sin apalancar NUNCA.// 39 operaciones entre el 17 de junio y el 14 de agosto de 2026.////                        sin costes    2 pb     5 pb    10 pb   peor caída//     con el 95% ......    +22.5%    +20.7%   +18.1%   +13.8%     3.2%//     con el 100% .....    +23.8%    +21.9%   +19.1%   +14.6%     3.3%//// Te doy los cuatro escenarios de coste, no solo el bonito.//// Por defecto va al 95% y no al 100%. La razón es puramente práctica: si metes// el 100% clavado no queda nada para la comisión ni para que el precio de// llenado se separe un céntimo del nivel calculado, y TradingView te canta// MARGIN CALL algunos días. Con 95 sobra sitio. Cuesta 1.2 puntos.//// Meter casi toda la cuenta suena a locura. No lo es.// El stop está a un 1.09% del precio de media, así que eso es lo que arriesgas// en cada operación. La peor de las 39 costó 2.380 dólares. Un 2.4%.////// TRES COSAS ANTES DE QUE LO USES////   - Los 10 minutos son lo único que NO viaja entre activos. Aquí funciona.//     A 45 y 60 minutos, en este mismo activo, PIERDE. Mídelo en el tuyo.////   - Las entradas se llenan justo en el borde. Con datos de otro proveedor//     algunas operaciones cambian. Lo que aguanta es el conjunto, no cada día.////   - Viene con comisiones y deslizamiento puestos. Si los quitas, el número//     sube y deja de parecerse a lo que te va a pasar de verdad.//// Es un solo activo y son 39 operaciones. Es poco. Lo sé y lo digo yo primero.////// -----------------------------------------------------------------------------//  De aquí para abajo, el pelo del chivito. Para quien quiera el detalle.// -----------------------------------------------------------------------------////// PRIMERO, QUÉ ES UNA "R"//// R es lo que arriesgas en cada operación. La distancia hasta el stop.// Si ganas 1.5R, ganaste una vez y media lo que estabas arriesgando.//// Se usa porque no depende de cuánto dinero metas. Sirve para comparar.//// Esta estrategia deja +0.47R de media por operación.////// 1. CASI CAMBIO LA ESTRATEGIA POR UN ESPEJISMO//// Objetivo 0.7 con stop 0.30 parecía el DOBLE de buena. +0.97R contra +0.47R.//// Casi la cambio.//// Fui a ver por qué era mejor. Y no lo era.//// Entre stop 0.30 y stop 0.40 no cambia ni una sola operación de resultado.// Ganan las mismas. Pierden las mismas.//// Lo único que cambia es que arriesgas menos, así que en proporción cada// ganancia parece más grande.//// Eso no es más acierto. Es más apalancamiento disfrazado de hallazgo.//// Es la trampa en la que cae el 99% de los backtests que ves por ahí.//// Y por si quedaba duda: las combinaciones de al lado de esa se hunden un 50%.// Cuando una casilla es buena pero sus vecinas son malas, no es una zona// buena. Es un pico. Y de los picos te caes.////// 2. LA DURACIÓN DEL RANGO//// Con 15, 20 o 25 minutos rinde más que con 10. Con 20 llega a +0.75R.//// Tampoco la cambié.//// Con 20 minutos mis valores se van a la parte alta de su propia tabla, y las// combinaciones de al lado caen un 40%. Con 10 quedan en el medio y las de al// lado solo caen un 25%.//// Prefiero terreno llano a estar encaramada en una cresta.//// Y hay más: al comparar las dos duraciones barajando las operaciones 5.000// veces, la diferencia se movía entre perder algo y ganar algo.//// Con 39 operaciones no se puede afirmar que 20 sea mejor que 10. Punto.////// 3. PROBÉ 66 FORMAS DE SALIR. NINGUNA MEJORA//// Mover el stop a la entrada cuando vas ganando: HACE DAÑO.// Moviéndolo pronto, el acierto cae del 59% al 31%. No te salva de perder.// Te mata las ganadoras.//// Trailing, 21 combinaciones: la mejor entra dentro del margen de error.//// Cerrar media posición y dejar correr la otra media: lo mismo.//// Cerrar por tiempo: no aporta nada. Las operaciones duran 22 minutos de media// y 85 la más larga. Todas salen por objetivo o por stop, ninguna llega viva// al cierre. Un corte a los 90 minutos no toca nada, y cortar antes solo resta.//// Medir objetivo y stop con ATR en vez de con el rango: arriesgando lo mismo// da lo mismo. El rango de apertura YA es una medida de volatilidad. El ATR// mide lo mismo dando un rodeo.////// 4. Y AHORA EL DATO QUE NO VAS A ENCONTRAR PUBLICADO EN NINGÚN LADO//// Cualquiera te diría que el stop lógico va al otro lado del rango.// Tiene sentido estructural, ¿no?//// Lo probé.////     Con el stop "lógico" ......... +0.06R por operación//     Con el stop recortado a 0.40 . +0.47R por operación//// Es la ÚNICA de las 66 formas de salir que salió concluyente. Y en contra.//// Ese recorte no es un atajo cómodo. Es lo que hace que la estrategia funcione.////// 5. EL BUFFER Y LA VENTANA DE ENTRADA NO HACEN NADA//// Exigir que la ruptura sea más clara: hasta un 5% del rango de margen extra// no cambia ni una operación. El precio rebasa el nivel igual dentro de la// misma vela. Se queda en cero.//// La ventana para entrar estaba en 120 minutos y era decorativa. Las entradas// ocurren a los 7 minutos de media desde que cierra el rango, y la más tardía// llegó a los 35. De 45 en adelante el resultado es idéntico.//// La bajé a 45. Un parámetro menos que defender.////// 6. LOS DÍAS QUE NO ENTRA (Y POR QUÉ ESTÁ BIEN QUE NO ENTRE)//// De 41 sesiones, en 2 no hubo operación.//// El caso claro es el 11 de agosto. El rango de apertura midió un 5.02% del// precio, cuando la media de las demás es 2.84%.//// Un rango enorme significa una cosa: el mercado NO se puso de acuerdo en los// primeros diez minutos.//// El precio se quedó dentro toda la mañana y solo rompió por abajo a las 12:00.// 140 minutos después. La ventana son 45.//// ¿Habría sido ganadora? Sí. El precio siguió cayendo hasta 130.50.//// Pero esperar dos horas y media a que el mercado se decida ya no es esta// estrategia. Es otra. Y esa no la he probado.////// 7. POR QUÉ NO VAS A CLAVAR OPERACIÓN POR OPERACIÓN//// Las entradas se llenan justo en el borde del rango. En 33 de las 39, a menos// de un 5% de distancia.//// Tan justo, que al rehacer el estudio con datos de otro proveedor dos// sesiones cambiaron de signo por UN CÉNTIMO.//// El 23 de junio el máximo del rango era 154.14 en unos datos y 154.12 en// otros. Ese día pasó de compra ganadora a venta perdedora.//// Con tu broker te va a pasar lo mismo. No significa que esté rota.// Lo que aguanta es el conjunto, no cada día suelto.//// Prefiero decírtelo yo a que lo descubras tú operando.////// 8. LAS DOS CIFRAS, Y LAS DOS SON CIERTAS//// +0.47R por operación es lo que produce el sistema. No depende de cuánto// dinero metas, y es la que sirve para comparar una versión con otra.//// +22.5% es lo que dio la cuenta de 100.000 desplegando el 95% sin apalancar.// Esa sí depende del tamaño que elijas: con otro tamaño te sale otro número.//// El CAGR que calcula TradingView no lo uso y tú tampoco deberías.// Anualiza dos meses de operativa. No significa nada.////// LO QUE ESTO NO DEMUESTRA, DICHO POR MÍ////   - Un solo activo. 39 operaciones. Dos meses. Es poco.//   - Faltan walk-forward y Monte Carlo. Con 39 operaciones no tocan todavía.//   - De esas 39, solo 12 fueron compras. 27 fueron ventas, en dos meses en//     que el activo cayó un 20%. La mitad compradora aguanta (probándola//     sola, 166 de 169 combinaciones siguen ganando) pero está mucho menos//     probada que la vendedora. En un mercado alcista sostenido esperaría//     menos de lo que ves aquí.//// Que cada quien decida qué hacer con eso.//// =============================================================================strategy("ELON · long/short para SpaceX [TIS v1]",     overlay                 = true,     initial_capital         = 100000,     currency                = currency.USD,     commission_type         = strategy.commission.percent,     commission_value        = 0.02,     slippage                = 2,     default_qty_type        = strategy.fixed,     default_qty_value       = 1,     pyramiding              = 0,     calc_on_every_tick      = true,     process_orders_on_close = true)string TZ = "America/New_York"// ============================ Initial Balance ================================groupIB = "1 · Initial Balance (hora de Nueva York)"ib_minutes = input.int(10, "Duración del IB (min)", minval=5, maxval=120, step=5,     group=groupIB, tooltip="Es el parámetro que más cambia entre activos. " +     "En SPCX: 10 min funciona, 45-60 min pierde dinero. Mídelo en el tuyo.")ib_start_h = input.int(9,  "Hora de inicio", minval=0, maxval=23, group=groupIB)ib_start_m = input.int(30, "Minuto de inicio", minval=0, maxval=59, group=groupIB)show_labels = input.bool(true, "Mostrar etiquetas del IB", group=groupIB)// ============================== Entrada ======================================groupSig = "2 · Entrada"entry_mode = input.string("Wick (stops)", "Modo", options=["Wick (stops)", "Close (confirmado)"],     group=groupSig, tooltip="Wick: orden stop en el borde del rango. " +     "Close: espera al cierre de la vela más allá del borde.")buffer_k = input.float(0.00, "Buffer de ruptura = k × IB", minval=0.0, step=0.01,     group=groupSig, tooltip="Exigir que la ruptura supere el borde por un " +     "margen extra. Probado de 0 a 0.30: hasta 0.05 no cambia ni una operación " +     "y por encima la mejora no se distingue del ruido. Se deja en 0.")min_delay_min = input.int(0, "Espera mínima tras el IB (min)", minval=0, maxval=120, group=groupSig)max_wait_min  = input.int(45, "Tiempo máximo para entrar (min desde el fin del IB)",     minval=5, maxval=600, group=groupSig, tooltip="Estaba en 120 y era un " +     "parámetro muerto: las entradas ocurren a los 7 minutos de media, 5 la " +     "mediana y 35 la más tardía. De 45 en adelante el resultado es idéntico.")enable_long  = input.bool(true, "Permitir largos",  group=groupSig)enable_short = input.bool(true, "Permitir cortos",  group=groupSig)// ============================== Filtro =======================================groupFilt = "3 · Filtro de tamaño del IB"use_min_ib = input.bool(false, "Exigir un IB mínimo", group=groupFilt,     tooltip="APAGADO por defecto y a propósito. En las 41 sesiones de SPCX el " +     "IB más estrecho midió 1.29%, así que un umbral de 0.55% no se activó " +     "NUNCA. Un filtro que no filtra es un adorno.")min_ib_pct_input = input.float(0.55, "IB mínimo (% del precio)", minval=0.0, step=0.01, group=groupFilt)// ========================= Objetivo y stop ===================================groupRR = "4 · Objetivo y stop (en múltiplos del IB)"tp_k     = input.float(0.60, "Objetivo = k × IB (desde la entrada)", minval=0.1, step=0.05, group=groupRR)sl_cap_k = input.float(0.40, "Stop = k × IB (desde la entrada, máximo)", minval=0.1, step=0.05,     group=groupRR, tooltip="No lo bajes a 0.30 pensando que mejora. Entre 0.30 " +     "y 0.40 no cambia ni una operación de desenlace: solo cambia cuánto " +     "arriesgas. Eso se decide abajo, en sizing.")// ============================== Sizing =======================================groupSize = "5 · Tamaño de posición"size_mode = input.string("Todo el capital (sin apalancar)", "Modo",     options=["Todo el capital (sin apalancar)", "Riesgo fijo %", "Cantidad fija"],     group=groupSize, tooltip="Todo el capital: metes la cuenta entera en la " +     "posición, sin margen. Suena agresivo y NO lo es: como el stop está a un " +     "1.09% del precio de media, lo que arriesgas por operación es ese 1.09% " +     "de la cuenta. Es el modo con el que está medida la estrategia.")capital_pct = input.float(95.0, "Capital a desplegar (%)", minval=1, maxval=100, step=1,     group=groupSize, tooltip="NO es apalancamiento: es qué parte de tu propio " +     "dinero entra en la posición. Va en 95 y no en 100 a propósito. Si metes " +     "el 100% clavado no queda ni un euro para la comisión ni para que el " +     "precio de llenado se separe un céntimo del nivel, y TradingView te canta " +     "MARGIN CALL. Con 95 sobra sitio. Cuesta 1.2 puntos de rentabilidad.")risk_pct  = input.float(1.0, "Riesgo por operación (% de la cuenta)", minval=0.01, maxval=10, step=0.1, group=groupSize)fixed_qty = input.float(100, "Cantidad fija", minval=0.000001, group=groupSize)whole_units = input.bool(true, "Redondear a unidades enteras", group=groupSize)// =========================== Cierre forzoso ==================================groupClose = "6 · Cierre forzoso"flat_h = input.int(15, "Hora (NY)", minval=0, maxval=23, group=groupClose)flat_m = input.int(30, "Minuto (NY)", minval=0, maxval=59, group=groupClose)// =============================================================================// Tiempo// =============================================================================int y  = year(time, TZ)int mo = month(time, TZ)int d  = dayofmonth(time, TZ)int tIBStart = timestamp(TZ, y, mo, d, ib_start_h, ib_start_m)int tIBEnd   = tIBStart + ib_minutes * 60000int tFlat    = timestamp(TZ, y, mo, d, flat_h, flat_m)int tNow     = timebool inIB       = tNow >= tIBStart and tNow < tIBEndbool afterIB    = tNow >= tIBEndbool timeToFlat = tNow >= tFlatbool ibEndBar   = tNow >= tIBEnd and time[1] < tIBEnd// =============================================================================// Estado del IB · una operación por sesión// =============================================================================var float ibHigh = navar float ibLow  = navar bool  ibReady = falsevar int   tradesAlAbrirElDia = 0bool newDay = ta.change(dayofmonth(time, TZ)) != 0if newDay    ibHigh  := na    ibLow   := na    ibReady := false    tradesAlAbrirElDia := strategy.closedtrades    strategy.cancel("ELON-L")    strategy.cancel("ELON-S")if inIB    ibHigh := na(ibHigh) ? high : math.max(ibHigh, high)    ibLow  := na(ibLow)  ? low  : math.min(ibLow,  low)if not inIB and not ibReady and not na(ibHigh) and not na(ibLow)    ibReady := truefloat ibRange = ibReady ? ibHigh - ibLow : nafloat ibMid   = ibReady ? (ibHigh + ibLow) * 0.5 : nafloat ibPct   = ibReady and ibMid > 0 ? 100.0 * ibRange / ibMid : nabool ibBigEnough = not use_min_ib or (not na(ibPct) and ibPct >= min_ib_pct_input)// Cuenta las operaciones cerradas HOY, no solo si hay posición abierta. Si una// operación entra y sale dentro de la misma vela, position_size vale 0 al cierre// y el contador de "ya operé hoy" se lo perdería: volvería a entrar el mismo día.bool yaOperoHoy = (strategy.closedtrades - tradesAlAbrirElDia) > 0 or strategy.position_size != 0// =============================================================================// Tamaño de la posición// =============================================================================// El tamaño se calcula con el precio PREVISTO de entrada (el nivel del rango),// pero la orden se llena al precio real, que puede quedar un poco más allá.// Si desplegaras el 100% clavado, esa diferencia más la comisión ya te dejan la// posición por encima del capital disponible. De ahí los margin call.// Por eso capital_pct va en 95: es el colchón.f_qty(float stopDist, float precioEnt) =>    float q = fixed_qty    if size_mode == "Todo el capital (sin apalancar)" and precioEnt > 0        q := strategy.equity * capital_pct / 100.0 / precioEnt    else if size_mode == "Riesgo fijo %" and stopDist > 0        q := strategy.equity * risk_pct / 100.0 / stopDist    if whole_units        q := math.floor(q)    math.max(q, 0)float qtyPrevista = ibReady ? f_qty(math.min(sl_cap_k, 1.0) * (ibHigh - ibLow), close) : nabool  sinTamano   = ibReady and qtyPrevista <= 0// =============================================================================// Entradas// =============================================================================float buf     = na(ibRange) ? 0.0 : buffer_k * ibRangefloat upLevel = ibReady ? ibHigh + buf : nafloat dnLevel = ibReady ? ibLow  - buf : nafloat stopDist = ibReady ? math.min(sl_cap_k, 1.0) * ibRange : nabool windowDelayOk = tNow >= tIBStart + (ib_minutes + min_delay_min) * 60000bool windowStillOk = tNow <= tIBEnd + max_wait_min * 60000bool canEnter = ibReady and afterIB and windowDelayOk and windowStillOk and ibBigEnough and not yaOperoHoy and not sinTamano// En la primera vela tras el IB el nivel se conoce recién en su cierre. Si el// precio ya lo ha rebasado, se entra a mercado en ese cierre.bool patchLong  = ibEndBar and canEnter and enable_long  and close > upLevelbool patchShort = ibEndBar and canEnter and enable_short and close < dnLevelif patchLong    strategy.entry("ELON-L", strategy.long, qty=f_qty(stopDist, close))else if patchShort    strategy.entry("ELON-S", strategy.short, qty=f_qty(stopDist, close))else if canEnter    if entry_mode == "Wick (stops)"        // oca.cancel: si salta un lado, el otro se anula en el acto. Sin esto,        // una vela que toque los dos extremos puede darte la vuelta la posición.        if enable_long            strategy.entry("ELON-L", strategy.long, qty=f_qty(stopDist, upLevel), stop=upLevel,                 oca_name="ELON-ENTRADA", oca_type=strategy.oca.cancel)        if enable_short            strategy.entry("ELON-S", strategy.short, qty=f_qty(stopDist, dnLevel), stop=dnLevel,                 oca_name="ELON-ENTRADA", oca_type=strategy.oca.cancel)    else        if enable_long and close > upLevel            strategy.entry("ELON-L", strategy.long, qty=f_qty(stopDist, close))        else if enable_short and close < dnLevel            strategy.entry("ELON-S", strategy.short, qty=f_qty(stopDist, close))if yaOperoHoy or not windowStillOk or timeToFlat    strategy.cancel("ELON-L")    strategy.cancel("ELON-S")// =============================================================================// Salidas// =============================================================================// Se colocan también con la orden de entrada pendiente, calculadas con el precio// previsto de llenado, para que el stop exista ya en la vela en la que entra.bool hayEntradaPendiente = canEnter and entry_mode == "Wick (stops)"bool hayQueArmarSalidas  = ibReady and ibRange > 0 and (strategy.position_size != 0 or hayEntradaPendiente)if hayQueArmarSalidas    if strategy.position_size >= 0 and enable_long        float epL = strategy.position_size > 0 ? strategy.position_avg_price : upLevel        strategy.exit("L-Exit", from_entry="ELON-L",             stop  = math.max(epL - sl_cap_k * ibRange, ibLow),             limit = epL + tp_k * ibRange,             comment_loss="SL", comment_profit="TP")    if strategy.position_size <= 0 and enable_short        float epS = strategy.position_size < 0 ? strategy.position_avg_price : dnLevel        strategy.exit("S-Exit", from_entry="ELON-S",             stop  = math.min(epS + sl_cap_k * ibRange, ibHigh),             limit = epS - tp_k * ibRange,             comment_loss="SL", comment_profit="TP")if timeToFlat and strategy.position_size != 0    strategy.close_all(comment="EOD")// =============================================================================// Dibujo// =============================================================================plot(ibReady ? ibHigh : na, "IB High", color.new(color.green, 0), 2, plot.style_linebr)plot(ibReady ? ibLow  : na, "IB Low",  color.new(color.red,   0), 2, plot.style_linebr)if show_labels and ibEndBar and ibReady    label.new(bar_index, ibMid,         "IB " + str.tostring(ib_minutes) + " min\n" + str.tostring(ibPct, "#.##") + "%",         style=label.style_label_up, color=color.new(color.blue, 20), textcolor=color.white,         size=size.small)var line  lnTP = navar line  lnSL = navar label lbTP = navar label lbSL = naif strategy.position_size != 0 and strategy.position_size[1] == 0    float ep = strategy.position_avg_price    float vTP = strategy.position_size > 0 ? ep + tp_k * ibRange : ep - tp_k * ibRange    float vSL = strategy.position_size > 0 ? math.max(ep - sl_cap_k * ibRange, ibLow)             : math.min(ep + sl_cap_k * ibRange, ibHigh)    line.delete(lnTP)    line.delete(lnSL)    label.delete(lbTP)    label.delete(lbSL)    lnTP := line.new(bar_index, vTP, bar_index + 1, vTP, extend=extend.right,         color=color.green, style=line.style_dashed)    lnSL := line.new(bar_index, vSL, bar_index + 1, vSL, extend=extend.right,         color=color.red, style=line.style_dashed)    lbTP := label.new(bar_index + 1, vTP, "TP " + str.tostring(vTP, format.mintick),         style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)    lbSL := label.new(bar_index + 1, vSL, "SL " + str.tostring(vSL, format.mintick),         style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)if strategy.position_size == 0 and strategy.position_size[1] != 0    line.delete(lnTP)    line.delete(lnSL)    label.delete(lbTP)    label.delete(lbSL)// =============================================================================// Alertas// =============================================================================alertcondition(strategy.position_size != 0 and strategy.position_size[1] == 0,     "ELON · entrada", "ELON: entrada en {{ticker}} a {{close}}")alertcondition(strategy.position_size == 0 and strategy.position_size[1] != 0,     "ELON · salida", "ELON: salida en {{ticker}} a {{close}}")

Open-source script

03ITF26 BB Fade SOL 1m

Mean reversion intradía sobre SOLUSDT.P: el sistema que llevé al ITF26 Ibiza (21 mayo 2026), publicado tal cual lo opero.

Abrir en TradingView ↗

es.tradingview.com/script/pMOjQJwT

03 / 04

pine script · fuente publicado en TradingView148 líneas
//@version=6// ITF26 B1 — BB Fade SOL 5m.// Bloque: 14:00-14:40 UTC (16:00-16:40 CEST)//// Lógica: cuando el precio toca la Banda de Bollinger lagged (shift 1 bar),// entramos en la dirección contraria (fade) con límite en la banda,// TP en la media móvil. TimeOnly exit al final del bloque.//// BB(20,2) — parámetros de literatura, sin optimizar// Entry: LIMIT al nivel de la banda (Mode C — no market, no bar close)// TP: midband. Sin stop fijo — TimeOnly es el stop implícito.//// OOS Dec-Feb: n=62 p=75.8% PF=3.056 WF=78/71/78%// Reciente (Apr-May): n=21 p=66.7%//// VALIDACIÓN STRATEGY TESTER://   Período: Mar 19 – May 18 2026//   Esperado: n≈40 | hit%≈60-70% | PF≈1.8-2.5//   Tolerancia ±10pp en hit%, ±0.5 en PF//   Si hit%<50% o PF<1.0 → estrategia en régimen adversostrategy(    title                  = "ITF26 B1 — BB Fade SOL 5m",    shorttitle             = "ITF26-B1",    overlay                = true,    default_qty_type       = strategy.percent_of_equity,    default_qty_value      = 125,    initial_capital        = 100000,    commission_type        = strategy.commission.percent,    commission_value       = 0.02,    slippage               = 1,    calc_on_every_tick     = false,    process_orders_on_close = false)// ── Inputs ───────────────────────────────────────────────────────────────────float sz = input.float(125.0, "Sizing (% equity)", minval = 10.0, maxval = 300.0, step = 25.0,     tooltip = "OOS optimal: 175%. Reciente conservador: 125%.")// ── BB — entry logic usa versión lagged (sin look-ahead) ─────────────────────float bb_basis_raw = ta.sma(close, 20)float bb_dev_raw   = ta.stdev(close, 20)float bb_mid       = bb_basis_raw[1]float bb_upper     = bb_mid + 2.0 * bb_dev_raw[1]float bb_lower     = bb_mid - 2.0 * bb_dev_raw[1]// ── Filtro horario — solo B1, solo días de semana ────────────────────────────int   h_utc      = hour(time, "UTC")int   m_utc      = minute(time, "UTC")bool  is_weekday = dayofweek(time, "UTC") != dayofweek.saturday and dayofweek(time, "UTC") != dayofweek.sundaybool  in_b1    = h_utc == 14 and m_utc <= 40 and is_weekdaybool  b1_start = h_utc == 14 and m_utc == 0  and is_weekdaybool  b1_end   = h_utc == 14 and m_utc == 40 and is_weekday// ── Estado ───────────────────────────────────────────────────────────────────var bool  placed = falsevar int   signal = 0var float ep     = navar float tp     = naif b1_start    placed := false    signal := 0    ep     := na    tp     := na// ── Entry: primer bar del bloque que toca la banda ───────────────────────────if in_b1 and not placed and strategy.position_size == 0    if not na(bb_upper) and not na(bb_lower) and not na(bb_mid)        if high > bb_upper            strategy.entry("B1S", strategy.short, qty = sz, limit = bb_upper, comment = "BB_Fade↓")            signal := -1            ep     := bb_upper            tp     := bb_mid            placed := true        else if low < bb_lower            strategy.entry("B1L", strategy.long, qty = sz, limit = bb_lower, comment = "BB_Fade↑")            signal := 1            ep     := bb_lower            tp     := bb_mid            placed := true// ── TP exit intrabar ─────────────────────────────────────────────────────────if strategy.position_size > 0 and not na(tp)    strategy.exit("B1L_TP", from_entry = "B1L", limit = tp, comment = "TP→mid")if strategy.position_size < 0 and not na(tp)    strategy.exit("B1S_TP", from_entry = "B1S", limit = tp, comment = "TP→mid")// ── TimeOnly exit al final del bloque ────────────────────────────────────────if b1_end    strategy.close("B1L", comment = "TimeOnly")    strategy.close("B1S", comment = "TimeOnly")    strategy.cancel("B1L")    strategy.cancel("B1S")// ── Plots: BB siempre visible, rodeando el precio ────────────────────────────plot(bb_basis_raw + 2.0 * bb_dev_raw, "BB Upper", color.new(color.red,   30), 1)plot(bb_basis_raw,                     "BB Mid",   color.new(color.gray,  40), 1)plot(bb_basis_raw - 2.0 * bb_dev_raw, "BB Lower", color.new(color.green, 30), 1)bgcolor(in_b1 ? color.new(color.purple, 93) : na, title = "B1 Zone")// ── Tabla on-chart ───────────────────────────────────────────────────────────var table tbl = table.new(position.bottom_right, 2, 5,    bgcolor       = color.new(color.black, 75),    border_width  = 1,    border_color  = color.new(color.gray, 60),    frame_width   = 1,    frame_color   = color.new(color.gray, 50))if barstate.islast    table.cell(tbl, 0, 0, "ITF26 B1 — BB Fade",        text_color = color.white, text_size = size.small,        bgcolor = color.new(color.purple, 30))    table.cell(tbl, 1, 0, "",        text_color = color.white, text_size = size.small,        bgcolor = color.new(color.purple, 30))    table.cell(tbl, 0, 1, "Bloque",        text_color = color.gray, text_size = size.small)    table.cell(tbl, 1, 1, "16:00-16:40 CEST",        text_color = color.white, text_size = size.small)    string sig_str = signal ==  1 ? "LONG  (fade↑)" :                     signal == -1 ? "SHORT (fade↓)" :                     placed       ? "Sin señal hoy"  : "Esperando…"    color  sig_col = signal == 1  ? color.lime :                     signal == -1 ? color.red  : color.gray    table.cell(tbl, 0, 2, "Señal",        text_color = color.gray, text_size = size.small)    table.cell(tbl, 1, 2, sig_str,        text_color = sig_col, text_size = size.small)    float pnl = strategy.openprofit    string pnl_str = pnl == 0.0 ? "—" : str.tostring(math.round(pnl, 0)) + " USD"    color  pnl_col = pnl > 0 ? color.lime : pnl < 0 ? color.red : color.gray    table.cell(tbl, 0, 3, "PnL abierto",        text_color = color.gray, text_size = size.small)    table.cell(tbl, 1, 3, pnl_str,        text_color = pnl_col, text_size = size.small)    int end_min_utc = 14 * 60 + 40    int cur_min_utc = h_utc * 60 + m_utc    int mins_left   = in_b1 ? math.max(0, end_min_utc - cur_min_utc) : 0    string time_str = in_b1 ? str.tostring(mins_left) + " min" : "Fuera de bloque"    table.cell(tbl, 0, 4, "Tiempo",        text_color = color.gray, text_size = size.small)    table.cell(tbl, 1, 4, time_str,        text_color = color.yellow, text_size = size.small)

Protected source script

04TIS · RSI2 · Connors

Mean reversion de corto plazo inspirada en la investigación de Larry Connors y Cesar Alvarez: rebotes tras sobreventa extrema dentro de tendencias alcistas.

Abrir en TradingView ↗

es.tradingview.com/script/u8LQInYf

04 / 04

pine script · código protegido—

Publicado como código protegido: se carga en tu gráfico desde TradingView, pero el fuente no es público.

La investigación del RSI(2) sí es pública, en GitHub ↗

04 · El método

El método.

cinco fases · sin excepciones ni atajos

Toda batalla se gana antes de librarse.«Every battle is won before it is ever fought» · Gordon Gekko · Wall Street, 1987 · citando a Sun Tzu

Todo empieza con un análisis exploratorio de datos (AED): dejar que el activo cuente cómo se comporta y que la hipótesis salga de ahí. Después, cinco fases que no se negocian.

  1. Fase 01Backtest dentro y fuera de muestra

    Criterios duros de rentabilidad, operaciones y drawdown, con un tramo final de años sellado que nadie mira hasta el veredicto. Si solo gana en el tramo que eligió, no gana.

  2. Fase 02Estabilidad época a época

    El edge tiene que estar en la mitad buena de su entorno la mayoría de las épocas, no solo en el periodo que le conviene.

  3. Fase 03Robustez en todos los parámetros

    Se mueven todos los parámetros a la vez, no los dos de la foto bonita. Si la estrategia vive en un pico afinado, está muerta.

  4. Fase 04Monte Carlo y bootstrapping

    Miles de simulaciones que barajan operaciones, bloques y regímenes enteros para medir drawdown esperado y riesgo de ruina.

  5. Fase 05Stress

    Costes al doble, sin los mejores años y su conducta en los peores regímenes del activo. Lo que sobrevive a esto, se automatiza y se opera.

Eso también es un resultado

He puesto a prueba miles de reglas publicadas — Connors, Williams, Kaufman, Wilder y muchos más — con costes reales. La inmensa mayoría no pasa. Y es el resultado que casi nadie publica.

He desarrollado mis propias estrategias con este método.

↓ BTC Confluencia

Mi estrategia · el caso del Sersan Trading Summit

BTC Confluencia.

La regla de entradaEntrar solo cuando hay 3 velas verdes en 4 horas y, a la vez, 3 velas verdes en el diario.

Una sola versión de las cifras: con comisión.

+334 %con comisión de 0,05 % por lado
4,33profit factor
9,7 %drawdown máximo
78operaciones en 9 años
+334 %
25 ago 2017op 1 → op 7820 jul 2026

Fuera de muestra+85,4 % · PF 3,40

Doble implementación

Dos implementaciones independientes del mismo enunciado reconcilian operación a operación. El estándar: ±2 % y número de operaciones exacto.

No es all-weather, y no pretende serlo. El caso completo de la charla está abierto en AED CLUES.

Fuente: BTC Confluencia, caso presentado en el Sersan Trading Summit 2026 · velas de 4 h de BINANCE:BTCUSDT · 25 ago 2017 → 20 jul 2026 · comisión 0,05 % por lado · fuera de muestra: 2021 → jul 2026. Rentabilidades pasadas no garantizan resultados futuros.

05 · Contacto

Hablemos.

Cursos, comunidad, charlas o colaboraciones. Escríbeme y te respondo yo, no un embudo.

www.tradeitsimplesolutions.com ↗