<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Order-Flow — параметрический свип</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(59,130,246,.10),transparent),
radial-gradient(900px 500px at 0% 0%,rgba(139,92,246,.08),transparent),var(--bg);
color:var(--txt);min-height:100vh;padding:24px 16px;line-height:1.5}
.wrap{max-width:1060px;margin:0 auto}
header{margin-bottom:16px}
h1{font-size:23px;font-weight:700;letter-spacing:-.5px}
h1 .em{background:linear-gradient(90deg,var(--blue),var(--green));-webkit-background-clip:text;background-clip:text;color:transparent}
.sub{color:var(--muted);font-size:13px;margin-top:6px}
.glass{background:var(--card);border:1px solid var(--border);border-radius:16px;backdrop-filter:blur(12px)}
.warn{padding:13px 16px;margin-bottom:16px;border-left:3px solid var(--amber);font-size:12.5px;background:rgba(245,158,11,.06)}
.warn b{color:var(--amber)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
.panel{padding:16px 18px}
.panel h2{font-size:14px;font-weight:600;margin-bottom:4px}
.panel .h{font-size:11.5px;color:var(--muted);margin-bottom:10px}
table{width:100%;border-collapse:collapse;font-size:12.5px}
th,td{text-align:right;padding:7px 6px}
th:first-child,td:first-child{text-align:left}
th{color:var(--muted);font-weight:500;font-size:10.5px;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.best{background:rgba(33,208,122,.12)}
tr.best td:first-child{font-weight:700;color:var(--green)}
.pos{color:var(--green)}.neg{color:var(--red)}.mut{color:var(--muted)}
.verdict{padding:16px 18px;margin-bottom:16px;border-left:3px solid var(--green);font-size:13px}
.verdict b{color:var(--green)}
.foot{color:var(--muted);font-size:11px;margin-top:6px;text-align:center}
@media(max-width:720px){.grid2{grid-template-columns:1fr}h1{font-size:18px}}
</style>
</head>
<body>
<div class="wrap">
<header>
<h1>🔬 Order-Flow — <span class="em">параметрический свип</span></h1>
<div class="sub">Дисбаланс стакана → направление → path-resolved TP/SL. Что важно, а что нет. net P&L на сделку, %.</div>
</header>
<div class="warn glass" id="warn"></div>
<div class="grid2">
<div class="panel glass">
<h2>⏱ Время удержания</h2><div class="h">thresh 0.35 · 0.8/0.4 · все символы</div>
<table id="t_hold"></table>
</div>
<div class="panel glass">
<h2>🎯 Брекет TP/SL</h2><div class="h">thresh 0.35 · hold 5мин · все</div>
<table id="t_bracket"></table>
</div>
<div class="panel glass">
<h2>📏 Порог дисбаланса</h2><div class="h">0.8/0.4 · hold 5мин · все</div>
<table id="t_thresh"></table>
</div>
<div class="panel glass">
<h2>🔁 Подтверждение сигнала</h2><div class="h">сколько снапшотов подряд держится дисбаланс</div>
<table id="t_persist"></table>
</div>
</div>
<div class="panel glass" style="margin-bottom:16px">
<h2>🪙 Мажоры vs все символы</h2><div class="h">thresh 0.35 · 0.8/0.4 · hold 5мин</div>
<table id="t_symset"></table>
</div>
<div class="verdict glass" id="verdict"></div>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA = {"fee": 0.1, "hold": [{"hold": 1, "n": 823, "wr": 30.4, "net_taker": -0.0455, "net_maker": 0.0145}, {"hold": 2, "n": 582, "wr": 43.0, "net_taker": -0.0082, "net_maker": 0.0518}, {"hold": 3, "n": 504, "wr": 49.4, "net_taker": 0.0137, "net_maker": 0.0737}, {"hold": 5, "n": 432, "wr": 49.3, "net_taker": 0.0031, "net_maker": 0.0631}, {"hold": 10, "n": 378, "wr": 47.4, "net_taker": 0.0163, "net_maker": 0.0763}, {"hold": 15, "n": 362, "wr": 44.8, "net_taker": 0.009, "net_maker": 0.069}], "persist": [{"p": 1, "n": 432, "wr": 49.3, "net_taker": 0.0031, "net_maker": 0.0631}, {"p": 2, "n": 416, "wr": 48.6, "net_taker": -0.0079, "net_maker": 0.0521}, {"p": 3, "n": 393, "wr": 47.8, "net_taker": -0.0159, "net_maker": 0.0441}], "symset": [{"set": "\u0412\u0441\u0435 43", "n": 432, "wr": 49.3, "net_taker": 0.0031, "net_maker": 0.0631}, {"set": "\u041c\u0430\u0436\u043e\u0440\u044b", "n": 41, "wr": 58.5, "net_taker": -0.0645, "net_maker": -0.0045}], "bracket": [{"tp": 0.4, "sl": 0.4, "n": 464, "wr": 51.7, "net_taker": -0.0883, "net_maker": -0.0283}, {"tp": 0.6, "sl": 0.3, "n": 457, "wr": 49.7, "net_taker": -0.0071, "net_maker": 0.0529}, {"tp": 0.6, "sl": 0.4, "n": 440, "wr": 51.4, "net_taker": -0.0329, "net_maker": 0.0271}, {"tp": 0.8, "sl": 0.4, "n": 432, "wr": 49.3, "net_taker": 0.0031, "net_maker": 0.0631}, {"tp": 1.0, "sl": 0.5, "n": 404, "wr": 48.3, "net_taker": 0.0113, "net_maker": 0.0713}, {"tp": 1.2, "sl": 0.6, "n": 388, "wr": 49.0, "net_taker": 0.0319, "net_maker": 0.0919}, {"tp": 1.5, "sl": 0.5, "n": 391, "wr": 47.1, "net_taker": 0.0902, "net_maker": 0.1502}], "thresh": [{"th": 0.15, "n": 1490, "wr": 48.9, "net_taker": -0.029, "net_maker": 0.031}, {"th": 0.25, "n": 789, "wr": 49.0, "net_taker": -0.0199, "net_maker": 0.0401}, {"th": 0.35, "n": 432, "wr": 49.3, "net_taker": 0.0031, "net_maker": 0.0631}, {"th": 0.45, "n": 249, "wr": 48.6, "net_taker": 0.0003, "net_maker": 0.0603}, {"th": 0.55, "n": 132, "wr": 46.2, "net_taker": 0.001, "net_maker": 0.061}, {"th": 0.65, "n": 68, "wr": 52.9, "net_taker": 0.071, "net_maker": 0.131}]};
const pct=(v)=>(v>0?'+':'')+v.toFixed(3)+'%';
const sgn=v=>v>0?'pos':v<0?'neg':'mut';
function render(elId, rows, firstKey, firstLabel, bestFn){
const best=bestFn?rows.reduce((a,b)=>bestFn(b)>bestFn(a)?b:a):null;
document.getElementById(elId).innerHTML =
`<thead><tr><th>${firstLabel}</th><th>Сделок</th><th>WR</th><th>taker</th><th>maker</th></tr></thead><tbody>`+
rows.map(r=>`<tr class="${r===best?'best':''}">
<td>${r[firstKey]}</td><td>${r.n}</td><td>${r.wr}%</td>
<td class="${sgn(r.net_taker)}">${pct(r.net_taker)}</td>
<td class="${sgn(r.net_maker)}" style="font-weight:700">${pct(r.net_maker)}</td>
</tr>`).join('')+`</tbody>`;
}
const bm=r=>r.net_maker;
render('t_hold', DATA.hold.map(r=>({...r,hold:r.hold+'мин'})), 'hold','Удержание', bm);
render('t_bracket', DATA.bracket.map(r=>({...r,b:r.tp+'/'+r.sl+' ('+(r.tp/r.sl).toFixed(1)+':1)'})), 'b','Брекет', bm);
render('t_thresh', DATA.thresh.map(r=>({...r,th:'≥'+r.th})), 'th','Порог', bm);
render('t_persist', DATA.persist.map(r=>({...r,p:r.p+(r.p===1?' (моментальн.)':' снапшота')})), 'p','Подтвержд.', bm);
render('t_symset', DATA.symset, 'set','Набор', bm);
const bestB=DATA.bracket.reduce((a,b)=>b.net_maker>a.net_maker?b:a);
document.getElementById('warn').innerHTML =
`⚠️ <b>Всё ещё ~4ч данных</b> (depth.db rolling, окно сдвинулось с прошлого прогона). Это <b>оптимизация параметров</b>, риск переподгонки высок на таком объёме. Цель — понять КАКИЕ ручки важны, а не финальные цифры. Нужен датасет на недели.`;
document.getElementById('verdict').innerHTML =
`<b>Что выяснили (какие параметры важны):</b><br>`+
`• <b>Брекет — главная ручка.</b> Чем асимметричнее, тем лучше: ${bestB.tp}/${bestB.sl} (${(bestB.tp/bestB.sl).toFixed(0)}:1) = <b>${pct(bestB.net_maker)}/сделку</b> maker. Тот же вывод 4-й раз подряд.<br>`+
`• <b>Удержание:</b> 3–10 мин — оптимум. 1 мин слишком рано (WR 30%), >15 мин выдыхается.<br>`+
`• <b>Подтверждение НЕ помогает:</b> моментальный вход лучше — эдж дисбаланса быстро затухает, ждать = терять.<br>`+
`• <b>Порог:</b> 0.35 — баланс кол-ва и качества; 0.65 даёт выше эдж, но мало сделок.<br>`+
`• <b>Эдж в альтах, НЕ в мажорах:</b> мажоры в минусе (книги эффективнее, перевес уже выторгован).<br>`+
`<b>Оптимальный конфиг:</b> дисбаланс ≥0.35 → вход лимиткой (maker) → TP 1.5% / SL 0.5% → выход за ~5-10 мин, по альтам. ⚠️ Taker почти всё убивает — <b>maker-исполнение обязательно</b>.`;
document.getElementById('foot').textContent='Источник: depth.db (live) · path-resolved 10с · Бендер';
</script>
</body>
</html>