Added per‑print NBBO placement tracking into clustering, exposed aggressor mix on

FlowPackets, and used it to adjust sweep/spike confidence. The Flow Packets UI now
  shows an aggressor mix pill with coverage and inside ratio.
This commit is contained in:
dirtydishes 2025-12-30 17:31:37 -05:00
parent 0b0ffa651e
commit 69758d28d9
7 changed files with 247 additions and 12 deletions

View file

@ -432,6 +432,12 @@ h1 {
background: rgba(39, 84, 138, 0.12);
}
.aggressor-tag {
border-color: rgba(93, 70, 144, 0.45);
color: #5d4690;
background: rgba(93, 70, 144, 0.12);
}
.nbbo-meta {
font-size: 0.72rem;
color: #6f5b39;

View file

@ -179,6 +179,8 @@ const formatTime = (ts: number): string => {
const formatConfidence = (value: number): string => `${Math.round(value * 100)}%`;
const formatPct = (value: number): string => `${Math.round(value * 100)}%`;
const formatUsd = (value: number): string => {
if (!Number.isFinite(value)) {
return "0.00";
@ -1790,10 +1792,20 @@ export default function HomePage() {
const structureRights =
typeof features.structure_rights === "string" ? features.structure_rights : "";
const structureStrikes = parseNumber(features.structure_strikes, 0);
const nbboBid = parseNumber(features.nbbo_bid, Number.NaN);
const nbboAsk = parseNumber(features.nbbo_ask, Number.NaN);
const nbboMid = parseNumber(features.nbbo_mid, Number.NaN);
const nbboSpread = parseNumber(features.nbbo_spread, Number.NaN);
const nbboBid = parseNumber(features.nbbo_bid, Number.NaN);
const nbboAsk = parseNumber(features.nbbo_ask, Number.NaN);
const nbboMid = parseNumber(features.nbbo_mid, Number.NaN);
const nbboSpread = parseNumber(features.nbbo_spread, Number.NaN);
const aggressiveBuyRatio = parseNumber(
features.nbbo_aggressive_buy_ratio,
Number.NaN
);
const aggressiveSellRatio = parseNumber(
features.nbbo_aggressive_sell_ratio,
Number.NaN
);
const aggressiveCoverage = parseNumber(features.nbbo_coverage_ratio, Number.NaN);
const insideRatio = parseNumber(features.nbbo_inside_ratio, Number.NaN);
const nbboAge = parseNumber(packet.join_quality.nbbo_age_ms, Number.NaN);
const nbboStale = parseNumber(packet.join_quality.nbbo_stale, 0) > 0;
const nbboMissing = parseNumber(packet.join_quality.nbbo_missing, 0) > 0;
@ -1818,6 +1830,15 @@ export default function HomePage() {
{structureStrikes > 0 ? ` ${structureStrikes}K` : ""}
</span>
) : null}
{Number.isFinite(aggressiveCoverage) && aggressiveCoverage > 0 ? (
<span className="pill aggressor-tag">
Agg {formatPct(aggressiveBuyRatio)} / {formatPct(aggressiveSellRatio)}
{Number.isFinite(insideRatio) && insideRatio > 0
? ` · In ${formatPct(insideRatio)}`
: ""}
{` · ${formatPct(aggressiveCoverage)} cov`}
</span>
) : null}
{Number.isFinite(nbboBid) && Number.isFinite(nbboAsk) ? (
<span>
NBBO ${formatPrice(nbboBid)} x ${formatPrice(nbboAsk)}