---
title: "1.1.4 Tipos de órdenes: mercado, limitada, stop y más"
description: "Órdenes de mercado, limitadas, stop, stop-limit, trailing, MOC/LOC, IOC/FOK, iceberg y bracket/OCO, con un motor de cruce y stops en un hueco."
url: "https://pythonparatrading.com/curso-python-trading/nivel-1/tipos-de-ordenes/"
lang: "es"
image: "https://pythonparatrading.com/og/curso-python-trading/nivel-1/tipos-de-ordenes.png"
---

# 1.1.4 · Tipos de órdenes

> El tipo de orden decide qué se sacrifica: el precio, la ejecución o el control. Esta lección programa un pequeño motor de cruce contra el libro de NOVA, simula tres stops en un día de hueco y modela el ciclo de vida de una orden como una máquina de estados.

- Curso: [Nivel 1: Datos financieros, mercados y análisis](https://pythonparatrading.com/curso-python-trading/nivel-1/)
- Módulo: 1.1 · Cómo funcionan los mercados
- Duración: 60 min
- Requisitos: [1.1.2 · Sesiones, subastas, festivos y calendarios](https://pythonparatrading.com/curso-python-trading/nivel-1/sesiones-subastas-y-calendarios-de-mercado/), [1.1.3 · Libro de órdenes: bid, ask, spread y profundidad](https://pythonparatrading.com/curso-python-trading/nivel-1/libro-de-ordenes-bid-ask-y-profundidad/)

## Al terminar esta lección

- Distinguir órdenes de mercado, limitadas, stop, stop-limit y trailing por lo que garantizan (ejecución o precio) y lo que arriesgan.
- Calcular el precio medio de una orden de mercado recorriendo el libro y decidir si una orden IOC o FOK se ejecuta.
- Simular stops sobre barras y explicar por qué en un hueco el stop se ejecuta lejos de su precio y el stop-limit puede no ejecutarse.
- Elegir la validez (DAY, GTC, IOC, FOK, al cierre o a la apertura) y las órdenes enlazadas (bracket, OCO) adecuadas para un sistema.
- Modelar el ciclo de vida de una orden (nueva, aceptada, parcial, ejecutada, cancelada, rechazada, expirada) y rechazar transiciones imposibles.

## Precio o ejecución: el dilema de toda orden

Una orden le dice al bróker qué comprar o vender, cuánto y en qué condiciones. Todas las variantes que existen salen
de una decisión básica:

- **Orden de mercado.** Ejecutar ya, al precio que haya. Garantiza la ejecución (si hay contrapartida) y no garantiza
  el precio.
- **Orden limitada.** Ejecutar solo a un precio igual o mejor que el límite. Garantiza el precio y no garantiza la
  ejecución.

Una compra limitada por encima del mejor ask es *marketable*: se ejecuta al momento, como una de mercado, pero con un
tope. Una compra limitada por debajo del mejor bid se queda en el libro, al final de la cola de su precio, y espera
(lección 1.1.3). El resto de tipos añade a estas dos una **condición** (un precio de disparo, una hora, un tamaño
mínimo) o una **relación** con otras órdenes.

*Fig. — Dónde espera cada tipo de orden respecto al mejor bid y al mejor ask (esquema).* Esquema con dos columnas, compra y venta, sobre una escala de precios con el mejor ask arriba y el mejor bid abajo, separados por la horquilla (destacada). En compra: la limitada espera por debajo del bid, la de mercado paga el ask y el stop está por encima del ask. En venta: la limitada espera por encima del ask, la de mercado cobra el bid y el stop está por debajo del bid.

La figura sitúa cada tipo respecto al libro. Las limitadas esperan del lado «bueno» del precio: compras por debajo,
ventas por encima. Los stops esperan del lado «malo»: un stop de venta está por debajo del bid y se dispara si el
precio cae hasta él; un stop de compra, por encima del ask. Las órdenes de mercado no esperan: cruzan la horquilla.

## Un motor de cruce de veinte líneas

La mejor forma de entender una orden es ejecutarla. Este motor recorre los niveles de un lado del libro en orden de
prioridad y devuelve las ejecuciones. Se usa la foto L2 de NOVA de las 15:00 de Nueva York de la lección 1.1.3, con
el mejor ask a 52,75.

```python
import pandas as pd

l2 = pd.read_parquet("nova_libro_l2.parquet")
foto = l2[l2["ts"] == "2025-06-02 19:00:00+00:00"]
asks = foto[foto["lado"] == "ask"].sort_values("precio")
bids = foto[foto["lado"] == "bid"].sort_values("precio",
                                                ascending=False)
lado_venta = list(zip(asks["precio"], asks["tamano"]))
lado_compra = list(zip(bids["precio"], bids["tamano"]))
medio = (asks["precio"].iloc[0] + bids["precio"].iloc[0]) / 2
lado_venta[:4]
```
```output
[(52.75, 1870), (52.76, 9900), (52.77, 13280), (52.78, 17322)]
```

```python
def recorre(niveles, cantidad, limite=None, compra=True):
    """Ejecuta contra `niveles` [(precio, tamaño)] hasta `cantidad`.
    Con `limite`, no pasa de ese precio.
    Devuelve (ejecuciones, resto)."""
    ejecuciones, resto = [], cantidad
    for precio, tam in niveles:
        if limite is not None and (precio > limite if compra
                                   else precio < limite):
            break
        q = min(resto, tam)
        ejecuciones.append((precio, q))
        resto -= q
        if resto == 0:
            break
    return ejecuciones, resto

def resumen(ejecuciones, medio):
    q = sum(c for _, c in ejecuciones)
    pm = sum(p * c for p, c in ejecuciones) / q
    return {"acciones": q, "niveles": len(ejecuciones),
            "precio_medio": round(float(pm), 4),
            "sobre_medio_cent": round(float(100 * abs(pm - medio)), 2)}

for n in (2_000, 30_000):
    ejec, resto = recorre(lado_venta, n)
    print(f"compra a mercado de {n}:", resumen(ejec, medio))
```
```output
compra a mercado de 2000: {'acciones': 2000, 'niveles': 2, 'precio_medio': 52.7507, 'sobre_medio_cent': 0.56}
compra a mercado de 30000: {'acciones': 30000, 'niveles': 4, 'precio_medio': 52.7671, 'sobre_medio_cent': 2.21}
```

Una compra a mercado de 2.000 acciones se llena con el primer nivel entero (1.870 acciones a 52,75) y 130 del
segundo, a 52,76: precio medio 52,7507, 0,56 céntimos por encima del medio. Una de 30.000 recorre cuatro niveles y
paga de media 52,7671: 2,21 céntimos sobre el medio, casi cuatro veces más por acción. Es el **impacto** de la orden, el
coste que crece con el tamaño (la lección 1.1.5 lo convierte en una curva):

*Fig. — Compra a mercado de hasta 30.000 acciones contra el libro de NOVA de las 15:00 de Nueva York: precio del último nivel tocado y precio medio pagado.* Escalones del precio marginal, de 52,75 en las primeras 1.870 acciones a 52,76, 52,77 y 52,78, y curva del precio medio, que sube suave desde 52,75 hasta 52,7671 con 30.000 acciones (destacado). Una línea marca el precio medio del libro, 52,745.

## Validez: DAY, GTC, IOC y FOK

Además del precio, una orden lleva una **validez** (*time in force*), que dice cuánto tiempo vive:

| Validez | Qué hace | Cuándo usarla |
|---|---|---|
| DAY | Vive hasta el final de la sesión y expira | Por defecto en casi todos los brókeres; sistemas diarios |
| GTC | Vive hasta que se ejecuta o se cancela (los brókeres suelen ponerle un tope de días) | Stops y objetivos de posiciones de varios días |
| IOC | Ejecuta lo que pueda al momento y cancela el resto | Tomar liquidez sin dejar rastro en el libro |
| FOK | Todo al momento o nada | Cuando una ejecución parcial no sirve (pares, coberturas) |
| A la apertura (OPG, MOO, LOO) | Solo participa en la subasta de apertura | Sistemas que deciden con el cierre anterior |
| Al cierre (MOC, LOC) | Solo participa en la subasta de cierre | Rebalanceos, replicar el precio de cierre |

Con el motor anterior, IOC y FOK son dos líneas:

```python
def limitada(niveles, cantidad, limite, validez, compra=True):
    ejec, resto = recorre(niveles, cantidad, limite, compra)
    if validez == "FOK" and resto > 0:
        return [], cantidad, "cancelada: no hay suficiente"
    if validez == "IOC":
        estado = "ejecutada" if resto == 0 else f"cancela {resto}"
        return ejec, resto, estado
    return ejec, resto, f"{resto} quedan en el libro"

for validez in ("IOC", "FOK", "DAY"):
    ejec, resto, estado = limitada(lado_venta, 15_000, 52.76, validez)
    print(validez, "ejecuta", sum(q for _, q in ejec), "·", estado)
```
```output
IOC ejecuta 11770 · cancela 3230
FOK ejecuta 0 · cancelada: no hay suficiente
DAY ejecuta 11770 · 3230 quedan en el libro
```

A 52,76 o mejor solo hay 11.770 acciones. La IOC se las lleva y cancela las 3.230 que faltan; la FOK no ejecuta nada;
la DAY ejecuta lo mismo que la IOC y deja una compra de 3.230 acciones a 52,76 en el libro, que pasa a ser el nuevo
mejor bid: ha cruzado la horquilla y ahora la define.

Las órdenes a la apertura y al cierre se cruzan en las subastas (lección 1.1.2). En la NYSE hay variantes a mercado
(MOO, MOC) y limitadas (LOO, LOC); las MOC y LOC se pueden enviar, modificar o cancelar hasta las 15:50, y después
solo se aceptan las que reducen el desequilibrio publicado[^1].

[^1]: NYSE, folleto «NYSE opening and closing auctions» (consultado el 21 de octubre de 2026).

## Stop, stop-limit y trailing en un hueco

Un **stop** es una orden dormida con un precio de disparo. Un stop de venta a 62,50 no hace nada mientras el precio
esté por encima; cuando se negocia a 62,50 o menos, se convierte en una **orden de mercado**. Un **stop-limit** se
convierte en una **limitada**: «si cae a 62,50, vende, pero no por debajo de 62,30». Un **trailing stop** mueve el
disparo detrás del precio: se queda, por ejemplo, un 2,5 % por debajo del máximo alcanzado desde la entrada, y solo
sube.

La diferencia entre los tres importa en los **huecos**: cuando el precio salta de un nivel a otro sin pasar por los
intermedios, típicamente de un cierre a la apertura siguiente tras una noticia. NOVA presentó resultados tras el
cierre del jueves 24 de octubre de 2024 y el viernes abrió un 5,1 % más abajo:

```python
diario = pd.read_csv("nova_diario_sin_ajustar.csv",
                     parse_dates=["fecha"])
diario["hueco_pct"] = 100 * (diario["apertura"]
                             / diario["cierre"].shift() - 1)
tramo = diario[diario["fecha"].between("2024-10-21", "2024-10-28")]
tramo.set_index("fecha").round(2)
```
```output
            apertura  maximo  minimo  cierre   volumen  hueco_pct
fecha
2024-10-21     63.27   64.32   62.90   64.30  13820466       0.02
2024-10-22     64.26   64.47   63.74   64.07   9126443      -0.06
2024-10-23     63.93   64.67   63.76   64.19   8728289      -0.22
2024-10-24     64.11   64.60   63.21   63.40   9874612      -0.12
2024-10-25     60.14   60.87   59.51   59.59  51399629      -5.14
2024-10-28     59.25   59.33   57.11   58.02  18793763      -0.57
```

Un sistema compra al cierre del 21 de octubre, a 64,30, y protege la posición de tres formas: un stop a 62,50, un
stop-limit 62,50/62,30 válido para el día y un trailing stop del 2,5 %. Las barras de 5 minutos permiten simular cuándo
se dispara cada uno. La regla de ejecución de un stop sobre barras es la honrada: si la barra **abre** por debajo del
stop, la venta sale a la apertura; si abre por encima y su mínimo lo toca, sale al stop (y aun así es optimista: en
la realidad, al primer precio negociado después).

```python
barras = pd.read_parquet("nova_barras_5min.parquet")
barras = (barras[barras["ts"] > "2024-10-21 20:00"]
          .reset_index(drop=True))
entrada = 64.30

def stop_venta(barras, stop):
    for b in barras.itertuples():
        if b.minimo <= stop:
            return b.ts, min(b.apertura, stop)
    return None, None

def trailing_venta(barras, entrada, pct):
    maximo = entrada
    for b in barras.itertuples():
        stop = maximo * (1 - pct)
        if b.minimo <= stop:
            return b.ts, min(b.apertura, stop), stop
        maximo = max(maximo, b.maximo)
    return None, None, None

def stop_limit_venta(barras, stop, limite, validez="DAY"):
    disparo = None
    for b in barras.itertuples():
        if disparo is None and b.minimo <= stop:
            disparo = b.ts
            if b.apertura > stop:           # sin hueco: sale al stop
                return disparo, b.ts, stop
        if disparo is not None:
            if validez == "DAY" and b.ts.date() > disparo.date():
                return disparo, None, None  # expiró sin ejecutar
            if b.maximo >= limite:
                return disparo, b.ts, max(limite, b.apertura)
    return disparo, None, None

ts, px = stop_venta(barras, 62.50)
print("stop 62,50:      disparo", ts, "· venta a", px)
ts, px, nivel = trailing_venta(barras, entrada, 0.025)
print(f"trailing 2,5 %:  disparo {ts} · nivel {nivel:.2f}",
      f"· venta a {px}")
d, ts, px = stop_limit_venta(barras, 62.50, 62.30)
print("stop-limit DAY:  disparo", d, "· venta:", px)
```
```output
stop 62,50:      disparo 2024-10-25 13:30:00+00:00 · venta a 60.14
trailing 2,5 %:  disparo 2024-10-25 13:30:00+00:00 · nivel 63.05 · venta a 60.14
stop-limit DAY:  disparo 2024-10-25 13:30:00+00:00 · venta: None
```

Los tres se disparan en la misma barra, la de la apertura del 25 de octubre (13:30 UTC, 9:30 de Nueva York):

- El **stop** a 62,50 vende a 60,14, la apertura: 2,36 USD por acción por debajo de su precio. El stop no es un precio
  garantizado; es la condición para que nazca una orden de mercado.
- El **trailing**, que había subido su nivel hasta 63,05 con el máximo de 64,67 del 23 de octubre, vende exactamente
  igual, a 60,14. En un hueco, un stop más ajustado no sirve de nada.
- El **stop-limit** se dispara, pero su límite de 62,30 queda 1,43 USD por encima del precio más alto del día, 60,87. A las 16:00 expira sin ejecutar y la posición sigue abierta, sin protección.

La figura de la cabecera lo dibuja barra a barra. ¿Y si el stop-limit fuera GTC?

```python
disparo, ts, px = stop_limit_venta(barras, 62.50, 62.30, validez="GTC")
print("se ejecuta", ts, "a", px)
entre = barras[(barras["ts"] > disparo) & (barras["ts"] < ts)]
print("mínimo mientras espera:", entre["minimo"].min(),
      "el", entre.loc[entre["minimo"].idxmin(), "ts"].date())
```
```output
se ejecuta 2025-01-16 16:55:00+00:00 a 62.3
mínimo mientras espera: 53.51 el 2025-01-03
```

Se ejecuta casi tres meses después, el 16 de enero de 2025, cuando NOVA vuelve a 62,30. Por el camino la acción llega
a 53,51 el 3 de enero, casi 9 USD por debajo del límite. Para una cartera esto es lo contrario de una protección: el stop-limit evita vender mal en el hueco a cambio de
no vender en absoluto mientras el precio sigue cayendo.

<aside class="callout" data-kind="riesgo">

Un backtest que ejecuta los stops a su precio exacto, sin mirar la apertura, regala dinero en cada hueco. En NOVA,
2,36 USD por acción el 25 de octubre de 2024, un 3,7 % del precio de entrada, en un solo día. Simula los stops con la
apertura de la barra cuando esta ya está por debajo, y con barras diarias asume lo peor: si el día abre por debajo,
la venta sale a la apertura.

</aside>

## El ciclo de vida de una orden

Una orden no pasa de «enviada» a «ejecutada» sin más. El bróker y el mercado le devuelven estados, y un sistema real
tiene que reaccionar a cada uno: una ejecución parcial deja una posición distinta de la prevista; un rechazo (por
saldo, por precio fuera de rango, por mercado cerrado) significa que no hay posición.

```mermaid
stateDiagram-v2
  [*] --> Nueva
  Nueva --> Aceptada
  Nueva --> Rechazada
  Aceptada --> Parcial
  Aceptada --> Ejecutada
  Aceptada --> Cancelada
  Aceptada --> Expirada
  Parcial --> Ejecutada
  Parcial --> Cancelada
  Parcial --> Expirada
  Ejecutada --> [*]
  Cancelada --> [*]
  Rechazada --> [*]
  Expirada --> [*]
```

Tres estados son finales en cuanto a la orden, aunque no en cuanto a la posición: una orden **cancelada** o
**expirada** después de una ejecución parcial ha dejado acciones en la cuenta. Modelarlo como una máquina de estados
evita los errores más comunes, como cancelar una orden que ya se ejecutó o contar dos veces una ejecución:

```python
TRANSICIONES = {
    "nueva": {"aceptada", "rechazada"},
    "aceptada": {"parcial", "ejecutada", "cancelada", "expirada"},
    "parcial": {"parcial", "ejecutada", "cancelada", "expirada"},
}

class Orden:
    def __init__(self, cantidad):
        self.cantidad, self.ejecutada = cantidad, 0
        self.estado, self.historial = "nueva", ["nueva"]

    def pasa(self, estado):
        if estado not in TRANSICIONES.get(self.estado, set()):
            raise ValueError(f"de {self.estado} no se pasa a {estado}")
        self.estado = estado
        self.historial.append(estado)

    def ejecuta(self, q):
        if self.ejecutada + q > self.cantidad:
            raise ValueError("ejecución mayor que la orden")
        self.ejecutada += q
        lleno = self.ejecutada == self.cantidad
        self.pasa("ejecutada" if lleno else "parcial")

# la IOC de 15.000 acciones a 52,76 contra el libro de las 15:00
o = Orden(15_000)
o.pasa("aceptada")
for _, q in recorre(lado_venta, 15_000, limite=52.76)[0]:
    o.ejecuta(q)
o.pasa("cancelada")     # IOC: el resto se cancela
print(" -> ".join(o.historial), "·", o.ejecutada, "acciones")
```
```output
nueva -> aceptada -> parcial -> parcial -> cancelada · 11770 acciones
```

Una orden ejecutada no se puede cancelar. Si el sistema lo intenta (porque recibió tarde la confirmación, por
ejemplo), la máquina de estados lo para en lugar de dejar que el error llegue a la cuenta:

```python raises
o2 = Orden(2_000)
o2.pasa("aceptada")
o2.ejecuta(2_000)
o2.pasa("cancelada")
```
```output
ValueError: de ejecutada no se pasa a cancelada
```

## Órdenes enlazadas: bracket y OCO

Una **OCO** (*one cancels the other*) son dos órdenes enlazadas: cuando una se ejecuta, el sistema cancela la otra. La
combinación típica es un objetivo de beneficio (venta limitada por encima) y un stop de pérdidas (venta stop por
debajo). Un **bracket** añade la entrada: el par OCO solo se activa cuando la entrada se ejecuta.

```mermaid
flowchart TB
  E[Entrada limitada] -->|ejecutada| A[Activa OCO]
  A --> TP[Objetivo limitado]
  A --> SL[Stop de pérdidas]
  TP -->|se ejecuta| C1[Cancela el stop]
  SL -->|se ejecuta| C2[Cancela objetivo]
```

Que el bróker gestione el enlace tiene una ventaja: si el sistema se cae, las órdenes de salida siguen en el
servidor. El riesgo está en las ejecuciones parciales: si el objetivo se ejecuta a medias, el stop tiene que reducirse
a la cantidad que queda, y no todos los brókeres lo hacen igual. Un sistema que envía brackets debe leer qué hace el
suyo y comprobarlo en una cuenta de pruebas.

## Otras órdenes que aparecen en los datos

- **Iceberg.** Una limitada con una parte visible y una reserva oculta que se repone (lección 1.1.3).
- **Oculta.** Una limitada que no se ve en absoluto en el libro; suele perder prioridad frente a las visibles del
  mismo precio.
- **Pegged (vinculada).** Su precio sigue al mejor bid, al mejor ask o al punto medio; es lo que se cruza en el centro
  oscuro de la lección 1.1.1.
- **Algorítmicas del bróker (TWAP, VWAP).** No son tipos de orden del mercado, sino programas que parten una orden
  grande en muchas pequeñas a lo largo del día. Son el origen de muchas de las operaciones de 100 acciones de la cinta.

| Tipo | Garantiza | Riesgo principal | Uso típico en un sistema |
|---|---|---|---|
| Mercado | Ejecución | Precio, sobre todo con libro fino | Salidas que no pueden esperar |
| Limitada | Precio | No ejecutarse | Entradas pacientes, provisión de liquidez |
| Stop | Disparo | Hueco: ejecución lejos del stop | Stop de pérdidas |
| Stop-limit | Precio tras el disparo | Quedarse sin salir | Entradas por ruptura con tope |
| Trailing | Sigue al precio | El mismo que el stop | Proteger beneficios |
| MOC / LOC | Precio de cierre | Desequilibrio; envío antes de la hora límite | Rebalanceo, sistemas al cierre |
| IOC / FOK | No deja rastro | Ejecución parcial o nula | Tomar liquidez controlada |
| Bracket / OCO | Salida automática | Parciales mal enlazados | Posiciones con objetivo y stop |

## Ejercicios

1. Calcula el precio medio y los niveles que recorre una venta a mercado de 25.000 acciones contra el libro de las
   15:00 y compárala con una compra del mismo tamaño. ¿Por qué no cuestan lo mismo?

**Solución.**

```python
for lado, niveles, nombre in ((False, lado_compra, "venta"),
                              (True, lado_venta, "compra")):
    ejec, resto = recorre(niveles, 25_000, compra=lado)
    print(nombre, resumen(ejec, medio))
```
```output
venta {'acciones': 25000, 'niveles': 3, 'precio_medio': 52.7345, 'sobre_medio_cent': 1.05}
compra {'acciones': 25000, 'niveles': 3, 'precio_medio': 52.7645, 'sobre_medio_cent': 1.95}
```

Las dos recorren tres niveles, pero la venta paga 1,05 céntimos por acción sobre el medio y la compra 1,95, casi el
doble. La razón está en el primer nivel: la venta encuentra 13.432 acciones en el mejor bid, a medio céntimo del
medio, y la compra solo 1.870 en el mejor ask, así que la mayor parte de la compra se ejecuta en el segundo y el
tercer nivel (lección 1.1.3). Si la venta fuera de 40.000 acciones, la cosa cambiaría: más allá del tercer nivel de
compra apenas hay nada. Un libro asimétrico cobra distinto a quien compra y a quien vende, y la asimetría cambia con
el tamaño.

2. El 2 de junio de 2025 un sistema compra NOVA a la apertura de las 9:30 (apertura de la primera barra) con un
   bracket: objetivo un 0,5 % por encima y stop un 0,5 % por debajo. Con las barras de 5 minutos, ¿cuál se ejecuta
   primero? ¿Qué harías si una misma barra tocara los dos?

**Solución.**

```python
todas = pd.read_parquet("nova_barras_5min.parquet")
dia = todas[todas["ts"].dt.date == pd.Timestamp("2025-06-02").date()]
ent = dia["apertura"].iloc[0]
tp, sl = round(ent * 1.005, 2), round(ent * 0.995, 2)
print("entrada", ent, "· objetivo", tp, "· stop", sl)
for b in dia.itertuples():
    toca_tp, toca_sl = b.maximo >= tp, b.minimo <= sl
    if toca_tp or toca_sl:
        print(b.ts.strftime("%H:%M UTC"), "objetivo" if toca_tp else "",
              "stop" if toca_sl else "")
        break
```
```output
entrada 53.35 · objetivo 53.62 · stop 53.08
13:55 UTC  stop
```

Salta el stop en la barra de las 13:55 UTC (9:55 de Nueva York), 25 minutos después de la entrada, y el OCO cancela
el objetivo. La primera barra que toca uno de los dos niveles decide la salida. Si una misma barra tocara
los dos, con barras no se sabe cuál fue antes: la regla prudente es suponer el stop (el peor caso) o bajar a datos de
más resolución, como las operaciones de `nova_operaciones.parquet`.

3. Un sistema diario entra en la apertura con órdenes a mercado y sale con un stop del 3 % GTC. Propón un conjunto de
   órdenes mejor y justifica cada cambio.

**Solución.**

Entrada: una orden a la apertura (OPG o MOO) en lugar de una de mercado a las 9:30, para cruzar en la subasta, a un
precio único y con mucha liquidez, en vez de en los primeros segundos de continua, cuando la horquilla es más ancha
(lección 1.1.3). Si se quiere un tope, una LOO. Salida: el stop puede seguir siendo un stop (no un stop-limit), porque
lo importante es salir; pero el backtest debe simularlo con la apertura en los huecos. Si la estrategia también tiene
objetivo, enlazar objetivo y stop en un OCO gestionado por el bróker, para que la salida no dependa de que el sistema
esté vivo. Y en todos los casos, tratar las ejecuciones parciales y los rechazos con la máquina de estados.

## Autoevaluación

1. ¿Qué garantiza una orden de mercado y qué no?

   - A. Garantiza el precio, no la ejecución
   - B. Garantiza la ejecución si hay contrapartida, no el precio
   - C. Garantiza las dos cosas
   - D. No garantiza ninguna

   *Respuesta B: Garantiza la ejecución si hay contrapartida, no el precio.* Una orden de mercado se ejecuta contra lo que haya en el libro, nivel a nivel, hasta completarse. En el libro de NOVA de las 15:00, una compra a mercado de 30.000 acciones paga de media 52,7671, casi dos céntimos por encima del mejor ask.

2. Una compra limitada IOC de 15.000 acciones a 52,76 llega a un libro con 1.870 acciones a 52,75 y 9.900 a 52,76. ¿Qué pasa?

   - A. Se ejecutan 11.770 acciones y el resto se cancela
   - B. No se ejecuta nada
   - C. Se ejecutan 15.000, las últimas a 52,77
   - D. Se ejecutan 11.770 y el resto queda en el libro

   *Respuesta A: Se ejecutan 11.770 acciones y el resto se cancela.* IOC (inmediata o cancelar) ejecuta lo que pueda al momento dentro del límite y cancela el resto. Con FOK (todo o nada inmediato) no se ejecutaría nada, porque no hay 15.000 acciones a 52,76 o mejor.

3. El 25 de octubre de 2024 NOVA abre a 60,14 tras cerrar a 63,40. Una venta stop-limit con stop 62,50 y límite 62,30, válida para el día, ¿qué hace?

   - A. Se ejecuta a 62,30
   - B. Se ejecuta a 60,14
   - C. Se dispara, pero no se ejecuta: el precio no vuelve a 62,30 en toda la sesión y la orden expira
   - D. No se dispara

   *Respuesta C: Se dispara, pero no se ejecuta: el precio no vuelve a 62,30 en toda la sesión y la orden expira.* El stop se dispara con la primera operación por debajo de 62,50, que es la apertura a 60,14. Entonces nace una venta limitada a 62,30, que solo se ejecuta a 62,30 o más. El máximo del día es 60,87, así que la orden expira sin ejecutar y la posición sigue abierta.

4. ¿Qué es una orden OCO?

   - A. Una orden que se ejecuta al cierre
   - B. Dos órdenes enlazadas: cuando una se ejecuta, la otra se cancela
   - C. Una orden que solo se ejecuta entera
   - D. Una orden oculta

   *Respuesta B: Dos órdenes enlazadas: cuando una se ejecuta, la otra se cancela.* OCO (*one cancels the other*) enlaza dos órdenes, típicamente un objetivo de beneficio y un stop. Un bracket es una entrada con un OCO de salida que se activa cuando la entrada se ejecuta.

5. Un sistema decide con el cierre del día y quiere ejecutar en la subasta de cierre de la NYSE. ¿Qué orden y cuándo?

   - A. Una orden de mercado a las 16:00
   - B. Una MOC (o LOC) enviada antes de las 15:50, con la señal calculada con datos anteriores a esa hora
   - C. Una stop al precio de cierre
   - D. Una GTC

   *Respuesta B: Una MOC (o LOC) enviada antes de las 15:50, con la señal calculada con datos anteriores a esa hora.* Las órdenes al cierre de la NYSE se aceptan, modifican o cancelan hasta las 15:50; después solo se admiten las que reducen el desequilibrio publicado. La señal no puede usar el precio de cierre, que aún no existe cuando hay que enviar la orden (lección 1.1.2).

## Ideas clave

- Toda orden elige entre certeza de ejecución (mercado) y certeza de precio (limitada). Las demás son combinaciones de estas dos con una condición.
- Una orden de mercado recorre el libro: su coste crece con el tamaño. En NOVA, 2.000 acciones pagan 0,56 céntimos sobre el medio y 30.000, 2,21.
- Un stop es una orden de mercado dormida: en un hueco se ejecuta al primer precio disponible, lejos del stop. Un stop-limit protege el precio, pero puede no ejecutarse y dejar la posición abierta.
- La validez importa tanto como el tipo: DAY, GTC, IOC, FOK, a la apertura o al cierre.
- Las órdenes enlazadas (bracket, OCO) y el ciclo de vida (parcial, cancelada, expirada) son lo que un sistema real tiene que gestionar, y un backtest suele ignorar.

## Recursos

### Research

- [Modelos Cuantitativos y Ejecución Algorítmica](https://pythonparatrading.com/modelos-cuantitativos-ejecucion-algoritmica/) · Research-0009 · 11 min
- [Liquidez Order Book - Trading Liquidez Agregada](https://pythonparatrading.com/limit-order-book-y-liquidez-de-mercado/) · Research-0008 · 11 min

### Documentación

- [NYSE: Opening and Closing Auctions (MOO, LOO, MOC, LOC y sus horarios)](https://www.nyse.com/publicdocs/nyse/markets/nyse/NYSE_Opening_and_Closing_Auctions_Fact_Sheet.pdf) · nyse.com
- [Investor.gov (SEC): Types of Orders](https://www.investor.gov/introduction-investing/investing-basics/how-stock-markets-work/types-orders) · investor.gov

### Datos

- [Datos del nivel 1: barras de 5 minutos de NOVA, 2024-2025 (Parquet)](https://pythonparatrading.com/curso/datos/nivel-1/nova_barras_5min.parquet) · Descarga · nova_barras_5min.parquet

Lección anterior: [1.1.3 · Libro de órdenes: bid, ask, spread y profundidad](https://pythonparatrading.com/curso-python-trading/nivel-1/libro-de-ordenes-bid-ask-y-profundidad/)

Lección siguiente: [1.1.5 · Costes, liquidación, apalancamiento y margen](https://pythonparatrading.com/curso-python-trading/nivel-1/costes-liquidacion-apalancamiento-y-margen/)
