25.1 De operaciones individuales a una serie
Un mercado puede producir miles de ejecuciones. Para estudiar su evolución, esas observaciones se agrupan en intervalos: un minuto, una hora, una sesión u otro período.
OHLCV conserva apertura, máximo, mínimo, cierre y volumen de cada intervalo. El resultado pierde el orden interno de casi todas las operaciones, pero ofrece una representación compacta y comparable.
Idea central: una barra OHLCV no es un dato elemental; es un agregado cuya interpretación depende de reglas explícitas de tiempo, sesión, elegibilidad, corrección y ajuste.
25.2 Los cinco componentes
Apertura
Primer precio elegible del intervalo.
Máximo
Mayor precio elegible observado.
Mínimo
Menor precio elegible observado.
Cierre
Último precio elegible del intervalo.
Volumen
Suma de cantidades elegibles negociadas.
25.3 Apertura del intervalo
La apertura es el precio de la primera operación elegible dentro del intervalo. En una barra diaria puede coincidir con una subasta de apertura, pero depende de la metodología y de las sesiones incluidas.
No debe completarse automáticamente con la mejor punta ni con el cierre anterior: ambos son datos diferentes. Si no hubo operaciones, la apertura puede no existir.
25.4 Máximo y mínimo
El máximo y el mínimo son los extremos de los precios operados elegibles. No son necesariamente los mayores bid y ask publicados, porque una cotización puede no ejecutarse.
25.5 Cierre del intervalo
El cierre es el precio de la última operación elegible del intervalo. En una barra intradiaria suele surgir del orden temporal de las ejecuciones.
Para una barra diaria, “close” puede referirse al último precio del conjunto seleccionado o a un cierre oficial provisto por el mercado. Una API debe documentar cuál entrega.
25.6 Volumen y cantidad de operaciones
El volumen suma cantidades, mientras la cantidad de operaciones cuenta ejecuciones. Una operación de 10.000 unidades y cien operaciones de 100 producen el mismo volumen, pero no la misma actividad transaccional.
25.7 Construcción paso a paso
El orden es esencial para O y C, pero no para H, L o V. Una corrección posterior puede modificar cualquiera de los cinco campos.
25.8 Intervalos semiabiertos
Una convención útil define cada intervalo como [inicio, fin): incluye el instante inicial y excluye el final. Así, una operación exactamente a las 10:01 pertenece a la barra que comienza a las 10:01, no a la anterior.
La convención evita duplicar eventos en límites contiguos. Debe combinarse con precisión temporal y zona horaria conocidas.
25.9 Marco temporal
Una serie de un minuto y una diaria resumen horizontes diferentes. No es correcto comparar formas sin considerar duración, sesión y cantidad de observaciones.
| Intervalo | Pregunta posible | Riesgo de interpretación |
|---|---|---|
| 1 minuto | ¿Qué ocurrió en un tramo breve? | Ruido y períodos sin operaciones. |
| 1 hora | ¿Cómo evolucionó parte de la sesión? | Cortes que no respetan fases del mercado. |
| Diario | ¿Cómo terminó cada fecha de mercado? | Mezclar sesión regular y extendida. |
| Semanal | ¿Cuál fue el rango agregado? | Semanas incompletas o feriados. |
25.10 Sesión y calendario
Dos proveedores pueden producir barras diarias diferentes si uno incluye negociación extendida y otro solo la sesión regular. También pueden diferir en subastas, operaciones especiales y fecha asignada a sesiones nocturnas.
Metadatos necesarios: zona horaria, calendario, horario, fases incluidas, regla del cierre y versión de la metodología.
25.11 Hora del evento y hora de recepción
Las operaciones deben agruparse según la hora relevante definida por la fuente, normalmente la del evento. Usar la hora de recepción puede mover mensajes demorados a una barra posterior.
Si llega tarde una operación perteneciente a una barra ya publicada, el sistema debe decidir si actualiza esa barra, emite una corrección o mantiene una versión provisional.
25.12 Operaciones elegibles
No todos los mensajes de ejecución necesariamente participan en OHLCV. Puede haber condiciones especiales, cancelaciones, correcciones, operaciones fuera de sesión o tipos excluidos por la metodología.
Filtrar solo por instrumento y tiempo es insuficiente. La elegibilidad debe ser una regla documentada y comprobable, no una lista implícita dispersa por el código.
25.13 Intervalos sin operaciones
Cuando no existen operaciones elegibles, O, H, L y C no pueden calcularse desde ese intervalo y el volumen genuino es cero. Hay varias representaciones posibles:
- omitir la barra;
- crear una barra con precios nulos y volumen cero;
- arrastrar el cierre anterior, marcándolo explícitamente como imputado.
Error frecuente: completar precios con el cierre anterior sin una marca. El resultado parece una operación real y puede reducir artificialmente medidas de variación.
25.14 Vela alcista, bajista y neutral
Una vela suele llamarse alcista cuando C > O, bajista cuando C < O y neutral cuando son iguales. El cuerpo representa la distancia entre apertura y cierre; las mechas llegan hasta máximo y mínimo.
| Parte | Cálculo | Información perdida |
|---|---|---|
| Cuerpo | |C − O| | Trayectoria entre primera y última operación. |
| Mecha superior | H − max(O, C) | Cuándo se alcanzó el máximo. |
| Mecha inferior | min(O, C) − L | Cuándo se alcanzó el mínimo. |
| Rango | H − L | Orden de movimientos dentro del intervalo. |
25.15 Dos caminos, la misma vela
Una secuencia 100 → 108 → 96 → 105 y otra 100 → 96 → 108 → 105 producen el mismo OHLC. Sin datos intraintervalo no puede saberse cuál ocurrió.
Esta pérdida importa al probar estrategias: una orden condicionada podría activarse antes o después según el camino, aunque la vela final sea idéntica.
25.16 Precio típico y precio promedio ponderado
El precio típico (H + L + C) / 3 es una transformación de la barra. El VWAP requiere cada precio y cantidad —o agregados suficientes— y pondera operaciones reales.
25.17 Agregar barras a un período mayor
Para agregar barras consecutivas y compatibles: la apertura viene de la primera, el cierre de la última, el máximo es el mayor H, el mínimo el menor L y los volúmenes se suman.
Las barras deben compartir instrumento, fuente, ajuste, sesión y unidad de volumen. Combinar metodologías diferentes produce un agregado numéricamente posible pero conceptualmente inválido.
25.18 Correcciones, cancelaciones y versiones
Cancelar la operación que fijó el máximo obliga a buscar el siguiente precio más alto entre las operaciones restantes. Por eso no siempre puede corregirse una barra usando solo sus cinco campos.
Guardar operaciones de origen o aceptar revisiones del proveedor permite reconstruir. Una barra puede tener estado provisional, final o corregido, junto con versión y hora de cálculo.
25.19 Ajustes por operaciones societarias
Un desdoblamiento cambia la escala del precio y la cantidad sin representar por sí mismo una pérdida económica equivalente. Para análisis histórico pueden ajustarse precios anteriores y, de forma coherente, volumen o cantidades.
Los dividendos requieren otra metodología si se busca una serie de rendimiento total. “Ajustado” no es suficiente: deben conocerse eventos, factores, dirección del ajuste y fecha de aplicación.
25.20 Precisión, redondeo y unidades
Precios y volúmenes deben conservar la precisión definida por la fuente. Redondear cada operación antes de agregar puede producir un resultado diferente de redondear al final.
El volumen puede expresarse en acciones, contratos, lotes, unidades del activo base o importe monetario. Una columna llamada volume sin unidad documentada no alcanza para comparar instrumentos.
25.21 Laboratorio: construir una vela
Editá los cinco valores. El laboratorio comprueba las invariantes de OHLC, dibuja cuerpo y mechas y calcula rango y variación entre apertura y cierre.
Barra diaria ficticia · ABC
Datos sin ajustar, expresados en ARS y unidades negociadas.
La barra cumple H ≥ max(O, C) y L ≤ min(O, C).
25.22 Validar OHLCV con JavaScript
function validarOHLCV({ open, high, low, close, volume }) {
const valores = [open, high, low, close, volume];
const errores = [];
if (!valores.every(Number.isFinite)) errores.push("Hay valores no numéricos");
if ([open, high, low, close].some(precio => precio <= 0)) {
errores.push("Los precios deben ser positivos");
}
if (volume < 0) errores.push("El volumen no puede ser negativo");
if (high < Math.max(open, close)) errores.push("Máximo inconsistente");
if (low > Math.min(open, close)) errores.push("Mínimo inconsistente");
if (high < low) errores.push("El máximo es menor que el mínimo");
return { valida: errores.length === 0, errores };
}
console.log(validarOHLCV({ open: 100, high: 108, low: 96, close: 105, volume: 25000 }));
25.23 Construir una barra desde operaciones
function construirBarra(operaciones) {
if (operaciones.length === 0) return null;
const ordenadas = [...operaciones].sort((a, b) =>
Date.parse(a.hora) - Date.parse(b.hora) || a.secuencia - b.secuencia
);
const precios = ordenadas.map(op => op.precio);
return {
open: ordenadas[0].precio,
high: Math.max(...precios),
low: Math.min(...precios),
close: ordenadas.at(-1).precio,
volume: ordenadas.reduce((suma, op) => suma + op.cantidad, 0),
trades: ordenadas.length
};
}
const operaciones = [
{ hora: "2026-09-14T13:00:20Z", secuencia: 2, precio: 101, cantidad: 80 },
{ hora: "2026-09-14T13:00:05Z", secuencia: 1, precio: 100, cantidad: 50 },
{ hora: "2026-09-14T13:00:45Z", secuencia: 3, precio: 99, cantidad: 70 }
];
console.log(construirBarra(operaciones));
25.24 Actualizar una barra en tiempo real
function incorporar(barra, operacion) {
if (!barra) {
return {
open: operacion.precio,
high: operacion.precio,
low: operacion.precio,
close: operacion.precio,
volume: operacion.cantidad,
firstSequence: operacion.secuencia,
lastSequence: operacion.secuencia
};
}
return {
...barra,
high: Math.max(barra.high, operacion.precio),
low: Math.min(barra.low, operacion.precio),
close: operacion.precio,
volume: barra.volume + operacion.cantidad,
lastSequence: operacion.secuencia
};
}
let barra = null;
barra = incorporar(barra, { precio: 100, cantidad: 50, secuencia: 10 });
barra = incorporar(barra, { precio: 102, cantidad: 30, secuencia: 11 });
console.log(barra);
La función supone mensajes elegibles y ordenados. Si llega una operación anterior, el cierre no debe sustituirse ingenuamente; se necesita conservar tiempo y reconstruir.
25.25 Agregar barras compatibles
function agregarBarras(barras) {
const validas = barras.filter(barra => barra && barra.trades > 0);
if (validas.length === 0) return null;
return {
open: validas[0].open,
high: Math.max(...validas.map(barra => barra.high)),
low: Math.min(...validas.map(barra => barra.low)),
close: validas.at(-1).close,
volume: validas.reduce((suma, barra) => suma + barra.volume, 0),
trades: validas.reduce((suma, barra) => suma + barra.trades, 0)
};
}
console.log(agregarBarras([
{ open: 100, high: 103, low: 99, close: 102, volume: 500, trades: 8 },
{ open: 102, high: 106, low: 101, close: 105, volume: 700, trades: 11 }
]));
25.26 Errores frecuentes
- Usar cotizaciones bid o ask para construir barras de operaciones sin indicarlo.
- Interpretar apertura y cierre como inicio y fin exactos del período.
- Agrupar por hora de recepción cuando corresponde hora del evento.
- Duplicar una operación ubicada exactamente en el límite entre intervalos.
- Rellenar períodos vacíos sin marcar valores imputados.
- Suponer que una vela revela el orden interno de máximos y mínimos.
- Mezclar datos ajustados y sin ajustar o sesiones diferentes.
- Confundir volumen, cantidad de operaciones e importe negociado.
25.27 Ejercicio integrador
Durante un intervalo llegan, en orden, operaciones de 40 unidades a $50, 25 a $53, 60 a $49 y 30 a $52. Calculá OHLCV, cantidad de operaciones, cuerpo, rango y variación de apertura a cierre.
Ver una solución posible
const operaciones = [
{ precio: 50, cantidad: 40 },
{ precio: 53, cantidad: 25 },
{ precio: 49, cantidad: 60 },
{ precio: 52, cantidad: 30 }
];
const precios = operaciones.map(op => op.precio);
const open = operaciones[0].precio;
const high = Math.max(...precios);
const low = Math.min(...precios);
const close = operaciones.at(-1).precio;
const volume = operaciones.reduce((suma, op) => suma + op.cantidad, 0);
console.log({
open, high, low, close, volume,
trades: operaciones.length,
cuerpo: Math.abs(close - open),
rango: high - low,
variacion: (close / open - 1) * 100
});
La barra es O=50, H=53, L=49, C=52 y V=155. Hubo cuatro operaciones, el cuerpo mide $2, el rango $4 y la variación de apertura a cierre es 4%.
25.28 Ideas para recordar
- OHLCV resume operaciones elegibles dentro de un intervalo definido.
- Apertura y cierre dependen del orden; máximo y mínimo, de los extremos.
- Volumen no equivale a cantidad de operaciones ni a importe negociado.
- Los intervalos semiabiertos evitan duplicar eventos en sus límites.
- Una vela no conserva el recorrido interno de los precios.
- Sesión, zona horaria, elegibilidad y ajustes forman parte del dato.
- Las correcciones requieren trazabilidad y, a veces, reconstrucción completa.
En el próximo tema estudiaremos el rendimiento de una inversión y la variación porcentual del precio.