Datos de mercado: clústeres, delta, interés abierto y libro de órdenes
Qué lee un script en LootScript además de las velas: clústeres, delta, interés abierto, tasa de financiación, historial y libro de órdenes en vivo, cinta de operaciones, screener, otra temporalidad e instrumento.
Además de las velas, un script en LootScript lee datos del flujo de órdenes: clústeres, delta, interés abierto, tasa de financiación, el historial del libro de órdenes grabado, el libro de órdenes en vivo y la cinta de operaciones, y las métricas del screener. No hace falta activar nada: en cuanto el script referencia, por ejemplo, cluster.poc, el terminal se suscribe automáticamente a los clústeres del instrumento y de la temporalidad del gráfico —incluso si el gráfico muestra velas normales. Cuando se quita el script del gráfico, la suscripción se libera.
En esta página — qué hay en cada espacio de nombres, de dónde vienen los datos, en qué exchanges están disponibles y cómo obtener valores de otra temporalidad u otro instrumento.
Regla principal: ausencia de datos = na, no 0
Cualquier valor referido en esta página puede ser na. Sucede si el exchange no está cubierto por el servidor, la temporalidad no está soportada, la historia aún se está cargando o la barra es más antigua que la historia disponible. Un cero significaría «no hubo trades», y eso es un hecho diferente: sumar ceros sustituidos puede parecer plausible y a la vez ser incorrecto.
Cada espacio de nombres tiene una bandera de disponibilidad — cluster.available, delta.available, oi.available, etc. Compruébala o usa la función na(x). El compilador no permite comparar con na usando ==.
indicator("Накопленная дельта без подмены нулём", overlay = false)
var float cvd = 0.0
if delta.available {
cvd := cvd + delta.value
}
plot(delta.available ? cvd : na, "CVD", color = color.teal)Por qué faltan datos lo indica la leyenda del gráfico junto al nombre del script: “exchange no cubierto”, “temporalidad no compatible”, “cargando datos…”, “no hay libro de órdenes abierto”, “screener no disponible”.
Origen de los datos
| Espacio | Qué es | Historia en el gráfico |
|---|---|---|
cluster.* |
Clústeres (footprint) de la barra: volumen por precios | Hay, desde el servidor de clústeres |
delta.* |
Delta de compras y ventas agresivas | Hay |
oi.* |
Interés abierto | Hay |
funding.* |
Tasa de financiación y sus cálculos | Hay |
depth.* |
Libro de órdenes grabado por el servidor, por barras | Hay, con profundidad limitada |
book.* |
Libro de órdenes en vivo | Solo la última barra |
tape.* |
Cinta de operaciones en vivo | Solo la última barra |
screener.* |
Métricas del screener por instrumento | Solo la última barra |
Clústeres: cluster.*
El volumen de cada nivel de precio dentro de la barra, separado en compras y ventas agresivas — los mismos datos que dibuja el gráfico footprint. Los niveles se numeran de abajo arriba, de 0 a cluster.levels - 1.
| Nombre | Qué devuelve |
|---|---|
cluster.available |
Si hay clústeres en esta barra |
cluster.levels |
Número de niveles de precio en la barra |
cluster.price(i) |
Precio del nivel i |
cluster.bid(i) |
Compras agresivas en el nivel i |
cluster.ask(i) |
Ventas agresivas en el nivel i |
cluster.total |
Todo el volumen de la barra |
cluster.delta |
Compras menos ventas en todos los niveles |
cluster.poc, cluster.poc_index |
Precio y número del nivel con mayor volumen |
cluster.max_cell |
Volumen de la celda más grande de la barra |
cluster.imbalance(i) |
Desbalance del nivel: +1 compras, -1 ventas, 0 ninguno |
cluster.stacked_buy, cluster.stacked_sell |
Precio desde el que comienza la serie más larga de niveles con desbalance |
cluster.stacked_buy_steps, cluster.stacked_sell_steps |
Longitud de esa serie en niveles |
cluster.value_area(pct) |
Límite inferior y superior de la zona de valor; pct — fracción de volumen, 0.7 = 70 % |
cluster.grid_step |
Paso de la rejilla de precios de la barra |
Fíjate en los nombres: cluster.bid(i) son compras que “quitaron” un ask, no órdenes de compra en el libro.
Hay clústeres en temporalidades desde 30 segundos hasta 1 día.
indicator("POC и зона стоимости", overlay = true)
[vaLow, vaHigh] = cluster.value_area(0.7)
plot(cluster.poc, "POC", color = color.orange, style = plot.style_circles)
plot(vaHigh, "Верх зоны", color = color.gray, style = plot.style_linebr)
plot(vaLow, "Низ зоны", color = color.gray, style = plot.style_linebr)Delta: delta.*
La diferencia entre compras agresivas y ventas agresivas en la barra. Los volúmenes están en monedas (la divisa base).
| Nombre | Qué devuelve |
|---|---|
delta.value |
Delta de la barra: compras menos ventas |
delta.buy, delta.sell |
Esas dos partes por separado |
delta.cum |
Delta acumulada desde el inicio de la historia cargada |
delta.min, delta.max |
Mínima y máxima de la delta dinámica dentro de la barra |
delta.open, delta.high, delta.low, delta.close |
Delta de la barra en formato vela |
delta.trades |
Número de operaciones en la barra |
delta.usd |
Delta en la moneda cotizada, por sumas de las propias operaciones |
delta.available |
Si hay delta en esta barra |
delta.min y delta.max no se pueden deducir de los clústeres — indican el recorrido de la delta dentro de la barra y las calcula el servidor. Muestran, por ejemplo, que los compradores llevaron la barra y luego fue cerrada por vendedores. delta.usd es más preciso que delta.value * close: en barras volátiles el precio de las operaciones difiere mucho del precio de cierre.
delta.cum empieza en cero en la primera barra cargada, por lo que su nivel depende de la profundidad de la historia cargada. Compara cambios, no valores absolutos.
La delta está disponible en temporalidades desde 30 segundos.
indicator("Дельта и разворот внутри бара", overlay = false)
d = delta.value
reversed = delta.available and d < 0 and delta.max > -d
plot(d, "Дельта", style = plot.style_columns, color = d >= 0 ? color.teal : color.red)
plotshape(reversed, "Разворот", style = shape.xcross, location = location.top, color = color.orange, size = size.tiny)Interés abierto: oi.*
| Nombre | Qué devuelve |
|---|---|
oi.open, oi.high, oi.low, oi.close |
Interés abierto por barra en las unidades que publica el exchange |
oi.coins |
Interés abierto en monedas |
oi.usd |
Interés abierto en la moneda cotizada |
oi.change |
Cambio de oi.close respecto a la barra anterior |
oi.available |
Si hay datos en esta barra |
Las unidades de oi.open…oi.close varían entre exchanges; para comparar exchanges usa oi.coins u oi.usd. El interés abierto llega en una rejilla de minutos: en temporalidades en segundos todos los valores son na.
indicator("Цена и открытый интерес", overlay = false)
dp = ta.change(close)
build = oi.available and dp > 0 and oi.change > 0
plot(oi.change, "Изменение OI", style = plot.style_columns, color = build ? color.teal : color.gray)Tasa de financiación: funding.*
| Nombre | Qué devuelve |
|---|---|
funding.rate |
Pronóstico de la tasa para el próximo cálculo |
funding.interval_hours |
Horas entre cálculos |
funding.settled |
true en la barra donde se hizo el cálculo |
funding.settled_rate |
Tasa efectivamente debitada en esa barra; si hay varios cálculos en la barra — su suma |
funding.cum |
Suma de tasas debitadas en la historia cargada |
funding.available |
Si el instrumento tiene tasa de financiación |
La tasa es una fracción, no porcentajes: 0.0001 = 0.01 %. El gráfico la muestra en porcentajes; el lenguaje no la reescala. Para comprobar hipótesis en la historia usa funding.settled_rate: funding.rate es un pronóstico que puede cambiar hasta el mismo cálculo. El spot no tiene funding; en temporalidades en segundos los valores son na.
indicator("Фандинг за расчёт, %", overlay = false)
plot(funding.rate * 100, "Прогноз ставки", style = plot.style_area, color = funding.rate >= 0 ? color.teal : color.red)
plotshape(funding.settled, "Расчёт", style = shape.circle, location = location.bottom, color = color.orange, size = size.tiny)Historial del libro de órdenes: depth.*
El libro de órdenes tal como lo grabó el servidor — los mismos datos que dibuja el mapa de calor — desglosado por barras. A diferencia del book.* en vivo, estos valores existen en cada barra grabada. Los precios se agrupan en cestas; el volumen de la cesta es el mayor volumen que estuvo en esa cesta durante la barra, en monedas.
| Nombre | Qué devuelve |
|---|---|
depth.available |
Si el libro está grabado para esa barra |
depth.levels |
Número de cestas no vacías en la barra |
depth.price(i) |
Límite inferior de la cesta i, en orden ascendente |
depth.qty(i) |
Mayor volumen que estuvo en la cesta durante la barra |
depth.side(i) |
+1 bids, -1 asks, 0 cesta estuvo en ambas caras |
depth.at(price) |
Volumen en la cesta donde cae el precio |
depth.grid_step |
Tamaño de la cesta en unidades de precio |
depth.best_bid, depth.best_ask |
Mejores precios al final de la barra |
depth.max_cell |
Volumen de la cesta más pesada |
depth.bid_sum(pct), depth.ask_sum(pct) |
Volumen del lado dentro de pct % desde el centro |
depth.imbalance(pct) |
Desbalance en la misma banda: de -1 a +1 |
depth.max_bid(pct), depth.max_ask(pct) |
Precio y volumen de la cesta más pesada del lado dentro de la banda |
Limitaciones:
- Los datos están donde está la mapa de calor del servidor, y en temporalidades desde un segundo.
- El servidor guarda una banda de aproximadamente ±4 % respecto al precio. Fuera de ella
depth.atdevuelvena; dentro de la banda una cesta vacía devuelve0. - La profundidad histórica es limitada: las barras más antiguas de una historia larga devuelven
na. - Los valores de la barra en formación cambian mientras llegan datos.
indicator("Перекос записанного стакана", overlay = false)
band = input.float(1.0, "Полоса, % от цены", minval = 0.1, maxval = 4.0, step = 0.1)
imb = depth.imbalance(band)
plot(imb, "Перекос", style = plot.style_columns, color = imb >= 0 ? color.teal : color.red)Para dibujar el libro grabado bajo las velas basta una sola línea heatmap.depth() en el script con overlay = true. Colores y umbrales están en la página Настройки и отрисовка.
indicator("Записанный стакан теплом", overlay = true)
heatmap.config(palette = heatmap.inferno, low = 25)
heatmap.depth()Libro de órdenes en vivo y cinta: book.* y tape.*
El libro de órdenes en vivo y la cinta no los graba nadie, por eso los valores existen solo en la última barra, y en la historia siempre son na. Requieren tener abierta la panel del libro de órdenes del mismo instrumento: de lo contrario book.available y tape.available son falsos, y en la leyenda aparece “no hay libro de órdenes abierto”. En modo repetición estos datos no están disponibles.
| Nombre | Qué devuelve |
|---|---|
book.bid(i), book.ask(i) |
Precio del nivel i; 0 — mejor precio |
book.bid_qty(i), book.ask_qty(i) |
Volumen en el nivel, en monedas |
book.spread |
Mejor ask menos mejor bid |
book.mid |
Punto medio entre los mejores precios |
book.imbalance(n) |
Desbalance de volumen en los n niveles superiores de cada lado: de -1 a +1 |
book.available |
Si hay snapshot del libro |
tape.last_price, tape.last_qty |
Precio y volumen de la última operación |
tape.last_side |
+1 comprador agresor, -1 vendedor, 0 — aún no hubo operaciones |
tape.count(ms) |
Número de operaciones en los últimos ms milisegundos |
tape.buy_volume(ms), tape.sell_volume(ms) |
Volumen de compras y ventas agresivas en la ventana |
tape.max_print(ms) |
Operación más grande en la ventana |
tape.available |
Si la cinta está conectada |
La ventana de la cinta y la profundidad de book.imbalance se fijan con un número en el código o con la opción input.int. La ventana se cuenta desde la hora de la última operación en el exchange, no desde el reloj del equipo. El script solo tiene acceso al tail de la cinta —unas dos mil últimas operaciones—, por lo que en mercados muy activos una ventana larga no mostrará todo el intervalo.
Cuando un valor así se pasa a plot, el editor avisa: “Los datos sólo están en tiempo real — en el historial la serie está vacía”. Es esperado: a la izquierda de la última barra la serie está vacía. Las estrategias no pueden leer estos datos — véase Стратегии и тестер.
indicator("Перекос стакана", overlay = false)
levels = input.int(20, "Уровней с каждой стороны", minval = 1, maxval = 200)
imb = book.available ? book.imbalance(levels) : na
plot(imb, "Перекос", style = plot.style_area, color = imb >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)Screener: screener.*
Las métricas del screener para el instrumento del gráfico son los mismos números que aparecen en sus columnas. No tienen historia: el valor existe solo en la última barra. La ventana se pasa como cadena, y no todas las métricas aceptan todas las ventanas.
| Función | Qué muestra | Ventanas |
|---|---|---|
screener.change(w) |
Cambio de precio | "1m" "5m" "15m" "1h" "24h" |
screener.vol(w) |
Volumen | "1m" "5m" "15m" "1h" "24h" |
screener.avg_vol(w) |
Volumen promedio | "1m" "5m" "15m" "1h" |
screener.rvol(w) |
Volumen relativo | "1h" "24h" |
screener.natr(w) |
NATR | "1m" "5m" |
screener.oi_delta(w) |
Cambio del interés abierto | "1m" "5m" "1h" "24h" |
screener.btc_corr(w) |
Correlación con BTC | "1m" "5m" |
screener.available |
Si el instrumento está cubierto por el screener | — |
Una ventana no listada en la tabla da na. Una métrica que no entra en tu suscripción al screener también es na. El editor marca la salida de estos valores con la misma advertencia que para el libro: en la historia la serie está vacía.
indicator("Скринер: RVOL и NATR", overlay = false)
plot(screener.rvol("1h"), "RVOL 1h", color = color.orange)
plot(screener.natr("5m"), "NATR 5m", color = color.teal)Cobertura por exchange
| Exchange | Clústeres y delta | Interés abierto y tasa de financiación |
|---|---|---|
| Binance, Bybit, OKX, Bitget, Gate.io, MEXC, KuCoin, BingX, AsterDEX | spot y futuros | Futuros |
| Hyperliquid | Futuros; spot — no | Futuros |
| Binance Alpha | No: el exchange no publica el lado agresor | No |
| Upbit | No | No |
| Datos | Temporalidades |
|---|---|
| Clústeres | De 30 segundos a 1 día |
| Delta | Desde 30 segundos |
| Interés abierto, tasa de financiación | Desde 1 minuto |
| Historial del libro de órdenes | Desde 1 segundo, donde esté la mapa de calor del servidor |
| Libro en vivo, cinta | Cualquier temporalidad, si está abierto el panel del libro |
| Screener | Cualquier temporalidad, para instrumentos que el screener ve |
La cobertura la determina el servidor de datos y puede cambiar. Es más seguro fiarse de la bandera .available y de la indicación en la leyenda.
Otra temporalidad y otro instrumento
request.security evalúa una expresión en otra serie — una temporalidad superior o otra moneda — y alinea el resultado con las barras del gráfico.
request.security(symbol, timeframe, expression, gaps = false, lookahead = false, ignore_invalid_symbol = false)- symbol — en formato «EXCHANGE:Ticker», como en TradingView:
"BINANCE:BTCUSDT.P", donde.Pes el futuro perpetuo. El instrumento del gráfico essym.ticker. - timeframe — cadena tipo
"5","60","4h","1D","1W". La temporalidad del gráfico estf.period. - expression — un número o varios números entre corchetes:
[high, low].
Sin adelantarse al cierre. Por defecto la barra del gráfico ve el valor del último cierre de la barra superior. Por eso una EMA horaria en 5 minutos es en escalón que solo se mueve al cierre de la hora. Así el resultado en historia coincide con lo que habrías visto en vivo.
gaps = true— el valor solo está en la primera barra del gráfico donde aparece la barra superior nueva; despuésna.ignore_invalid_symbol = true— un símbolo desconocido dana. Sin esto el script falla con error “Символ … неизвестен”.
Dentro de la expresión están disponibles las velas de la otra serie y los cálculos sobre ellas. No puedes pasar la variable del gráfico allí — solo los valores de input.*. El libro, la cinta y el screener no compilan dentro de la petición; clústeres, delta, interés abierto y funding de la otra serie devuelven na. Un script puede pedir hasta 8 pares “instrumento + temporalidad” distintos y hasta 32 llamadas a request.security.
indicator("EMA старшего таймфрейма", overlay = true)
len = input.int(20, "Длина EMA", minval = 2, maxval = 500)
tfHigh = input.timeframe("60", "Старший таймфрейм")
emaHigh = request.security(sym.ticker, tfHigh, ta.ema(close, len))
plot(emaHigh, "EMA", color = color.orange, style = plot.style_stepline)indicator("Спред к другой бирже", overlay = false)
other = input.symbol("BYBIT:BTCUSDT.P", "Сравнить с")
px = request.security(other, tf.period, close, ignore_invalid_symbol = true)
plot(close - px, "Разница", color = color.orange)