<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VPIN + OI Divergence — поиск R:R</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:24px 16px;line-height:1.5}
.wrap{max-width:1000px;margin:0 auto}
header{margin-bottom:16px}
h1{font-size:24px;font-weight:700;letter-spacing:-.5px}
h1 .em{background:linear-gradient(90deg,var(--green),var(--blue));-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:14px 18px;margin-bottom:18px;border-left:3px solid var(--amber);font-size:13px;background:rgba(245,158,11,.06)}
.warn b{color:var(--amber)}
.section{padding:20px;margin-bottom:18px}
.section h2{font-size:15px;font-weight:600;margin-bottom:6px}
.section .hint{font-size:12px;color:var(--muted);margin-bottom:12px}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:right;padding:9px 8px}
th:first-child,td:first-child{text-align:left}
th{color:var(--muted);font-weight:500;font-size:11px;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,.10)}
tr.best td:first-child{font-weight:700;color:var(--green)}
.pos{color:var(--green)}.neg{color:var(--red)}.mut{color:var(--muted)}
.tag{font-size:11px;font-weight:700;padding:2px 7px;border-radius:6px;background:rgba(33,208,122,.18);color:var(--green)}
.verdict{padding:16px 18px;margin-bottom:18px;border-left:3px solid var(--green);font-size:13.5px}
.verdict b{color:var(--green)}
.cap{font-size:12px;color:var(--muted);margin-top:10px;line-height:1.6}
.foot{color:var(--muted);font-size:11.5px;margin-top:8px;text-align:center}
.two{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:720px){.two{grid-template-columns:1fr}h1{font-size:19px}}
</style>
</head>
<body>
<div class="wrap">
<header>
<h1>🎯 Только сильные типы: <span class="em">VPIN + OI Divergence</span></h1>
<div class="sub" id="sub"></div>
</header>
<div class="warn glass" id="warn"></div>
<div class="section glass">
<h2>📊 Поиск лучшего R:R (объединённо, net после комиссии)</h2>
<div class="hint">net P&L на сделку, %. Строки отсортированы по реалист. сценарию. 🟢 = лучший.</div>
<table id="grid"><thead><tr>
<th>Брекет TP/SL</th><th>R:R</th><th>WR</th>
<th>🔴 Пессим.</th><th>⚪ Реалист.</th><th>🟢 Оптим.</th><th>Σ всего</th>
</tr></thead><tbody></tbody></table>
<div class="cap" id="gridNote"></div>
</div>
<div class="two">
<div class="section glass">
<h2>☣️ VPIN <span class="mut" style="font-weight:400" id="nvpin"></span></h2>
<table id="gv"><thead><tr><th>TP/SL</th><th>WR</th><th>Реалист.</th></tr></thead><tbody></tbody></table>
</div>
<div class="section glass">
<h2>🔀 OI Divergence <span class="mut" style="font-weight:400" id="noi"></span></h2>
<table id="go"><thead><tr><th>TP/SL</th><th>WR</th><th>Реалист.</th></tr></thead><tbody></tbody></table>
</div>
</div>
<div class="verdict glass" id="verdict"></div>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA = {"n": 120, "n_vpin": 49, "n_oidiv": 71, "grid": [{"tp": 0.5, "sl": 0.5, "rr": 1.0, "pess": -0.0504, "mid": 0.0455, "opt": 0.1413, "wr": 56.7, "tot_mid": 5.5}, {"tp": 1, "sl": 1, "rr": 1.0, "pess": -0.0366, "mid": 0.0884, "opt": 0.2134, "wr": 55.0, "tot_mid": 10.6}, {"tp": 1.5, "sl": 1.5, "rr": 1.0, "pess": -0.0313, "mid": 0.1437, "opt": 0.3187, "wr": 55.0, "tot_mid": 17.2}, {"tp": 1, "sl": 0.5, "rr": 2.0, "pess": 0.0813, "mid": 0.1563, "opt": 0.3063, "wr": 52.5, "tot_mid": 18.8}, {"tp": 1.5, "sl": 1, "rr": 1.5, "pess": 0.111, "mid": 0.2276, "opt": 0.4027, "wr": 55.0, "tot_mid": 27.3}, {"tp": 2, "sl": 1, "rr": 2.0, "pess": 0.2593, "mid": 0.3677, "opt": 0.5843, "wr": 55.0, "tot_mid": 44.1}, {"tp": 2, "sl": 1.5, "rr": 1.33, "pess": 0.1171, "mid": 0.2796, "opt": 0.4962, "wr": 55.0, "tot_mid": 33.5}, {"tp": 3, "sl": 1.5, "rr": 2.0, "pess": 0.3951, "mid": 0.5451, "opt": 0.8451, "wr": 55.0, "tot_mid": 65.4}, {"tp": 2, "sl": 2, "rr": 1.0, "pess": 0.0187, "mid": 0.2187, "opt": 0.4187, "wr": 55.8, "tot_mid": 26.2}, {"tp": 3, "sl": 2, "rr": 1.5, "pess": 0.3051, "mid": 0.4885, "opt": 0.7635, "wr": 55.8, "tot_mid": 58.6}], "grid_vpin": [{"tp": 0.5, "sl": 0.5, "pess": 0.0801, "mid": 0.1311, "opt": 0.1821, "wr": 73.5, "tot_mid": 6.4}, {"tp": 1, "sl": 1, "pess": 0.0811, "mid": 0.0811, "opt": 0.0811, "wr": 65.3, "tot_mid": 4.0}, {"tp": 1.5, "sl": 1.5, "pess": 0.081, "mid": 0.081, "opt": 0.081, "wr": 65.3, "tot_mid": 4.0}, {"tp": 1, "sl": 0.5, "pess": 0.0841, "mid": 0.0943, "opt": 0.1147, "wr": 63.3, "tot_mid": 4.6}, {"tp": 1.5, "sl": 1, "pess": 0.1058, "mid": 0.1058, "opt": 0.1058, "wr": 65.3, "tot_mid": 5.2}, {"tp": 2, "sl": 1, "pess": 0.1324, "mid": 0.1324, "opt": 0.1324, "wr": 65.3, "tot_mid": 6.5}, {"tp": 2, "sl": 1.5, "pess": 0.1076, "mid": 0.1076, "opt": 0.1076, "wr": 65.3, "tot_mid": 5.3}, {"tp": 3, "sl": 1.5, "pess": 0.1239, "mid": 0.1239, "opt": 0.1239, "wr": 65.3, "tot_mid": 6.1}, {"tp": 2, "sl": 2, "pess": 0.1219, "mid": 0.1219, "opt": 0.1219, "wr": 65.3, "tot_mid": 6.0}, {"tp": 3, "sl": 2, "pess": 0.1381, "mid": 0.1381, "opt": 0.1381, "wr": 65.3, "tot_mid": 6.8}], "grid_oidiv": [{"tp": 0.5, "sl": 0.5, "pess": -0.1404, "mid": -0.0137, "opt": 0.1131, "wr": 45.1, "tot_mid": -1.0}, {"tp": 1, "sl": 1, "pess": -0.1178, "mid": 0.0934, "opt": 0.3047, "wr": 47.9, "tot_mid": 6.6}, {"tp": 1.5, "sl": 1.5, "pess": -0.1088, "mid": 0.187, "opt": 0.4828, "wr": 47.9, "tot_mid": 13.3}, {"tp": 1, "sl": 0.5, "pess": 0.0794, "mid": 0.1991, "opt": 0.4385, "wr": 45.1, "tot_mid": 14.1}, {"tp": 1.5, "sl": 1, "pess": 0.1146, "mid": 0.3117, "opt": 0.6075, "wr": 47.9, "tot_mid": 22.1}, {"tp": 2, "sl": 1, "pess": 0.347, "mid": 0.5301, "opt": 0.8963, "wr": 47.9, "tot_mid": 37.6}, {"tp": 2, "sl": 1.5, "pess": 0.1236, "mid": 0.3983, "opt": 0.7645, "wr": 47.9, "tot_mid": 28.3}, {"tp": 3, "sl": 1.5, "pess": 0.5824, "mid": 0.8359, "opt": 1.3429, "wr": 47.9, "tot_mid": 59.3}, {"tp": 2, "sl": 2, "pess": -0.0525, "mid": 0.2856, "opt": 0.6236, "wr": 49.3, "tot_mid": 20.3}, {"tp": 3, "sl": 2, "pess": 0.4204, "mid": 0.7302, "opt": 1.195, "wr": 49.3, "tot_mid": 51.8}]};
const pct = (v,d=2)=>(v>0?'+':'')+v.toFixed(d)+'%';
const sgn = v=>v>0?'pos':v<0?'neg':'mut';
document.getElementById('sub').textContent = `${DATA.n} сделок · период тот же · комиссия 0.1% round-trip · поиск по сетке брекетов`;
document.getElementById('warn').innerHTML =
`⚠️ <b>Выборка маленькая:</b> всего ${DATA.n} сделок (VPIN ${DATA.n_vpin} + OI Div ${DATA.n_oidiv}). `+
`Эдж OI Divergence держится на нескольких крупных движениях (жирные хвосты). На ${DATA.n_oidiv} сделках это <b>статистически шумно</b> — может быть и реальный перевес, и везение. Нужен форвард-тест на свежих данных, прежде чем доверять деньги.`;
// combined grid, sorted by mid desc
const g=[...DATA.grid].sort((a,b)=>b.mid-a.mid);
const best=g[0];
document.querySelector('#grid tbody').innerHTML = g.map(r=>{
const isBest = r.tp===best.tp && r.sl===best.sl;
return `<tr class="${isBest?'best':''}">
<td>${r.tp}% / ${r.sl}% ${isBest?'<span class="tag">BEST</span>':''}</td>
<td class="mut">${r.rr}:1</td>
<td>${r.wr}%</td>
<td class="${sgn(r.pess)}">${pct(r.pess)}</td>
<td class="${sgn(r.mid)}" style="font-weight:700">${pct(r.mid)}</td>
<td class="${sgn(r.opt)}">${pct(r.opt)}</td>
<td class="${sgn(r.tot_mid)}">${pct(r.tot_mid,0)}</td>
</tr>`;
}).join('');
document.getElementById('gridNote').innerHTML =
'📈 Чёткий тренд: чем <b>шире тейк относительно стопа</b> (асимметрия), тем выше матожидание. Симметричные 0.5/0.5 и 1/1 — почти ноль; асимметрия 2:1 (3%/1.5%) — лучший результат, плюсовой даже в пессимистичном сценарии.';
document.getElementById('nvpin').textContent = `· ${DATA.n_vpin} сделок`;
document.getElementById('noi').textContent = `· ${DATA.n_oidiv} сделок`;
const mini=(rows,el)=>{document.querySelector(el+' tbody').innerHTML=rows.map(r=>
`<tr><td>${r.tp}/${r.sl}</td><td>${r.wr}%</td><td class="${sgn(r.mid)}" style="font-weight:600">${pct(r.mid)}</td></tr>`).join('')};
mini([...DATA.grid_vpin].sort((a,b)=>b.mid-a.mid),'#gv');
mini([...DATA.grid_oidiv].sort((a,b)=>b.mid-a.mid),'#go');
document.getElementById('verdict').innerHTML =
`<b>Вывод:</b> эдж есть и он направлен — <b>широкий тейк + узкий стоп</b> (asymmetry, «дать прибыли течь»). `+
`Лучший брекет <b>3% / 1.5% (R:R 2:1)</b>: ${pct(best.mid)}/сделку реалистично, ${pct(best.pess)} даже в худшем сценарии, WR ${best.wr}%. `+
`☣️ VPIN — стабильный, но мелкий (высокий WR 65-73%, эдж ~+0.13%). 🔀 OI Divergence — главный драйвер (жирные победы), но и главный источник шума. `+
`<b>Что это значит:</b> направление верное (селекция + асимметрия), но НЕ запускать на реальные деньги без форвард-теста — выборка мала.`;
document.getElementById('foot').textContent =
'Метод: TP=mfe≥X, SL=mae≤−Y (до 1д), «пилы» = диапазон сценариев. Источник: signal_log · Бендер';
</script>
</body>
</html>