20.1 Después de aceptar la orden
Una orden válida y aceptada puede interactuar con órdenes del lado opuesto o permanecer en el libro. Si varias instrucciones pretenden operar al mismo precio, el sistema necesita reglas deterministas para decidir el orden de atención.
Esas reglas forman el algoritmo de prioridad y cruce. No deben deducirse del orden visual de una pantalla: pertenecen al reglamento del mercado.
Idea central: precio, secuencia y cantidad explican qué puede ejecutarse; cada reporte de ejecución reduce el saldo, pero no reescribe la cantidad original.
20.2 Qué significa tener prioridad
Tener prioridad significa ser atendido antes que otras órdenes comparables. No garantiza una ejecución: todavía debe llegar una orden compatible, existir cantidad suficiente y mantenerse vigente la instrucción.
La prioridad se evalúa dentro del mismo libro, lado y conjunto de reglas. No corresponde comparar directamente la posición de órdenes en segmentos diferentes.
20.3 Prioridad de precio
En una regla precio-tiempo habitual, primero se favorece el precio más competitivo:
- Entre compras, un precio mayor tiene prioridad.
- Entre ventas, un precio menor tiene prioridad.
Una venta a $100,20 se atiende antes que otra a $100,30 cuando llega una compra capaz de alcanzar ambos precios.
20.4 Prioridad temporal
Cuando dos órdenes tienen el mismo precio, una regla FIFO suele atender primero la que el mercado aceptó antes. El instante relevante es el registrado por el sistema de negociación, no necesariamente el reloj del dispositivo del usuario.
Los mercados pueden aplicar asignación proporcional, categorías especiales u otros criterios. Una aplicación debe identificar el algoritmo efectivo en vez de asumir FIFO como regla universal.
20.5 Secuencia antes que reloj
Dos eventos pueden compartir la misma marca temporal visible. Un número de secuencia asignado por la fuente permite establecer un orden total y detectar mensajes faltantes o duplicados.
Precio
Selecciona primero el nivel más competitivo.
Secuencia
Desempata dentro del mismo precio.
Cantidad
Determina cuánto puede tomarse de cada orden.
20.6 Orden entrante y orden en reposo
La orden entrante es el nuevo mensaje que intenta cruzar. La orden en reposo ya se encontraba en el libro. El sistema compara la entrante con la mejor orden opuesta y continúa mientras haya compatibilidad y cantidad.
En el modelo didáctico de este tema, el precio de cada ejecución será el de la orden en reposo. La convención exacta depende del mecanismo y de la fase de negociación.
20.7 Un cruce simplificado paso a paso
- Seleccionar la mejor orden del lado opuesto.
- Comprobar si sus precios son compatibles.
- Ejecutar la menor cantidad entre ambos saldos.
- Reducir los dos saldos por la cantidad ejecutada.
- Repetir mientras continúe la compatibilidad.
20.8 Ejecución total
La orden queda totalmente ejecutada cuando la suma de todas sus ejecuciones alcanza la cantidad original. Puede lograrlo mediante una sola contraparte o mediante varias.
saldo pendiente = 0
«Total» describe el estado de la orden, no la cantidad de reportes recibidos.
20.9 Ejecución parcial
Una ejecución parcial consume una parte de la cantidad y deja un saldo pendiente. La orden puede continuar activa si su tipo, vigencia y reglas lo permiten.
Ejemplo: una compra de 300 unidades recibe una ejecución de 80 y otra de 120. Lleva 200 acumuladas y conserva un saldo de 100.
20.10 Sin ejecución y saldo en el libro
Si el siguiente precio no es compatible, el cruce se detiene. El saldo de una orden limitada puede incorporarse al libro en su precio límite, sujeto a las reglas de vigencia.
No ejecutada no significa rechazada: una orden aceptada puede estar correctamente activa y todavía no haber encontrado contraparte.
20.11 Invariantes de cantidad
Una implementación debe preservar relaciones que puedan verificarse después de cada evento.
Antes de una cancelación, la cantidad cancelada es cero. Después de cancelar el remanente, el saldo pasa a cero sin cambiar la cantidad ya ejecutada.
20.12 Reportes de ejecución
Cada ejecución debe tener identidad propia y referenciar la orden. Entre sus datos habituales se encuentran cantidad, precio, instante, mercado y número de secuencia.
El acumulado debe derivarse de reportes únicos. Procesar dos veces el mismo evento duplicaría posiciones e importes, por lo que se necesitan identificadores e idempotencia.
20.13 Estados del ciclo de vida
Ejecutada, cancelada y rechazada suelen ser estados terminales. «Cancelación solicitada» es un estado transitorio: aún falta la confirmación del mercado.
20.14 Modificación de una orden
Modificar puede significar reemplazar la orden anterior por una nueva versión. Cambiar precio, aumentar cantidad u otros atributos suele afectar su prioridad; algunos mercados permiten reducir cantidad conservando parte de ella.
No asumir: una edición en pantalla no conserva necesariamente el lugar en la cola. La respuesta del mercado debe informar el identificador de la nueva versión y su prioridad.
20.15 Cancelación
Cancelar solicita retirar el saldo todavía activo. La cantidad previamente ejecutada es definitiva para el ciclo de negociación y no desaparece por cancelar el remanente.
Si una orden de 500 unidades ya ejecutó 200, solo pueden cancelarse como máximo las 300 restantes.
20.16 Carreras entre ejecución y cancelación
Mientras una solicitud de cancelación viaja, la orden puede recibir otra ejecución. Por eso una interfaz no debe mostrar «cancelada» al presionar el botón, sino «cancelación pendiente» hasta obtener respuesta.
También puede llegar primero la confirmación de cancelación y después un reporte de ejecución generado antes. Ordenar y reconciliar eventos mediante sus secuencias evita interpretar esa llegada tardía como una contradicción.
20.17 Laboratorio: aplicar prioridad precio-tiempo
Una compra limitada llega frente a cuatro ventas ordenadas por precio y secuencia. Cambiá su cantidad y límite para observar ejecuciones y saldo. El ejemplo no estima impacto ni deslizamiento.
Motor didáctico · compra entrante
Instrumento ficticio ABC. Las ventas A y B comparten precio; A tiene prioridad temporal.
Cola vendedora en reposo
Ejecución total mediante tres reportes; no queda saldo pendiente.
20.18 Implementar un cruce limitado
Esta función copia y ordena las ventas para no modificar el arreglo original. Después consume cada saldo compatible respetando precio y secuencia.
function cruzarCompra(cantidad, limite, ventas) {
let saldo = cantidad;
const ejecuciones = [];
const cola = [...ventas].sort((a, b) =>
a.precio - b.precio || a.secuencia - b.secuencia
);
for (const venta of cola) {
if (saldo === 0 || venta.precio > limite) break;
const ejecutada = Math.min(saldo, venta.cantidad);
ejecuciones.push({ contra: venta.id, precio: venta.precio, cantidad: ejecutada });
saldo -= ejecutada;
}
return { original: cantidad, ejecutada: cantidad - saldo, saldo, ejecuciones };
}
const ventas = [
{ id: "B", precio: 100.20, cantidad: 120, secuencia: 102 },
{ id: "C", precio: 100.30, cantidad: 200, secuencia: 103 },
{ id: "A", precio: 100.20, cantidad: 80, secuencia: 101 }
];
console.log(cruzarCompra(250, 100.30, ventas));
20.19 Modificar, cancelar y conservar invariantes
Una orden original de 500 unidades acumula 200 ejecutadas. Primero se solicita reducir su cantidad total a 400 y luego cancelar el saldo. El ejemplo trata la modificación como aceptada; un sistema real debe esperar confirmación.
const orden = {
cantidadOriginal: 500,
cantidadVigente: 500,
ejecutada: 200,
cancelada: 0,
estado: "PARCIAL"
};
function reducirCantidad(orden, nuevaCantidad) {
if (nuevaCantidad < orden.ejecutada || nuevaCantidad > orden.cantidadVigente) {
throw new Error("Reducción no válida");
}
orden.cancelada += orden.cantidadVigente - nuevaCantidad;
orden.cantidadVigente = nuevaCantidad;
}
function cancelarSaldo(orden) {
const saldo = orden.cantidadVigente - orden.ejecutada;
orden.cancelada += saldo;
orden.cantidadVigente = orden.ejecutada;
orden.estado = "CANCELADA";
}
reducirCantidad(orden, 400);
cancelarSaldo(orden);
console.log(orden);
console.log("Control:", orden.ejecutada + orden.cancelada);
El control final suma 500: 200 ejecutadas y 300 canceladas. La reducción canceló 100 y la cancelación posterior retiró las 200 restantes.
20.20 Ideas para recordar
- La prioridad precio-tiempo favorece primero el precio y después la secuencia.
- FIFO es frecuente, pero no universal.
- Una orden puede ejecutarse mediante varios reportes.
- El saldo disminuye; la cantidad original se conserva para auditoría.
- Modificar puede provocar pérdida de prioridad.
- Solicitar una cancelación no equivale a tenerla confirmada.
En el próximo tema estudiaremos la liquidez, profundidad, volumen y deslizamiento.