neural-worker.ts
const win = new SlidingWindow({ size: 256, stride: 1 });
const guard = new InferenceGuard({ maxHz: 8, minBarDelta: 0.25 }); // ATR units
onSharedBufferSignal(async (head) => {
win.pushFromRing(ring, head); // zero-copy read, no allocation
if (!guard.shouldRun(win)) return; // skip when nothing meaningful moved
const x = canonicalize(win); // (close - EMA) / ATR => scale-free
const [pat, liq] = await engine.runBatch([x, x]);
annotations.writeAtomic({ // double buffer: rendering never waits
patterns: decodePatterns(pat, { minConfidence: 0.72, nms: true, hysteresis: 3 }),
liquidityHeatmap: quantize(liq, 8),
generatedAtBar: head,
});
});scale-invariant canonicalization
z[i] = (close[i] - EMA_w) / (ATR_w + eps)
r[i] = log(close[i] / close[i-1]) / sigma_w
shape[i] = (high[i] - low[i]) / ATR_w
body[i] = (close[i] - open[i]) / ATR_w
لأن المسافات تُقاس بوحدات التقلب، يعمل نموذج واحد على العملات والذهب والأسهم وعلى أطر زمنية مختلفة دون إعادة تدريب. ويُكبَح الاستنتاج ما لم تتجاوز الحركة عتبة معتبرة، فلا يُستهلك المعالج بلا داعٍ.