← Back
<!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(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:1080px;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:13px;font-weight:600;margin-bottom:2px}
  .section .h{font-size:10.5px;color:var(--muted);margin-bottom:10px}
  .hm{width:100%;border-collapse:separate;border-spacing:4px}
  .hm th{color:var(--muted);font-size:10px;font-weight:500;padding:2px}
  .hm td{text-align:center;padding:10px 4px;border-radius:7px;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}
  .hm td.lbl{background:none!important;color:var(--muted);font-weight:600;text-align:right;font-size:10.5px}
  .axis{font-size:9.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.3px;margin-bottom:2px}
  .verdict{padding:14px 16px;border-left:3px solid var(--amber);font-size:12px}
  .verdict b{color:var(--amber)}
  .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>📊 Order-Flow — <span class="em">хитмапы на ВСЕЙ выборке</span></h1>
    <div class="sub" id="sub"></div>
  </header>

  <div class="warn glass" id="warn"></div>

  <div class="section glass" style="margin-bottom:12px"><h2>🎚 Confidence × TP <span class="mut" style="font-weight:400">— ключевая</span></h2><div class="h">SL 0.5 · вся выборка через mfe/mae</div><div id="hm_conftp"></div></div>

  <div class="grid2">
    <div class="section glass"><h2>🎯 TP × SL</h2><div class="h">все conf</div><div id="hm_tpsl"></div></div>
    <div class="section glass"><h2>🎚 Confidence × SL</h2><div class="h">TP 1.5</div><div id="hm_confsl"></div></div>
  </div>

  <div class="verdict glass" id="verdict"></div>
  <div class="foot" id="foot"></div>
</div>

<script>
const D = {"fee": 0.036, "n": 796, "method": "mfe/mae (\u0432\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430, \u0431\u0435\u0437 \u0442\u0430\u0439\u043c-\u0441\u0442\u043e\u043f\u0430)", "tp_sl": {"rows": [0.5, 0.8, 1.0, 1.5, 2.0, 3.0], "cols": [0.3, 0.5, 0.8, 1.0], "cells": [[-0.022, -0.033, -0.048, -0.055], [-0.009, -0.024, -0.044, -0.053], [-0.003, -0.022, -0.048, -0.06], [0.014, -0.017, -0.054, -0.071], [0.028, -0.009, -0.053, -0.072], [0.018, -0.031, -0.099, -0.129]]}, "conf_tp": {"rows": ["50-59", "60-69", "70-79", "80+"], "cols": [0.5, 0.8, 1.0, 1.5, 2.0, 3.0], "cells": [[-0.038, -0.027, -0.026, -0.019, -0.012, -0.047], [-0.027, -0.041, -0.049, -0.07, -0.083, -0.104], [-0.02, -0.017, -0.005, -0.02, -0.005, 0.026], [0.073, 0.129, 0.181, 0.312, 0.442, 0.703]]}, "conf_sl": {"rows": ["50-59", "60-69", "70-79", "80+"], "cols": [0.3, 0.5, 0.8, 1.0], "cells": [[0.01, -0.019, -0.059, -0.076], [-0.028, -0.07, -0.107, -0.113], [0.011, -0.02, -0.02, -0.052], [0.329, 0.312, 0.286, 0.268]]}, "conf_n": {"50-59": 624, "60-69": 117, "70-79": 32, "80+": 23}};
const pct=(v)=>v==null?'—':(v>0?'+':'')+v.toFixed(2);
const all=[];['tp_sl','conf_tp','conf_sl'].forEach(g=>D[g].cells.forEach(r=>r.forEach(v=>{if(v!=null)all.push(v)})));
const mn=Math.min(...all),mx=Math.max(...all);
const col=v=>{if(v==null)return 'rgba(255,255,255,.03)';const t=(v-mn)/(mx-mn||1);
  const r=Math.round(150-t*120),g=Math.round(40+t*170),b=90;return `rgba(${r},${g},${b},${0.22+t*0.6})`};
function draw(id,G,rowLbl,colLbl,rowFmt,colFmt,nrow){
  let h=`<div class="axis">столбцы: ${colLbl}</div><table class="hm"><tr><td class="lbl">${rowLbl} ↓</td>`+
    G.cols.map(c=>`<th>${colFmt(c)}</th>`).join('')+'</tr>';
  G.cells.forEach((row,i)=>{
    const lbl=nrow?`${rowFmt(G.rows[i])} <span style="opacity:.6;font-weight:400">n${nrow[G.rows[i]]||''}</span>`:rowFmt(G.rows[i]);
    h+=`<tr><td class="lbl">${lbl}</td>`+row.map(v=>`<td style="background:${col(v)}">${pct(v)}</td>`).join('')+'</tr>';
  });
  document.getElementById(id).innerHTML=h+'</table>';
}
document.getElementById('sub').textContent =
  `${D.n} сигналов (вся выборка) · net P&L/сделку % (maker ${D.fee}%) · метод: mfe/mae · conf-n: 50-59→${D.conf_n['50-59']} / 60-69→${D.conf_n['60-69']} / 70-79→${D.conf_n['70-79']} / 80+→${D.conf_n['80+']}`;
document.getElementById('warn').innerHTML =
  `⚠️ <b>Метод mfe/mae = TP/SL засчитан если цена дошла КОГДА-ЛИБО за трек (до ~1д), НЕ за 30 мин.</b> Значит TP-достижение тут ЗАВЫШЕНО vs реального скальпа — это «качество направления сигнала», а не точный P&L. «Оба коснулись» → 0 (консервативно). Зато выборка большая (${D.n}) и честная по режимам.`;

draw('hm_conftp',D.conf_tp,'Conf','TP %',v=>v,v=>v+'%',D.conf_n);
draw('hm_tpsl',D.tp_sl,'TP','SL %',v=>'TP '+v+'%',v=>'SL '+v);
draw('hm_confsl',D.conf_sl,'Conf','SL %',v=>v,v=>'SL '+v,D.conf_n);

document.getElementById('verdict').innerHTML =
  `<b>🔴 Отрезвляющий вывод (на большой выборке всё иначе, чем на 4ч-срезе):</b><br>`+
  `• <b>Эдж ТОЛЬКО у confidence 80+</b> (+0.07 → +0.70 с ростом TP). Это сильнейшие дисбалансы, n=${D.conf_n['80+']}.<br>`+
  `• <b>50-59 и 60-69 — В МИНУСЕ</b> (даже при завышенном TP-достижении!). А это 94% всех сигналов (${D.conf_n['50-59']+D.conf_n['60-69']} из ${D.n}). Слабый дисбаланс НЕ предсказывает направление.<br>`+
  `• 70-79 — около нуля.<br>`+
  `<b>Это важнее радужного 4ч-хитмапа</b> (тот был удачным срезом). Реальная картина: order-flow эдж живёт в <b>экстремальных дисбалансах (conf 80+ ≈ \\|imb\\|>0.75)</b>, остальное — шум/минус.<br>`+
  `<b>Действие:</b> поднять порог эмита резко — c 0.35 к ~0.7-0.75 (conf 80+). Сигналов станет мало (~3% = ~20/день), но только они несут эдж. ⚠️ n=23 для 80+ — мало, нужно копить именно сильные.`;

document.getElementById('foot').textContent='Метод mfe/mae · вся выборка signal_log · «оба→0» · maker 0.036% · Бендер';
</script>
</body></html>