Riesgo en estrategias Pine: SL, TP, % equity, tope diario (Basic)

Mapa Step 5 TradingView Basic: stops %/fijo/ATR, trailing, percent_of_equity vs fijo, maxOpenPositions y maxDailyTrades — qué no incluye Basic.

📖 7 min read

📝 1,342 words

🏷️ Pine Script and TradingView

Compartir este artículo:

Qué se toca primero, tu stop o tu objetivo

Stop loss debajo y take profit encima de una entrada, con un trailing stop que sube por detrás.take profitentradastop lossel trailing stop sigue
Dónde se sitúan los niveles de riesgo alrededor de una entrada. Solo posiciones: el dibujo no dice qué ocurre después.

Si el rango de una barra contiene tu stop y tu objetivo, uno se ejecutó y el otro no. El backtest tuvo que elegir. Casi todo lo escrito sobre esto lo adivina; TradingView lo documenta.

La regla

El emulador de bróker deduce el recorrido del precio dentro de la barra según dónde esté la apertura respecto al máximo y al mínimo [1]:

Si el precio de apertura de una barra está más cerca del máximo que del mínimo, el emulador asume que el precio de mercado se movió en este orden: apertura → máximo → mínimo → cierre. Si la apertura está más cerca del mínimo que del máximo, el emulador asume este orden: apertura → mínimo → máximo → cierre. [1]

Así que para una posición larga:

La apertura estáRecorrido asumidoQué nivel se alcanza primero
más cerca del máximoapertura → máximo → mínimo → cierretu objetivo
más cerca del mínimoapertura → mínimo → máximo → cierretu stop

Ese es todo el mecanismo. Es determinista, se puede saber barra por barra, y es una suposición, no una medición.

Por qué importa más de lo que parece

Cualquier estrategia donde un stop y un objetivo puedan caer dentro del rango de una misma barra tiene un backtest decidido en parte por esta heurística. Cuanto más corta sea tu temporalidad respecto a la distancia de tu stop, más a menudo se aplica — una estrategia de scalping con stops ajustados en un instrumento volátil puede tener la mayoría de sus salidas resueltas así.

De ahí se siguen dos cosas, ambas accionables:

Puedes averiguarlo. Abre la List of Trades, toma las salidas y comprueba cuántas están en barras cuyo rango contiene ambos niveles. Si esa fracción es grande, tu curva de capital es en buena medida producto de la regla anterior.

Separar más el stop del objetivo reduce la exposición. No porque los stops amplios sean mejores, sino porque un stop y un objetivo que no pueden caer ambos dentro de una barra no dejan nada que el emulador tenga que adivinar.

Aquí es también exactamente donde difiere MetaTrader 5: su tester puede reproducir ticks reales acumulados por el bróker sin simulación, así que no necesita deducir el recorrido [2]. Ninguno de los dos enfoques está mal, pero no pueden coincidir, y la comparación explica por qué.

Los huecos se tratan como vacíos

Otro comportamiento documentado con consecuencia real: si el precio cruza el nivel de una orden durante el hueco entre el cierre de una barra y la apertura de la siguiente, el emulador asume que dentro del hueco no existen datos intrabarra [1].

Así que un stop dentro de un hueco de fin de semana no se ejecuta a tu precio de stop. Se resuelve cuando el mercado reabre, y la diferencia es el hueco mismo. Cualquier estrategia que mantenga posiciones a través de una pausa de sesión debe esperar que sus pérdidas reales en esas operaciones sean peores que en el backtest.

Solo se ejecuta una orden de salida

Si una sola llamada a strategy.exit() produce más de un tipo de orden de salida para una entrada, la estrategia ejecuta solo la primera que se activa y cancela automáticamente las demás [1].

Ese es el comportamiento que quieres, y conviene saberlo porque significa que un stop y un objetivo sobre la misma entrada son genuinamente exclusivos: no puedes ejecutarte en ambos y acabar con una doble salida.


Salidas: absolutas frente a relativas

strategy.exit() acepta tu stop y tu objetivo en dos monedas distintas, y mezclarlas es como un stop acaba en un sitio que no pretendías.

Parámetro [1]Expresado como
stopun precio absoluto
limitun precio absoluto
lossuna distancia relativa en ticks
profituna distancia relativa en ticks
trail_priceel precio absoluto en que empieza el trailing
trail_pointsel disparador del trailing como distancia relativa
trail_offseta qué distancia del precio va el trailing
qty / qty_percentcuánto de la posición cerrar
from_entrya qué entrada pertenece esta salida

De ahí salen dos reglas, y ambas causan fallos reales.

No fijes a la vez la versión absoluta y la relativa del mismo lado. Si pasas stop y loss juntos, has especificado el stop dos veces, en dos unidades. Elige uno por lado.

El cero es un valor, no «sin definir». profit = 0 no significa «sin objetivo»; significa un objetivo a cero ticks, es decir, el precio de entrada. En v6, cuando una llamada de salida tiene nivel relativo y absoluto, gana el que se active primero, así que esto ahora sale de inmediato en la entrada en lugar de quedar anulado. Está en la lista de cambios de v6 justo por eso — los cambios silenciosos tienen la tabla. Omite un parámetro para decir «no se usa».

Stops en ticks frente a stops en ATR

Un stop fijo en ticks es la misma distancia en cualquier condición de mercado, lo que significa que es demasiado estrecho con volatilidad alta y demasiado amplio con volatilidad baja. Un stop basado en ATR escala con el rango reciente, así que el mismo código se comporta de forma comparable entre regímenes e instrumentos.

La diferencia práctica para una estrategia convertida: un stop en ticks hay que reajustarlo en cada símbolo al que lo apliques, y uno en ATR en general no. Por eso también un stop en ATR hace que probar entre instrumentos tenga sentido — ver los filtros de ATR y sesión.

Ninguno es «más seguro». Un stop en ATR se ensancha precisamente cuando el mercado está violento, que es cuando quizá más quieras estar fuera.

El tamaño de posición es un control de riesgo, no un ajuste cosmético

default_qty_type decide si tu curva de capital compone [1]:

  • strategy.fixed — un número constante de contratos. No compone, y es la prueba más difícil de superar.
  • strategy.percent_of_equity — una parte del capital disponible. Compone, y hará que una ventaja mediocre parezca espectacular en un backtest largo.

Si estás juzgando una estrategia en lugar de proyectar rentabilidades, prueba con tamaño fijo. El porcentaje de capital responde a «en qué se habría convertido esto», que es una pregunta distinta y mucho más halagadora.

Y desde v6, margin_long y margin_short valen 100 por defecto, así que una estrategia que necesita más dinero del disponible no abre la entrada [1]. Una estrategia v5 que estaba sobreapalancada en silencio simplemente tomará menos operaciones: sin error, solo una lista de operaciones distinta.

Los límites de riesgo que actúan como interruptor

Más allá de las salidas por operación hay stops a nivel de cuenta, que se ejecutan en el emulador y no en tu lógica. strategy.risk.allow_entry_in() restringe en qué dirección puede abrir la estrategia [1] — el uso honesto es impedir que una idea solo-largos gane dinero en silencio con cortos que nunca pretendió tomar.

Merece la pena fijarlos a propósito incluso esperando no alcanzarlos nunca, porque la versión de una estrategia que sobrevive a un régimen inesperado suele ser la que tenía un límite que saltó.



Tactix AI — Studio vs Guide

Tactix AI es la marca del asistente de AlfaTactix (abrir Tactix AI).

  • Tactix Studio convierte una descripción de estrategia en una frase en un borrador de Timeframe, Señales, Filtros y Riesgo en el Strategy Builder visual. Revisas y editas cada campo antes de que Code Generator escriba MQL5 o Pine Script.
  • Tactix Guide explica el paso en el que estás — qué rellenar, qué significa un control o cómo formular una regla — sin volcar código sin probar.

Es automatización form-first: el LLM no sustituye a Code Generator, y conservas límites de plan y validación en tiempo real.

Preguntas frecuentes

SL/TP: %, fijo (ticks) o ATR. Trailing: % o fijo. Tamaño: fijo o % equity. Cuenta: solo maxOpenPositions y maxDailyTrades. strategy() [1].

No en Basic. MT5: riesgo EA.

percent_of_equity vs strategy.fixed en la declaración strategy().

Properties / strategy() / Advanced del generador. Tester.

Guía ATR · ta.atr × multiplicador en Basic.