Lección 1.1.4 · 60 min

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.

Fig. — Tres stops de venta sobre NOVA del 22 al 25 de octubre de 2024, en barras de 15 minutos: el hueco de resultados los dispara todos en la apertura del día 25
04/05
Módulo
1.1 · Cómo funcionan los mercados
Duración
60 min
Lecciones del nivel 1
  1. 1.1 · Cómo funcionan los mercados

    1. 1.1.1 Participantes y centros de negociación
    2. 1.1.2 Sesiones, subastas, festivos y calendarios
    3. 1.1.3 Libro de órdenes: bid, ask, spread y profundidad
    4. 1.1.4 Tipos de órdenes
    5. 1.1.5 Costes, liquidación, apalancamiento y margen
  2. 1.2 · Clases de activos

    1. 1.2.1 Acciones: splits, dividendos y eventos corporativos
    2. 1.2.2 ETFs: réplica, tracking error, apalancados y UCITS
    3. 1.2.3 Futuros: especificaciones, margen, roll y contango
    4. 1.2.4 Forex: pares, pips, lotes, rollover y CFD
    5. 1.2.5 Opciones: call, put, valor intrínseco y valor temporal
    6. 1.2.6 Cripto: spot, perpetuos, funding y custodia
    7. 1.2.7 Renta fija y tipos de interés; CFDs y productos apalancados
  3. 1.3 · Fuentes de datos de mercado

    1. 1.3.1 Tipos de datos de mercado: EOD, barras, ticks, libro y referencia
    2. 1.3.2 Fuentes de datos gratuitas
    3. 1.3.3 APIs de datos retail y prosumer
    4. 1.3.4 Proveedores de datos profesionales
    5. 1.3.5 Datos de cripto y on-chain
    6. 1.3.6 Brókeres como fuente de datos
    7. 1.3.7 Licencias y términos de uso de datos
    8. 1.3.8 Cómo elegir proveedor de datos
  4. 1.4 · Ingeniería de datos financieros

    1. 1.4.1 Descarga por REST y websockets: paginación, límites y reintentos
    2. 1.4.2 Limpieza de datos: faltantes, ticks erróneos, huecos y zonas horarias
    3. 1.4.3 Ajustes por splits y dividendos: precios ajustados y sin ajustar
    4. 1.4.4 Universos sin sesgo de supervivencia: deslistados, fusiones y cambios de símbolo
    5. 1.4.5 Construcción de barras: tiempo, ticks, volumen, dólar y desequilibrio
    6. 1.4.6 Series continuas de futuros: reglas de roll, ajuste por diferencia y ajuste por ratio
    7. 1.4.7 Almacenamiento: CSV, Parquet, particionado, DuckDB, TimescaleDB y ArcticDB
    8. 1.4.8 Pipeline reproducible: descarga, validación, actualización incremental y tests de calidad
  5. 1.5 · Datos fundamentales y macro

    1. 1.5.1 Estados financieros, ratios, XBRL y SEC EDGAR
    2. 1.5.2 Datos macro, calendarios económicos, estimaciones y transcripciones
  6. 1.6 · Análisis exploratorio financiero

    1. 1.6.1 Rentabilidades, volatilidad, correlaciones móviles y drawdown
    2. 1.6.2 Hechos estilizados: colas gruesas, agrupamiento, autocorrelación y apalancamiento
    3. 1.6.3 Estacionalidad: día de la semana, mes, cambio de mes y sesiones intradía
  7. 1.7 · Análisis técnico programado

    1. 1.7.1 Indicadores técnicos en Python
    2. 1.7.2 Implementación propia frente a TA-Lib: validar resultados
    3. 1.7.3 Patrones de velas y soportes y resistencias
    4. 1.7.4 Multi-timeframe sin anticipación

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)

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.

IN [01]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]
OUT [01]El lado vendedor del libro a las 15:00
[(52.75, 1870), (52.76, 9900), (52.77, 13280), (52.78, 17322)]
IN [02]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))
OUT [02]Recorrer el libro
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

Validez: DAY, GTC, IOC y FOK

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

ValidezQué haceCuándo usarla
DAYVive hasta el final de la sesión y expiraPor defecto en casi todos los brókeres; sistemas diarios
GTCVive 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
IOCEjecuta lo que pueda al momento y cancela el restoTomar liquidez sin dejar rastro en el libro
FOKTodo al momento o nadaCuando una ejecución parcial no sirve (pares, coberturas)
A la apertura (OPG, MOO, LOO)Solo participa en la subasta de aperturaSistemas que deciden con el cierre anterior
Al cierre (MOC, LOC)Solo participa en la subasta de cierreRebalanceos, replicar el precio de cierre

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

IN [03]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)
OUT [03]Limitada IOC y FOK de 15.000 acciones a 52,76
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 publicado1Nota 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:

IN [04]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)
OUT [04]El hueco del 25 de octubre de 2024
            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).

IN [05]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)
OUT [05]Tres stops sobre barras de 5 minutos
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?

IN [06]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())
OUT [06]El stop-limit con validez GTC
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.

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.

NuevaAceptadaRechazadaParcialEjecutadaCanceladaExpirada
Fuente 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:

IN [07]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")
OUT [07]Máquina de estados de una orden
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:

IN [08]python
o2 = Orden(2_000)
o2.pasa("aceptada")
o2.ejecuta(2_000)
o2.pasa("cancelada")
OUT [08]Una transición imposible
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.

ejecutadase ejecutase ejecutaEntrada limitadaActiva OCOObjetivo limitadoStop de pérdidasCancela el stopCancela objetivo
Fuente 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.
TipoGarantizaRiesgo principalUso típico en un sistema
MercadoEjecuciónPrecio, sobre todo con libro finoSalidas que no pueden esperar
LimitadaPrecioNo ejecutarseEntradas pacientes, provisión de liquidez
StopDisparoHueco: ejecución lejos del stopStop de pérdidas
Stop-limitPrecio tras el disparoQuedarse sin salirEntradas por ruptura con tope
TrailingSigue al precioEl mismo que el stopProteger beneficios
MOC / LOCPrecio de cierreDesequilibrio; envío antes de la hora límiteRebalanceo, sistemas al cierre
IOC / FOKNo deja rastroEjecución parcial o nulaTomar liquidez controlada
Bracket / OCOSalida automáticaParciales mal enlazadosPosiciones 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
IN [09]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))
OUT [09]Venta a mercado de 25.000 acciones
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.

  1. 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
IN [10]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
OUT [10]Bracket sobre barras de 5 minutos
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.

  1. 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.

Footnotes

  1. NYSE, folleto «NYSE opening and closing auctions» (consultado el 21 de octubre de 2026). ↩

Respuesta plegada en cada pregunta

Autoevaluación

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

    • AGarantiza el precio, no la ejecución
    • BGarantiza la ejecución si hay contrapartida, no el precio
    • CGarantiza las dos cosas
    • DNo garantiza ninguna
    Ver respuesta

    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?

    • ASe ejecutan 11.770 acciones y el resto se cancela
    • BNo se ejecuta nada
    • CSe ejecutan 15.000, las últimas a 52,77
    • DSe ejecutan 11.770 y el resto queda en el libro
    Ver respuesta

    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?

    • ASe ejecuta a 62,30
    • BSe ejecuta a 60,14
    • CSe dispara, pero no se ejecuta: el precio no vuelve a 62,30 en toda la sesión y la orden expira
    • DNo se dispara
    Ver respuesta

    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?

    • AUna orden que se ejecuta al cierre
    • BDos órdenes enlazadas: cuando una se ejecuta, la otra se cancela
    • CUna orden que solo se ejecuta entera
    • DUna orden oculta
    Ver respuesta

    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?

    • AUna orden de mercado a las 16:00
    • BUna MOC (o LOC) enviada antes de las 15:50, con la señal calculada con datos anteriores a esa hora
    • CUna stop al precio de cierre
    • DUna GTC
    Ver respuesta

    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