A State Is A Screen
A market state — coiling, igniting, running, cooling — is a set of conditions that all hold at once. On vyx that is a screen: a signal with Combine set to All and one on/off condition per line, each named for what it means. Light it on a desk and the board shows which markets are in that state right now; the Screen face lists them with how long each has held. Light every stage on one desk and the Screen face colours each market's 48-candle strip by the stage that held on each candle, so you read the path — coiled for six hours, broke an hour ago, running since — across every market at once.
- Compression: priceRangeBps <= median(priceRangeBps, 50)
- Value migrating up: v = sum(((high + low + close) / 3) * baseVolume, 96) / sum(baseVolume, 96); change(v, 4) >= 0
- Activity turning: a = quoteVolume / median(quoteVolume, 50); change(a, 1) > 0
- One condition per line, up to six in a signal, up to 1,000 characters each, lookbacks up to 200 candles. A state that needs more is two screens, the second reading the first by name (below).
- Named parts (a = …;) live inside one formula: a condition cannot read a part named in another, so each one spells out what it needs. A name cannot be a word the language already uses — p, z, close, sma — and the error names the word and offers a free one.
Memory: What Happened Before
A stage machine needs to know where a market was, not only where it is. Three functions carry that memory, and each stage can be its own saved screen that the next one reads.
- barsSince(condition): candles since the condition last held, 0 on a candle where it holds. “A, then B within N candles” is b && barsSince(a) >= 1 && barsSince(a) <= N.
- signal("Coiling"): a saved screen read as a condition — 1 on the candles every one of its conditions holds. Save each state as its own screen, and the next state reads the one before it: signal("Coiling") && … . It reads on the desk’s own timeframe (wrap it in tf() for another), editing the screen updates every formula that reads it, and a screen cannot read itself. A scored signal — consensus, linear or strict — fires by vote and cannot be read this way; save its conditions as a screen.
- onset(condition): 1 on the first candle a condition holds and quiet while it keeps holding — the edge between two states, as one word. Give it a condition: a bare number counts as holding only above zero.
- A state that needs 50 candles of history to compute is quiet for its first 50 candles on a new market; that is warm-up, not a miss, and Proof and the history read both say so.
A Transition Is An Event
A transition is “state A held recently and state B holds now” — and it should fire once, on the candle the handoff happens, not stay lit for as long as B lasts. Write it as one condition in a screen of its own, so the board lights it on exactly one candle per handoff and an alert can fire on it.
- onset(barsSince(signal("Coiling")) >= 1 && barsSince(signal("Coiling")) <= 4 && signal("Expanding")) — Coiling held within the last four candles, Expanding holds now, on its first candle only.
- Events are rare by design: a quiet board is normal, and three stages on 15-minute candles might fire a handful of times a day across the whole venue. A transition that fires on 10% of candles is not a transition.
- The window (1–4 candles here) is the number to tune first, and it is a sweep, not a guess — see below.
- One condition, one meaning: the edge reads the same on the board, in Proof, in the history replay and in alerts because they all score the same formula.
Prove Each Piece Before You Trust It
Grade before you save. Proof replays about 1,000 candles of every market on your board and reads back three things in order: how much of the board the signal lights, whether the markets it lights move more than the rest afterwards, and its direction after costs. Every check below runs on a draft — nothing is saved until you say so.
- Lit share first. A state should light a minority of the board: about 2–10% of market-candles reads as events; 40% or more paints the whole board, so add or tighten a condition. 0% is a question, not a verdict.
- Compare variants side by side: up to four drafts on one window — a looser and a tighter condition, two different sides.
- Sweep a number: write it as $N in the draft and pass the values to try (4, 8, 12, 24). One table comes back, one row per value, the best by attention named — the way a transition’s window or a lookback is tuned without saving a signal per value.
- Ablate a dark screen: each condition graded alone, then the conditions stacked one by one, and the step where the lit share collapses named — a condition that can never pass, or two states that never happen together on this venue. Ask this before loosening anything.
- Replay it bar by bar: a saved signal or a draft on one market, every indicator’s value and whether each condition passed on each closed candle, or several stages aligned in one table with their on and off runs — the same numbers the board scored, so you can check them against your own.
- Grade one kind of market on its own: ask for crypto only (or any market kind) and Proof grades just those markets, so the move and range each candle is measured against are theirs alone — not a board mixed with equities and indices. Every grade lists each kind it graded, then BTC and ETH against the rest of crypto and the board in thirds by 24-hour volume, each with how many times it fired, on how many markets, and a 95% range. Each group is measured against its own markets’ usual moves on the same candles, so 1.00× means the signal picks out nothing there; read a cut as real only when its whole range clears 1.15× and it stands on at least 150 independent candles (markets moving together count once) — the same two bars the verdict uses. A cut with fewer is marked too thin to call, however wide its range.
- Grades run on the whole board — every market on a desk set to All markets. When several drafts that rank against the whole field would not fit over the full window, the grade comes back over fewer candles and its first line says how many and why; grade fewer at once, or narrow the desk, for the full window.
- Confirm on the next timeframe up before you keep it. What validates on this data is attention — the markets a signal lights move more than the rest; direction rarely survives costs, and that is expected. Never read a validated screen as a buy or sell call.
- Ranking needs different scores. Proof also checks whether a signal’s highest-scored markets beat its lowest-scored ones. A screen lights every market it holds on with the same score, so it has nothing to rank and Proof says that check doesn’t apply. On any signal, markets that share a score count evenly, never in the order the board lists them.
Grade It Against Your Event
Lit share and attention say whether a signal marks anything real. The question a researcher asks next is sharper: did it light before the event I care about — a pump, a breakout, the alerts another scanner sent me — how many candles before, and is that better than chance? Give the grade a target and it answers in one call, on the same window and the same markets.
- The event has two parts. The onset is the first candle the market can see it — close above the last day's high on twice the usual volume — and is written like any condition, so it never looks ahead. The confirm is what has to happen next for the onset to count — 5% higher within 8 candles: fwd(highest(high, 8), 8) / close - 1 > 0.05 — and fwd() is allowed there and nowhere else. A forward read as the whole event is refused, because it would light candles before anything was visible.
- Or name a saved screen as the onset, or bring your own list of market and time pairs (up to 500) — each event lands on the candle its time falls in, and only a signal lit on a candle that closed before that one counts as caught — lit inside the alert's own candle reads late, because that candle closed after the alert. How the list was made is yours.
- Per event: early (lit in the 8 candles before it — the lead counts candles from the earliest), on the candle, late (in the 8 after) or missed. An event with too little history before it, or too recent to tell late from missed, is counted apart, never as a miss. Change both windows with lead and within.
- Per fire: a hit when an event starts on it or within the lead, late when it lit just after one started, or false — so precision reads against the chance a candle picked at random has an event ahead.
- Controls: at each event, the markets that did not move — a signal lit across the whole board catches every event and the quiet markets too.
- Chance, measured: the grade moves your signal where it cannot know your events, 99 times each with a fixed seed, and prints what it caught there. Once onto another market at the same candles — a signal lit across the whole board at a market-wide move catches the quiet markets just as well — and once onto other days at the same time of day, so a signal that only knows the open never reads as skill. A busy signal catches most events by luck; VALIDATED needs both caught and precision to beat both, at least 30 events and at least 5 markets — fewer read accruing.
- Check the label first: explore lists the events your target finds — market, time, how long it held, the move — and grades nothing.
- Grade the past: to ends the window at a time you name, so last month grades while its candles are still stored (90 days on 1-minute to 1-hour candles). The grade runs on the markets your desk shows today; a market delisted since is not in it, and the answer says so.
Where To Do It
The desk chat does all of this with nothing to set up — describe the state, ask for the grade, ask what cuts. Your own AI does the same over the connector, on your own subscription: compose, grade, sweep, ablate and replay are each one call, and the connector briefs it with these rules on connect. The Proof button on a saved signal grades it from the app.
- “Build me a screen for markets compressing while value migrates up and activity turns, and grade it over 1,000 candles.”
- “It never lights — grade each condition alone and stacked, and tell me which one kills it.”
- “Sweep the handoff window of the transition over 4, 8, 12 and 24 candles and tell me which window works.”
- “Replay the three stages on SOL for the last 200 candles, aligned, and show me every handoff.”
- “Grade Igniting against pump onsets — a close above the day's high on double volume, 5% higher within 8 candles — and show me how early it lit.”
Keep The Library Clean
Drafts, sweeps and ablations save nothing, so a research session leaves no litter behind. When one does — a family of variants saved to compare — give them a shared piece of name (_TEST) and your AI can list and delete the whole family in one call over the connector; it shows you the list before it deletes. Deleting a signal takes it off every desk that carried it.
More docs
Try it on the live map
Open the desk and put this to work across 300+ Hyperliquid markets — free, no install, no password.
Open VYX