La primera estrategia solo cerraba con el cruce contrario. Ahora añadiremos distancias de pérdida y ganancia respecto a la entrada. El cierre por cruce se mantiene.

Tres motivos de salida

En este ejemplo pueden cerrar la posición larga tres eventos:

  • el precio alcanza el nivel de la orden stop de pérdida;
  • el precio alcanza el nivel de la orden limitada de beneficio;
  • la media rápida cruza por debajo de la lenta y se ejecuta el cierre de mercado.

Stop y límite son órdenes condicionadas al precio. strategy.close envía una orden de cierre de mercado. Sus reglas de ejecución pueden diferir; comprueba tanto el precio como el momento en la tabla.

¿Distancia o precio concreto?

strategy.exit admite dos formas de indicar las salidas:

Argumento¿Qué especificas?
lossDistancia de pérdida en ticks
profitDistancia de beneficio en ticks
stopPrecio concreto del stop
limitPrecio concreto del límite

loss=100 no significa 100 por ciento ni necesariamente 100 unidades monetarias. Pides cien ticks de distancia desde la entrada.

El tick de DEMO es 0,01. Cien ticks son 1 unidad de precio; doscientos, 2. En una entrada larga a 200, serían stop a 199 y objetivo a 202, antes de otros efectos del slippage y de las condiciones de ejecución.

El programa completo

Crea protected_strategy.py:

"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, strategy, ta


@script.strategy(
    "Crossing Strategy with Exits",
    overlay=True,
    initial_capital=10000,
    default_qty_type=strategy.fixed,
    default_qty_value=1,
    pyramiding=1,
    commission_type=strategy.commission.percent,
    commission_value=0.1,
    slippage=2,
)
def main(
    fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
    slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
    stop_ticks: int = input.int(100, title="Stop distance (ticks)", minval=1),
    target_ticks: int = input.int(200, title="Target distance (ticks)", minval=1),
):
    fast_average = ta.sma(close, fast_length)
    slow_average = ta.sma(close, slow_length)
    crosses_up = ta.crossover(fast_average, slow_average)
    crosses_down = ta.crossunder(fast_average, slow_average)
    if crosses_up:
        strategy.entry("Long", strategy.long)
    if crosses_down:
        strategy.close("Long")
    strategy.exit("Bracket", "Long", loss=stop_ticks, profit=target_ticks)
    plot(fast_average, "Fast average", color=color.blue, linewidth=2)
    plot(slow_average, "Slow average", color=color.orange, linewidth=2)

Bracket es el identificador del grupo de órdenes de salida. El segundo argumento, Long, indica la entrada asociada. loss y profit usan los inputs anteriores.

La llamada de salida se ejecuta en cada vela con el mismo identificador. Gestiona la regla definida; no abre una posición nueva independiente en cada llamada.

Ejecuta con los datos de demostración. En Trades pueden aparecer salidas Bracket además de cierres de mercado por cruce.

protected_strategy.py se ejecuta en PyneIDE; las operaciones también pueden terminar por stop u objetivo.
La estrategia combina el cierre por cruce con un stop y un objetivo expresados en ticks.

¿Cuándo aparece la salida protectora?

El programa puede dar una instrucción de entrada y su salida asociada en la misma ejecución. El entorno puede relacionar la distancia en ticks con el precio real de ejecución de la entrada.

Si calcularas un precio stop concreto a partir del cierre de la señal, el nivel partiría de ese cierre. Con una apertura siguiente distinta, ya no sería la misma distancia respecto a la entrada real.

Elige la forma según la regla que quieras expresar. loss es distancia en ticks desde la entrada; stop es un nivel de precio concreto.

Una vela no contiene todos los movimientos del precio

OHLCV proporciona apertura, máximo, mínimo y cierre. No conocemos automáticamente el orden temporal de todos los precios intermedios.

Si una vela alcanza el objetivo con su máximo y el stop con su mínimo, esos cuatro precios no dicen qué sucedió primero. El simulador usa las reglas de su modelo de ejecución. Datos de menor temporalidad pueden permitir una comprobación más detallada.

Comprueba ese caso aparte; no elijas a mano siempre el resultado favorable. La hipótesis del modelo forma parte del resultado.

El precio stop tampoco garantiza el precio exacto de ejecución. Si la siguiente vela abre más allá del stop, la ejecución puede ser peor que el nivel saltado por el hueco. El slippage puede añadir otra diferencia.

Distancia y pérdida monetaria

Para una posición larga de una unidad con valor del punto 1, cien ticks de 0,01 representan 1 unidad monetaria de diferencia. Con diez unidades, el resultado por ese movimiento se multiplica por diez.

La cantidad, el tick y el valor del punto determinan juntos la magnitud monetaria del movimiento hasta el stop. También intervienen las comisiones y las condiciones reales de ejecución.

Si especificas qty directamente en una orden, es su propia cantidad. El ejemplo usa la cantidad predeterminada, modificable en Properties → Order size.

Los 100 y 200 ticks de DEMO son ilustrativos. En otro instrumento pueden significar distancias de precio y monetarias diferentes.

Pruébalo por tu cuenta

Conserva longitudes, cantidad y costes. Ejecuta una versión con distancias de stop/objetivo 100/200 y otra con 200/400. Comprueba qué ocurre con la misma señal de entrada.

Solución del ejercicio

En Inputs cambia solo Stop distance (ticks) y Target distance (ticks). Con distancias mayores, la posición puede cerrarse en otra vela o por otro motivo.

El cierre por cruce permanece en ambas versiones. Un objetivo más lejano no implica que la posición siga abierta hasta alcanzarlo. Las reglas actúan juntas.

Tras guardar los inputs, espera siempre el recálculo antes de leer los resultados nuevos. Conserva las exportaciones con nombres distintos si quieres compararlas después.

Busca el motivo de salida

Selecciona una operación cerrada y comprueba entrada, distancias en ticks y valores OHLC de la vela de salida. Usa precio y momento para determinar qué regla explica el cierre. Si la vela toca varios niveles, considera también el modelo de ejecución.