<!DOCTYPE html>
<html lang="ru"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Order-Flow — плоский vs взвешенный imbalance</title>
<style>
:root{--bg:#0a0e17;--card:rgba(255,255,255,.04);--border:rgba(255,255,255,.09);
--txt:#e6edf3;--muted:#8b98a9;--green:#21d07a;--red:#f6465d;--blue:#3b82f6;--amber:#f59e0b}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
background:radial-gradient(1200px 600px at 80% -10%,rgba(33,208,122,.10),transparent),
radial-gradient(900px 500px at 0% 0%,rgba(59,130,246,.08),transparent),var(--bg);
color:var(--txt);min-height:100vh;padding:22px 14px;line-height:1.45}
.wrap{max-width:1000px;margin:0 auto}
header{margin-bottom:12px}
h1{font-size:21px;font-weight:700;letter-spacing:-.5px}
h1 .em{background:linear-gradient(90deg,#10b981,var(--blue));-webkit-background-clip:text;background-clip:text;color:transparent}
.sub{color:var(--muted);font-size:12px;margin-top:5px}
.glass{background:var(--card);border:1px solid var(--border);border-radius:13px}
.warn{padding:11px 15px;margin-bottom:12px;border-left:3px solid var(--amber);font-size:11.5px;background:rgba(245,158,11,.06)}
.warn b{color:var(--amber)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}
.section{padding:14px 16px}
.section h2{font-size:13.5px;font-weight:600;margin-bottom:2px}
.section .h{font-size:10.5px;color:var(--muted);margin-bottom:10px}
table{width:100%;border-collapse:collapse;font-size:12px}
th,td{text-align:right;padding:8px 6px}
th:first-child,td:first-child{text-align:left}
th{color:var(--muted);font-weight:500;font-size:10px;text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--border)}
tr+tr td{border-top:1px solid rgba(255,255,255,.045)}
td{font-variant-numeric:tabular-nums}
tr.top{background:rgba(33,208,122,.12)}
tr.top td:first-child{font-weight:700;color:var(--green)}
.pos{color:var(--green)}.neg{color:var(--red)}.mut{color:var(--muted)}
.verdict{padding:14px 16px;border-left:3px solid var(--green);font-size:12px}
.verdict b{color:var(--green)}
.foot{color:var(--muted);font-size:10px;margin-top:7px;text-align:center}
@media(max-width:720px){.grid2{grid-template-columns:1fr}}
</style></head>
<body><div class="wrap">
<header>
<h1>⚖️ Imbalance: <span class="em">плоский vs взвешенный по расстоянию</span></h1>
<div class="sub" id="sub"></div>
</header>
<div class="warn glass" id="warn"></div>
<div class="grid2">
<div class="section glass">
<h2>📊 Плоский imbalance <span class="mut" style="font-weight:400">(текущий)</span></h2>
<div class="h">все стены ±3% с равным весом. Квартили по силе сигнала.</div>
<table id="t_flat"><thead><tr><th>Квартиль</th><th>n</th><th>WR</th><th>net/сд.</th></tr></thead><tbody></tbody></table>
</div>
<div class="section glass">
<h2>🎯 Взвешенный imbalance <span class="mut" style="font-weight:400">(новый)</span></h2>
<div class="h">вес стены = 1−дистанция/3% (ближе = весомее).</div>
<table id="t_wt"><thead><tr><th>Квартиль</th><th>n</th><th>WR</th><th>net/сд.</th></tr></thead><tbody></tbody></table>
</div>
</div>
<div class="verdict glass" id="verdict"></div>
<div class="foot" id="foot"></div>
</div>
<script>
const D = {"n": 192, "tp": 1.5, "sl": 0.5, "fee": 0.036, "flat": [{"q": "Q1", "n": 40, "wr": 35.0, "net": -0.029, "mlo": 0.01, "mhi": 0.36}, {"q": "Q2", "n": 40, "wr": 37.5, "net": -0.003, "mlo": 0.36, "mhi": 0.39}, {"q": "Q3", "n": 40, "wr": 37.5, "net": 0.03, "mlo": 0.39, "mhi": 0.45}, {"q": "Q4", "n": 42, "wr": 42.9, "net": 0.086, "mlo": 0.45, "mhi": 1.0}], "wt": [{"q": "Q1", "n": 40, "wr": 35.0, "net": 0.005, "mlo": 0.04, "mhi": 0.33}, {"q": "Q2", "n": 40, "wr": 32.5, "net": -0.15, "mlo": 0.33, "mhi": 0.38}, {"q": "Q3", "n": 40, "wr": 40.0, "net": 0.042, "mlo": 0.38, "mhi": 0.48}, {"q": "Q4", "n": 42, "wr": 50.0, "net": 0.278, "mlo": 0.48, "mhi": 1.0}]};
const pct=(v)=>v==null?'—':(v>0?'+':'')+v.toFixed(3)+'%';
const sgn=v=>v>0?'pos':v<0?'neg':'mut';
function tbl(id,rows){
document.getElementById(id).innerHTML=
`<thead><tr><th>Квартиль силы</th><th>n</th><th>WR</th><th>net/сд.</th></tr></thead><tbody>`+
rows.map((r,i)=>`<tr class="${i===rows.length-1?'top':''}"><td>${r.q}${i===rows.length-1?' 🔝':''} <span class="mut" style="font-weight:400">\|${r.mlo}-${r.mhi}\|</span></td><td class="mut">${r.n}</td><td>${r.wr}%</td><td class="${sgn(r.net)}" style="font-weight:700">${pct(r.net)}</td></tr>`).join('')+`</tbody>`;
}
document.getElementById('sub').textContent =
`${D.n} сигналов (4ч-окно depth.db) · TP ${D.tp}% / SL ${D.sl}% · hold 10м · maker ${D.fee}% · квартиль по \|imbalance\|, Q4 = сильнейшие`;
document.getElementById('warn').innerHTML =
`⚠️ <b>n=${D.n} (только 4ч-окно — нужен сам стакан, у старых сигналов удалён).</b> Сравнение честное (те же сигналы, тот же forward). Смотрим на ТОП-квартиль (Q4) — именно сильные сигналы мы бы и торговали.`;
tbl('t_flat',D.flat);
tbl('t_wt',D.wt);
const fq=D.flat[D.flat.length-1], wq=D.wt[D.wt.length-1];
document.getElementById('verdict').innerHTML =
`<b>🎯 Взвешивание по расстоянию УЛУЧШАЕТ сильные сигналы:</b><br>`+
`• Топ-квартиль (Q4, сильнейшие): плоский <b>${pct(fq.net)}</b> (WR ${fq.wr}%) → взвешенный <b>${pct(wq.net)}</b> (WR ${wq.wr}%). Рост в ~3× по net, WR 43→50%.<br>`+
`• Логика подтвердилась: когда перекос создают <b>близкие к цене стены</b> (а не дальние на краю ±3%), сигнал реально предсказывает движение. Дальние стены = шум.<br>`+
`• Средние квартили шумят (Q2 взвеш. даже −0.15) — но это и есть «слабые сигналы», их мы отбрасываем.<br>`+
`<b>Вывод:</b> взвешенная метрика — <b>лучший кандидат для нового confidence</b>. Стоит переписать формулу imbalance в сканере на взвешенную + гейтить по верхнему квартилю. ⚠️ n=192/4ч — подтвердить на большем объёме (нужен архив стакана ИЛИ накопить ещё).`;
document.getElementById('foot').textContent='Обе метрики из одного снапшота depth.db · forward path-resolved · maker 0.036% · Бендер';
</script>
</body></html>