Signal Enginev0.4.0 · 2m bars · 4 instruments
feed idlehealth startingseq 014:00:00Z · 0% of session
Synthetic data, invented instruments, textbook rules. This is a working engine rather than a walkthrough: a seeded tick generator streams over a real network connection, and this page builds the bars, computes the indicators, evaluates the rules and posts the payloads while you watch. It carries no client data, no client schema and no proprietary strategy logic, because the correctness worth showing lives in the plumbing and not in the rules. The two rules are the generic opening-range breakout and moving-average bounce out of any intraday primer.
bars closed0
signals fired0
delivered0/ 0
worst delay at 200x clock0ms
replayed frames dropped0
prints rejected after seal0
bars with no trades0
01tick tape
connecting to the feed
02transport
state
idle
resume cursor
0
frames applied
0
replayed frames dropped
0
sequence gaps healed
0
frames re-ordered
0
prints inside grace
0
prints on a bucket edge
0
03fault injection

Killing the feed freezes the watermark: bars stop closing rather than being invented, and health reports degraded. On reconnect the engine resumes from its cursor, the server replays from there, the gate drops anything already applied, and the bars come out the same. That is the whole reason the sequence number and the exchange timestamp are kept apart.

04Synthetic Index A · 2-minute barssession open, rules armed
waiting for the first bars to close
05bar under constructionno bucket open
open-
high-
low-
close-
volume0
prints0
sma 9warming
sma 21warming
atr 14warming
adx 14warming
vwappre-session
opening rangebuilding

ATR and ADX are Wilder-smoothed rather than simple means of true range. Both look plausible on a chart and they differ by enough to move a threshold, so the selftest checks these values against a separate batch implementation on every bar instead of trusting the running state.

06signals0 fired · click one for its payload
no rule has matched yet
07webhook delivery0 posts · 0 retries
nothing to deliver yet
acknowledged
0 / 0
distinct keys accepted
0
duplicate offers collapsed
0
dead letters
0
policy
5 attempts, 250ms x2

The outbox is exactly-once per signal id and the wire is at-least-once: a retry re-sends the same key with a byte-identical body, so the receiving system can dedupe on the key. The payload carries engine event time rather than send time, which is what keeps the body stable across attempts.

08acceptance selftest
running the selftest
09health endpoint
checking
10delivery contract
schema
signal.v1
endpoints
one per instrument
idempotency key
signal_id
bar interval
120s
late-arrival grace
750ms
retry policy
5x, 250ms doubling

Each endpoint documents itself: open /api/webhook/XA1 in a browser for the contract, or post an invalid body to it and it answers 422 with the list of fields that failed. The receiver is same-origin only, so nothing here fetches a caller-supplied URL.