{"id":5103,"date":"2026-02-02T19:41:47","date_gmt":"2026-02-02T19:41:47","guid":{"rendered":"https:\/\/bulltradebot.com\/?page_id=5103"},"modified":"2026-02-02T19:59:14","modified_gmt":"2026-02-02T19:59:14","slug":"liqmap","status":"publish","type":"page","link":"https:\/\/bulltradebot.com\/en\/liqmap\/","title":{"rendered":"LIQMAP"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"5103\" class=\"elementor elementor-5103\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8553c38 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"8553c38\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-98f579d\" data-id=\"98f579d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-93e4434 elementor-widget elementor-widget-html\" data-id=\"93e4434\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <title>AI-PRO Mapa de Liquidaciones<\/title>\n  <style>\n    body {\n      font-family: Arial, sans-serif;\n      background: radial-gradient(circle at top, #0d1b2a 0%, #050814 70%);\n      color: #e0f2ff;\n      margin: 0;\n    }\n    header {\n      padding: 10px 20px;\n      border-bottom: 1px solid #222;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      background: radial-gradient(circle at top, #1b2a4a 0, #050814 55%);\n    }\n    header h1 {\n      margin: 0;\n      font-size: 20px;\n      letter-spacing: 1px;\n    }\n    .price-box {\n      text-align: right;\n      font-size: 14px;\n    }\n    .price-live {\n      font-size: 22px;\n      font-weight: bold;\n    }\n    .price-change-pos {\n      color: #2ecc71;\n    }\n    .price-change-neg {\n      color: #e74c3c;\n    }\n    #flecha-presion {\n      margin-left: 6px;\n      font-size: 22px;\n    }\n\n    .grid {\n      display: grid;\n      grid-template-columns: 1.1fr 0.9fr;\n      grid-template-rows: auto auto;\n      gap: 10px;\n      padding: 10px 15px 20px;\n      margin-right: 290px; \/* espacio para panel lateral *\/\n    }\n    .panel {\n      border: 1px solid #1a2b45;\n      padding: 10px;\n      background: linear-gradient(180deg, #0b1628, #050814);\n      font-size: 12px;\n      box-shadow: 0 0 12px rgba(0, 0, 0, 0.5);\n      border-radius: 6px;\n      transition: transform 0.25s ease, box-shadow 0.25s ease;\n    }\n    .panel:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 0 18px rgba(0, 0, 0, 0.7);\n    }\n    .panel h2 {\n      margin: 0 0 8px 0;\n      font-size: 14px;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      color: #9bd5ff;\n    }\n\n    .ratio-bar {\n      width: 100%;\n      height: 18px;\n      background: #111;\n      position: relative;\n      margin-top: 6px;\n      border-radius: 3px;\n      overflow: hidden;\n    }\n    .ratio-long,\n    .ratio-short {\n      transition: width 0.4s ease;\n    }\n    .ratio-long {\n      position: absolute;\n      left: 0;\n      top: 0;\n      bottom: 0;\n      background: linear-gradient(90deg, #1abc9c, #2ecc71);\n    }\n    .ratio-short {\n      position: absolute;\n      right: 0;\n      top: 0;\n      bottom: 0;\n      background: linear-gradient(90deg, #e74c3c, #c0392b);\n    }\n    .ratio-labels {\n      display: flex;\n      justify-content: space-between;\n      margin-top: 4px;\n      font-size: 11px;\n      color: #ccc;\n    }\n\n    #oi-chart {\n      width: 100%;\n      height: 120px;\n      background: #050814;\n      border-radius: 4px;\n      border: 1px solid #222;\n    }\n    .oi-legend {\n      font-size: 11px;\n      margin-top: 4px;\n      color: #aaa;\n    }\n\n    #mapa {\n      max-height: 260px;\n      overflow-y: auto;\n      margin-top: 6px;\n    }\n    .nivel {\n      display: flex;\n      align-items: center;\n      margin: 1px 0;\n      font-size: 11px;\n      transition: background 0.3s ease;\n    }\n    .precio {\n      width: 80px;\n      color: #9bd5ff;\n    }\n    .barra {\n      height: 12px;\n      margin-left: 4px;\n      border-radius: 2px;\n      transition: width 0.4s ease, background 0.4s ease;\n    }\n    .nivel-info {\n      margin-left: 6px;\n      font-size: 10px;\n      color: #aaa;\n    }\n\n    #panel-liquidaciones {\n      grid-column: 1 \/ span 2;\n    }\n\n    #mapa::-webkit-scrollbar {\n      width: 6px;\n    }\n    #mapa::-webkit-scrollbar-track {\n      background: #050814;\n    }\n    #mapa::-webkit-scrollbar-thumb {\n      background: #333;\n      border-radius: 3px;\n    }\n\n    .zona-supplier {\n      background: linear-gradient(90deg, rgba(255, 0, 0, 0.15), rgba(255, 0, 0, 0.05));\n    }\n    .zona-consumer {\n      background: linear-gradient(90deg, rgba(0, 255, 150, 0.15), rgba(0, 255, 150, 0.05));\n    }\n    .zona-neutral {\n      background: rgba(255, 255, 255, 0.03);\n    }\n\n    .panel-lateral {\n      position: fixed;\n      right: 0;\n      top: 80px;\n      width: 280px;\n      height: calc(100% - 100px);\n      background: radial-gradient(circle at top, #0f172a 0%, #020617 70%);\n      border-left: 1px solid #222;\n      padding: 15px;\n      overflow-y: auto;\n      color: #cce6ff;\n      box-shadow: -4px 0 12px rgba(0, 0, 0, 0.4);\n      font-size: 12px;\n    }\n    .panel-lateral h3 {\n      margin-top: 0;\n      margin-bottom: 6px;\n      font-size: 14px;\n      color: #9bd5ff;\n    }\n    .alerta {\n      margin-top: 8px;\n      padding: 6px 8px;\n      border-radius: 4px;\n      background: rgba(255, 99, 71, 0.12);\n      border: 1px solid rgba(255, 99, 71, 0.4);\n      color: #ffb3a1;\n      font-size: 11px;\n    }\n\n    #live-liquidaciones {\n      margin-top: 10px;\n      max-height: 140px;\n      overflow-y: auto;\n      font-size: 11px;\n      border-top: 1px solid #1a2b45;\n      padding-top: 6px;\n    }\n    .liq-item {\n      display: flex;\n      justify-content: space-between;\n      margin: 1px 0;\n      opacity: 0;\n      transform: translateY(4px);\n      animation: fadeInUp 0.25s forwards;\n    }\n    .liq-price {\n      color: #9bd5ff;\n    }\n    .liq-side-buy {\n      color: #2ecc71;\n    }\n    .liq-side-sell {\n      color: #e74c3c;\n    }\n    .liq-qty {\n      color: #aaa;\n    }\n\n    @keyframes fadeInUp {\n      to {\n        opacity: 1;\n        transform: translateY(0);\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <header>\n    <h1>AI-PRO Mapa de Liquidaciones \u2013 BTCUSDT<\/h1>\n    <div class=\"price-box\">\n      <div>Precio en vivo (Binance Futures)<\/div>\n      <div>\n        <span class=\"price-live\" id=\"live-price\">--<\/span>\n        <span id=\"flecha-presion\">\u27f7<\/span>\n      <\/div>\n      <div id=\"live-change\">24h: --<\/div>\n    <\/div>\n  <\/header>\n\n  <div class=\"grid\">\n    <div class=\"panel\">\n      <h2>Ratio global Long \/ Short (cuentas)<\/h2>\n      <div id=\"ratio-info\">Charging...<\/div>\n      <div class=\"ratio-bar\">\n        <div class=\"ratio-long\" id=\"ratio-long\"><\/div>\n        <div class=\"ratio-short\" id=\"ratio-short\"><\/div>\n      <\/div>\n      <div class=\"ratio-labels\">\n        <span id=\"ratio-long-label\">Long --%<\/span>\n        <span id=\"ratio-short-label\">Short --%<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"panel\">\n      <h2>Open Interest \u2013 mini gr\u00e1fico<\/h2>\n      <svg id=\"oi-chart\"><\/svg>\n      <div class=\"oi-legend\" id=\"oi-legend\">Cargando open interest...<\/div>\n    <\/div>\n\n    <div class=\"panel\" id=\"panel-liquidaciones\">\n      <h2>Mapa de liquidaciones p\u00fablicas por niveles<\/h2>\n      <div id=\"mapa\">Charging...<\/div>\n      <div id=\"live-liquidaciones-titulo\" style=\"margin-top:8px;font-size:11px;color:#9bd5ff;\">\n        Liquidaciones en vivo (WebSocket)\n      <\/div>\n      <div id=\"live-liquidaciones\"><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"panel-lateral\" id=\"panel-lateral\">\n    <h3>Lectura AI-PRO<\/h3>\n    <div id=\"interpretacion\">Esperando datos...<\/div>\n    <h3 style=\"margin-top:12px;\">Predicci\u00f3n AI-PRO<\/h3>\n    <div id=\"prediccion\">Esperando datos...<\/div>\n    <h3 style=\"margin-top:12px;\">AI-PRO Supplier Alert<\/h3>\n    <div id=\"alerta-supplier\" class=\"alerta\">Sin alertas cr\u00edticas.<\/div>\n  <\/div>\n\n  <script>\n    const SYMBOL = \"BTCUSDT\";\n\n    \/\/ ---------- PRECIO EN VIVO (WEBSOCKET) ----------\n    (function initPriceWS() {\n      const priceEl = document.getElementById('live-price');\n      const changeEl = document.getElementById('live-change');\n\n      const ws = new WebSocket('wss:\/\/fstream.binance.com\/ws\/btcusdt@ticker');\n      ws.onmessage = (event) => {\n        const d = JSON.parse(event.data);\n        const last = parseFloat(d.c);\n        const change = parseFloat(d.P);\n\n        priceEl.textContent = last.toFixed(2);\n        changeEl.textContent = `24h: ${change.toFixed(2)}%`;\n        changeEl.className = change >= 0 ? 'price-change-pos' : 'price-change-neg';\n      };\n      ws.onerror = () => {\n        changeEl.textContent = \"Error WebSocket precio\";\n      };\n    })();\n\n    \/\/ ---------- LIQUIDACIONES EN VIVO (WEBSOCKET) ----------\n    (function initLiquidationWS() {\n      const cont = document.getElementById('live-liquidaciones');\n      const ws = new WebSocket('wss:\/\/fstream.binance.com\/ws\/!forceOrder@arr');\n\n      ws.onmessage = (event) => {\n        const data = JSON.parse(event.data);\n        const arr = Array.isArray(data) ? data : [data];\n\n        arr.forEach((o) => {\n          const d = o.o || o; \/\/ estructura de Binance\n          if (!d.s || d.s !== SYMBOL) return;\n\n          const price = parseFloat(d.p);\n          const qty = parseFloat(d.q);\n          const side = d.S; \/\/ BUY \/ SELL\n          const time = new Date(d.T || Date.now()).toLocaleTimeString();\n\n          const row = document.createElement('div');\n          row.className = 'liq-item';\n\n          const priceEl = document.createElement('span');\n          priceEl.className = 'liq-price';\n          priceEl.textContent = price.toFixed(2);\n\n          const sideEl = document.createElement('span');\n          sideEl.className = side === 'BUY' ? 'liq-side-buy' : 'liq-side-sell';\n          sideEl.textContent = side;\n\n          const qtyEl = document.createElement('span');\n          qtyEl.className = 'liq-qty';\n          qtyEl.textContent = `${qty.toFixed(3)} @ ${time}`;\n\n          row.appendChild(priceEl);\n          row.appendChild(sideEl);\n          row.appendChild(qtyEl);\n\n          cont.prepend(row);\n          while (cont.children.length > 30) {\n            cont.removeChild(cont.lastChild);\n          }\n        });\n      };\n\n      ws.onerror = () => {\n        const err = document.createElement('div');\n        err.textContent = \"Error WebSocket liquidaciones.\";\n        cont.appendChild(err);\n      };\n    })();\n\n    \/\/ ===============================\n    \/\/  AI\u2011PRO BTC SUPPLIER MODEL\n    \/\/ ===============================\n    function calcularRangosSupplierModel(precios) {\n      const highs = precios.map(p => p.high);\n      const lows = precios.map(p => p.low);\n      const max = Math.max(...highs);\n      const min = Math.min(...lows);\n      const rango = max - min;\n\n      return {\n        max,\n        min,\n        proveedor: max - rango * 0.25,\n        consumidor: min + rango * 0.25,\n        neutralSup: max - rango * 0.50,\n        neutralInf: min + rango * 0.50\n      };\n    }\n\n    function detectarStopHunting(precios) {\n      const zonas = [];\n      precios.forEach((p, i) => {\n        if (i === 0) return;\n        const prev = precios[i - 1];\n\n        if (p.high > prev.high && p.close < prev.high) {\n          zonas.push({ precio: p.high, tipo: \"Stop Hunt Alcista\" });\n        }\n        if (p.low < prev.low && p.close > prev.low) {\n          zonas.push({ precio: p.low, tipo: \"Stop Hunt Bajista\" });\n        }\n      });\n      return zonas;\n    }\n\n    function clasificarNivelSupplierModel(nivel, rangos) {\n      if (nivel >= rangos.proveedor) return \"Proveedor Activo\";\n      if (nivel <= rangos.consumidor) return \"Consumidor Activo\";\n      if (nivel <= rangos.neutralSup && nivel >= rangos.neutralInf) return \"Neutral\";\n      return \"Transici\u00f3n\";\n    }\n\n    function detectarPresion(precios) {\n      if (precios.length < 2) return \"neutral\";\n      const last = precios[precios.length - 1];\n      const prev = precios[precios.length - 2];\n\n      if (last.close > prev.close && last.low > prev.low) return \"bullish\";\n      if (last.close < prev.close && last.high < prev.high) return \"bearish\";\n      return \"neutral\";\n    }\n\n    function generarSupplierAlert(nivel, rangos, presion, intensidad) {\n      if (nivel >= rangos.proveedor && presion === \"bearish\" && intensidad > 0.7) {\n        return \"AI\u2011PRO Supplier Alert: Distribuci\u00f3n institucional en zona PROVEEDOR con liquidaciones intensas.\";\n      }\n      if (nivel <= rangos.consumidor && presion === \"bullish\" && intensidad > 0.7) {\n        return \"AI\u2011PRO Supplier Alert: Absorci\u00f3n fuerte en zona CONSUMIDOR con barrida de liquidez.\";\n      }\n      return null;\n    }\n\n    function interpretarMercado(presion, rangos, precioActual) {\n      let texto = \"\";\n\n      if (presion === \"bullish\") texto += \"Presi\u00f3n alcista detectada. \";\n      if (presion === \"bearish\") texto += \"Presi\u00f3n bajista dominante. \";\n      if (presion === \"neutral\") texto += \"Mercado en equilibrio relativo. \";\n\n      if (precioActual >= rangos.proveedor) {\n        texto += \"El precio se encuentra en ZONA PROVEEDOR: probabilidad de distribuci\u00f3n y venta de liquidez.\";\n      } else if (precioActual <= rangos.consumidor) {\n        texto += \"El precio se encuentra en ZONA CONSUMIDOR: posible absorci\u00f3n y acumulaci\u00f3n de posiciones.\";\n      } else {\n        texto += \"El precio se mueve en zona NEUTRAL \/ TRANSICI\u00d3N.\";\n      }\n\n      return texto;\n    }\n\n    function prediccionSupplierModel(presion, rangos, precioActual, intensidadMedia) {\n      let probRebote = 0;\n      let probCaida = 0;\n\n      if (precioActual <= rangos.consumidor) probRebote += 0.6;\n      if (presion === \"bullish\") probRebote += 0.2;\n\n      if (precioActual >= rangos.proveedor) probCaida += 0.6;\n      if (presion === \"bearish\") probCaida += 0.2;\n\n      const manipulacion = intensidadMedia > 0.6 ? 0.8 : 0.3;\n\n      return {\n        rebote: Math.min(probRebote, 1),\n        caida: Math.min(probCaida, 1),\n        manipulacion\n      };\n    }\n\n    \/\/ ---------- RATIO LONG \/ SHORT ----------\n    async function cargarRatio() {\n      const info = document.getElementById('ratio-info');\n      const barLong = document.getElementById('ratio-long');\n      const barShort = document.getElementById('ratio-short');\n      const labelLong = document.getElementById('ratio-long-label');\n      const labelShort = document.getElementById('ratio-short-label');\n\n      try {\n        const url = `https:\/\/fapi.binance.com\/futures\/data\/globalLongShortAccountRatio?symbol=${SYMBOL}&period=5m&limit=30`;\n        const res = await fetch(url);\n        const data = await res.json();\n        const last = data[data.length - 1];\n\n        const longRatio = parseFloat(last.longAccount);\n        const shortRatio = parseFloat(last.shortAccount);\n        const total = longRatio + shortRatio || 1;\n\n        const longPct = longRatio \/ total * 100;\n        const shortPct = shortRatio \/ total * 100;\n\n        info.textContent = `\u00daltimo dato: ${new Date(last.timestamp).toLocaleTimeString()}`;\n        barLong.style.width = longPct + \"%\";\n        barShort.style.width = shortPct + \"%\";\n\n        labelLong.textContent = `Long ${longPct.toFixed(1)}%`;\n        labelShort.textContent = `Short ${shortPct.toFixed(1)}%`;\n      } catch (e) {\n        info.textContent = \"Error cargando ratio.\";\n      }\n    }\n\n    \/\/ ---------- OPEN INTEREST \u2013 MINI GR\u00c1FICO SVG ----------\n    async function cargarOpenInterest() {\n      const svg = document.getElementById('oi-chart');\n      const legend = document.getElementById('oi-legend');\n\n      try {\n        const url = `https:\/\/fapi.binance.com\/futures\/data\/openInterestHist?symbol=${SYMBOL}&period=5m&limit=40`;\n        const res = await fetch(url);\n        const data = await res.json();\n\n        const values = data.map(d => parseFloat(d.sumOpenInterest));\n        const min = Math.min(...values);\n        const max = Math.max(...values);\n        const w = svg.clientWidth || 300;\n        const h = svg.clientHeight || 120;\n\n        svg.setAttribute('viewBox', `0 0 ${w} ${h}`);\n        svg.innerHTML = \"\";\n\n        const points = values.map((v, i) => {\n          const x = (i \/ (values.length - 1 || 1)) * (w - 10) + 5;\n          const yNorm = (v - min) \/ ((max - min) || 1);\n          const y = h - 10 - yNorm * (h - 20);\n          return `${x},${y}`;\n        }).join(\" \");\n\n        const polyline = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"polyline\");\n        polyline.setAttribute(\"points\", points);\n        polyline.setAttribute(\"fill\", \"none\");\n        polyline.setAttribute(\"stroke\", \"#00d8ff\");\n        polyline.setAttribute(\"stroke-width\", \"2\");\n        svg.appendChild(polyline);\n\n        legend.textContent = `OI min: ${min.toFixed(2)} | OI max: ${max.toFixed(2)} | puntos: ${values.length}`;\n      } catch (e) {\n        legend.textContent = \"Error cargando open interest.\";\n      }\n    }\n\n    \/\/ ---------- MAPA DE LIQUIDACIONES CON INTENSIDAD + SUPPLIER MODEL ----------\n    function colorPorIntensidad(f) {\n      const hue = 220 - 220 * f;\n      const sat = 80;\n      const light = 40 + 20 * (1 - f);\n      return `hsl(${hue}, ${sat}%, ${light}%)`;\n    }\n\n    async function cargarLiquidaciones() {\n      const contenedor = document.getElementById('mapa');\n      const interpretacionEl = document.getElementById('interpretacion');\n      const predEl = document.getElementById('prediccion');\n      const alertaEl = document.getElementById('alerta-supplier');\n      const flechaPresion = document.getElementById('flecha-presion');\n\n      try {\n        const [forceRes, klineRes] = await Promise.all([\n          fetch(`https:\/\/fapi.binance.com\/fapi\/v1\/allForceOrders?symbol=${SYMBOL}&limit=1000`),\n          fetch(`https:\/\/fapi.binance.com\/fapi\/v1\/klines?symbol=${SYMBOL}&interval=15m&limit=100`)\n        ]);\n\n        const data = await forceRes.json();\n        const klines = await klineRes.json();\n\n        const precios = klines.map(k => ({\n          high: parseFloat(k[2]),\n          low: parseFloat(k[3]),\n          close: parseFloat(k[4])\n        }));\n\n        if (!precios.length) {\n          contenedor.textContent = \"Sin datos de velas.\";\n          return;\n        }\n\n        const rangos = calcularRangosSupplierModel(precios);\n        const zonasStops = detectarStopHunting(precios);\n        const presion = detectarPresion(precios);\n        const precioActual = precios[precios.length - 1].close;\n\n        if (presion === \"bullish\") flechaPresion.textContent = \"\u2b06\ufe0f\";\n        else if (presion === \"bearish\") flechaPresion.textContent = \"\u2b07\ufe0f\";\n        else flechaPresion.textContent = \"\u27f7\";\n\n        const niveles = {};\n        data.forEach(liq => {\n          const price = parseFloat(liq.price);\n          const qty = parseFloat(liq.origQty || liq.executedQty || 0);\n          const side = liq.side;\n          const nivel = Math.round(price \/ 50) * 50;\n\n          if (!niveles[nivel]) niveles[nivel] = { volumen: 0, buys: 0, sells: 0 };\n          niveles[nivel].volumen += qty;\n          if (side === \"BUY\") niveles[nivel].buys += qty;\n          if (side === \"SELL\") niveles[nivel].sells += qty;\n        });\n\n        const lista = Object.keys(niveles)\n          .map(p => ({ precio: parseFloat(p), ...niveles[p] }))\n          .sort((a, b) => b.precio - a.precio);\n\n        const maxVol = Math.max(...lista.map(n => n.volumen)) || 1;\n        const intensidadMedia =\n          lista.length ? lista.reduce((acc, n) => acc + n.volumen \/ maxVol, 0) \/ lista.length : 0;\n\n        contenedor.innerHTML = \"\";\n        let alertaGlobal = null;\n\n        lista.forEach(n => {\n          const fila = document.createElement('div');\n          fila.className = 'nivel';\n\n          const precio = document.createElement('div');\n          precio.className = 'precio';\n          precio.textContent = n.precio.toFixed(0);\n\n          const barra = document.createElement('div');\n          barra.className = 'barra';\n          const f = n.volumen \/ maxVol;\n          barra.style.width = (10 + f * 80) + '%';\n          barra.style.background = colorPorIntensidad(f);\n\n          const clasificacion = clasificarNivelSupplierModel(n.precio, rangos);\n          if (clasificacion === \"Proveedor Activo\") fila.classList.add(\"zona-supplier\");\n          if (clasificacion === \"Consumidor Activo\") fila.classList.add(\"zona-consumer\");\n          if (clasificacion === \"Neutral\") fila.classList.add(\"zona-neutral\");\n\n          const info = document.createElement('div');\n          info.className = 'nivel-info';\n          info.textContent = `${clasificacion} | Vol: ${n.volumen.toFixed(3)} | B: ${n.buys.toFixed(3)} | S: ${n.sells.toFixed(3)}`;\n          fila.appendChild(precio);\n          fila.appendChild(barra);\n          fila.appendChild(info);\n\n          zonasStops.forEach(z => {\n            if (Math.abs(z.precio - n.precio) < 30) {\n              const stopTag = document.createElement('div');\n              stopTag.className = 'nivel-info';\n              stopTag.style.color = '#ff6b6b';\n              stopTag.textContent = z.tipo;\n              fila.appendChild(stopTag);\n            }\n          });\n\n          const alerta = generarSupplierAlert(n.precio, rangos, presion, f);\n          if (alerta && !alertaGlobal) alertaGlobal = alerta;\n\n          contenedor.appendChild(fila);\n        });\n\n        const textoInterpretacion = interpretarMercado(presion, rangos, precioActual);\n        interpretacionEl.textContent = textoInterpretacion;\n\n        const pred = prediccionSupplierModel(presion, rangos, precioActual, intensidadMedia);\n        predEl.innerHTML =\n          `Rebote: ${(pred.rebote * 100).toFixed(1)}%<br>` +\n          `Ca\u00edda: ${(pred.caida * 100).toFixed(1)}%<br>` +\n          `Manipulaci\u00f3n: ${(pred.manipulacion * 100).toFixed(1)}%`;\n\n        if (alertaGlobal) {\n          alertaEl.textContent = alertaGlobal;\n        } else {\n          alertaEl.textContent = \"Sin alertas cr\u00edticas en este momento.\";\n        }\n\n      } catch (e) {\n        contenedor.textContent = \"Error cargando liquidaciones.\";\n      }\n    }\n\n    function refrescarTodo() {\n      cargarRatio();\n      cargarOpenInterest();\n      cargarLiquidaciones();\n    }\n\n    refrescarTodo();\n    setInterval(refrescarTodo, 7000);\n  <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>AI-PRO Mapa de Liquidaciones AI-PRO Mapa de Liquidaciones \u2013 BTCUSDT Precio en vivo (Binance Futures) &#8212; \u27f7 24h: &#8212; Ratio global Long \/ Short (cuentas) Cargando&#8230; Long &#8211;% Short &#8211;% Open Interest \u2013 mini gr\u00e1fico Cargando open interest&#8230; Mapa de liquidaciones p\u00fablicas por niveles Cargando&#8230; Liquidaciones en vivo (WebSocket) Lectura AI-PRO Esperando datos&#8230; Predicci\u00f3n AI-PRO<\/p>","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-5103","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/pages\/5103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/comments?post=5103"}],"version-history":[{"count":9,"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/pages\/5103\/revisions"}],"predecessor-version":[{"id":5112,"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/pages\/5103\/revisions\/5112"}],"wp:attachment":[{"href":"https:\/\/bulltradebot.com\/en\/wp-json\/wp\/v2\/media?parent=5103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}