CoinStats exchange prices via a small Cloudflare Worker · volatility + momentum model · practice only · not financial advice
Live BTC/USD
—
Quick setup, from what the data in this page has actually shown so far:
Connecting to CoinStats…
Manual override: use these only if sync status below looks wrong (e.g. after editing the token in the field below).
Kalshi 15-minute market
Waiting for the first reading…
¢ (set this to what Kalshi charges you)
Strike price
Type the BRTI you can see and press Enter the moment you read it. The price adjustment updates by itself.
—
—
—
Enter a strike price to see the estimate.
closes undercloses over
—
Cross-exchange reference price
Waiting for the first read…
Exchange
Price
24h volume (BTC)
A volume-weighted average price across the public exchanges that make up most of CF Benchmarks’
BRTI — the index Kalshi’s 15-minute BTC contract actually settles against (Coinbase, Kraken,
Bitstamp, Gemini, Bullish, itBit). LMAX Digital is a real BRTI constituent too but has no open public
API, so it is not included; this is an approximation of BRTI, not a reproduction of it. One slow or
unreachable exchange is simply left out of the average rather than failing the whole read — see
how many sources answered above. This feeds the “Volume confirmation” check in Trade
Readiness below; the page’s own tracked price and model are unchanged.
Trade Readiness
Enter a strike to see the checklist.
Every active gate for the currently favored side, checked all at once -- not just whichever one is
currently blocking a trade. A signal can pass several gates comfortably and still fail on one; this
shows the whole picture before a trade fires, whether or not auto-trading is on.
Six optional checks below are always shown, either way -- checking a box here is what turns that
specific one from informational into something that can actually block a trade. All off by default.
Block on
Check
Threshold
Fast vs slow indicators disagree
2-min change/Accelerator vs Stochastic/Bollinger/RSI/EMA/30-min
Edge over Kalshi’s ask price, after fee
pts
Strike far from the last recorded close
> $100
Strike near a 24h high/low or round level
within 0.15%
Intra-window consistency
Strike near the volume point of control
Volume confirmation (cross-exchange)
rise/min
Momentum
Indicator
Reading
Lean
Waiting for CoinStats chart history…
Each indicator votes from −1 (down) to +1 (up). Readings that measure the same thing are grouped so they count once:
RSI, Stochastic, Awesome and Accelerator are one momentum vote, the EMA-9/21 trend and 30-minute change are one vote, and the order
book and taker flow are one vote. Bollinger, prior-candle momentum, the 1-minute EMA cross, the 2-minute change, the price against its
hourly VWAP and the mark/index basis are one vote each, and the three volume readings (5-minute, 15-minute and signed) are one vote
together, and the composite is the average of the votes. RSI and the 5-minute EMA still come from CoinStats' chart (refreshed every 2
minutes). Stochastic, the Awesome and Accelerator Oscillators, Bollinger and prior-candle momentum use real 15-minute candles from
Crypto.com when its signals are on, falling back to bars built by joining three of CoinStats' 5-minute points otherwise (marked
"approx.", with approximate highs and lows). The 30-minute change and a 1-minute EMA cross use real Crypto.com candles at those
timeframes; the 2-minute change comes from this page's own live prices; and the order book, taker flow, volume and basis come from
Crypto.com's trade and book data when ticked. It can only shift the odds a little; the size of the move needed to reach your strike
still does most of the work. Abnormal volume (over 3 times the
norm) widens the odds instead of pointing a direction. Momentum can enter the odds two ways: as a flat nudge of up to 8 points,
or as a drift, which shifts where the price is expected to end up. A drift matters most near the strike and fades for
strikes far away, which is how a real drift would behave.
Order flow (Crypto.com)
▾
Last 15 minutes
▾
Paper trading (practice only)
Balance$1,000.00
of balance on one bet
A hard cap, applied to every bet -- manual, auto, Kelly-sized or re-entries -- right before it is placed. If the requested size costs more than
this share of your current balance, it is quietly reduced to fit (never increased). This is the single rail every sizing method has to pass
through, independent of how the contract count was arrived at.
A bet's value is its contracts at the model's current odds for that side. Stop loss closes it once it is worth that much less than you paid, and take profit once it is worth that much more. Closing sells at the current price, with no fee or spread, after the move has held for 2 seconds on a fresh price. A contract cannot be worth more than 99¢, so a bet bought at 75¢ can gain about 32% at most, and a higher target will never trigger for it (the row says so).
Cancel on an open bet refunds what it cost, as if it had never been placed. That is different from closing, which sells at the current price. The Track record shows whether cancelling helped.
Bet
Expires
Left at entry
Contracts
Odds
Result
No trades yet.
Each contract costs the model's odds for your side, in cents, and pays $1 if you are right. Over at 75% costs 75\u00a2 and
gains 25\u00a2 per contract if it wins, and loses the 75\u00a2 if it does not. Prices are rounded to the cent and kept between 1\u00a2 and 99\u00a2. Bets settle a few seconds after
expiry on this page's combined price. One open bet per expiry. When you type the BRTI at expiry into a bet's row, that number also becomes
your strike for the next window. If you didn't bet that window, type your strike yourself. Fake money, real logic.
Auto-trading
Auto-trading is off.
Auto-trading: entry rules
▾
from 50%
so momentum cannot create a bet on its own
to
before betting (filters a brief flicker from a stable reading)
Stake = balance × this fraction × (model odds − contract price) ÷ (1 − contract price) — the standard formula
for a bet that costs its full stake on a loss. Only used when Size above is set to Kelly-sized; still capped by the maximum risk per trade
set in Paper trading, and still throttled down after a losing streak like the other sizing modes.
Trend & streak rules
▾
Trend gate — checks the closes recorded in Window history, not the oscillators, so it can catch a real multi-window
move the indicators keep reading the wrong way. One thing this is not evidence for: a check across 918 recorded 15-minute windows
found that one window's direction does not predict the next window's direction — continuation sat at 48.4% (95% CI 45–52%), a
coin flip, even after a large prior move. This gate looks at several consecutive closes together, which is a different, untested question;
it is not invalidated by that finding, but it is also not supported by it.
extrapoints
Same-side loss streak — stops betting one direction after it keeps losing, independent of the trend gate above.
Re-entry after a stop loss
▾
Re-entry after a stop loss — if a bet gets stopped out and the price keeps going the other way, this allows
one more trade in the same window on the opposite side, instead of sitting out until the next window. A take-profit close never
re-enters, only a stop loss. This also applies to bets you place by hand, not just auto-trading. Needs the stop loss itself
switched on above to ever trigger.
It bets at most once per expiry, only after the signal has held for 3 seconds, never within 15 seconds of expiry, and only when you
have set a strike for this window (typing one, or entering the BRTI at the last close), so it cannot trade on an old strike. Its size
shrinks after losses: half after 3 in a row, a quarter after 5. If your balance falls 20% below where it started the day, it switches
itself off, and ticking the box again starts a fresh baseline. It uses the same contract pricing and settlement as manual bets.
Scale into a winning position
▾
Adds more contracts to an OPEN bet once the model's odds for its side have moved further in its favor, at the new (now more
expensive) price, blended into an average cost. This is a manual button on every open bet's row regardless of this setting --
the toggle below only controls whether the auto-trader also does it by itself. It increases risk on a position already committed,
so it is capped and off by default.
Track record
Settled bets0
Correct calls0
Hit rate—
Average model odds—
Net result—
Auto-trade bets—
Stop-loss closes—
Take-profit closes—
Edited bets—
Momentum vs the bet
Bets / hit rate
Accumulating — check back after a few bets.
Time left when the bet was placed
Bets / hit rate
Avg odds
Accumulating — check back after a few bets.
Shares of the window are used, so this works for any expiry: 60% of a 15-minute window is 9 minutes. It shows whether bets placed later, with more of the window already played, are better calibrated than early ones.
If bets where momentum agreed keep beating the ones where it disagreed, the indicator is earning its place.
If the two look alike, it is not adding much. This needs a real sample before it means anything.
Kalshi official values
▾
Kalshi publishes the index value each 15-minute window was settled on. That is the number you otherwise type in as the BRTI at every close,
so it can check your typed values, show how far this page’s price really was from the index, and (if you switch it on) stand in for the
BRTI you would have typed. It never touches a bet you already gave a BRTI for.
Nothing loaded yet.
Closed
Target
Official
Result
Your BRTI
Diff
Indicator calibration
▾
Checks your own trade history: for each saved indicator reading, how often you won when it agreed with the bet's
side versus when it disagreed. This is informational only -- it never changes the live model's weights by itself.
Needs at least 15 bets on each side of an indicator before saying anything about it. Agreeing and disagreeing bets are compared at similar price leads, because a bigger lead wins more on its own and would otherwise make an indicator look better or worse than it is.
Indicator
Agree (n, win%)
Disagree (n, win%)
Read
Calibration drift — compares your most recent bets against everything before them. A model that's
quietly gotten worse (or better) since you last checked should show up here before it shows up as a losing streak.
Cancelled bets
▾
No cancelled bets.
Bet
Expires
Left when cancelled
Refunded
Holding would have been
BRTI check
No cancelled bets.
Cancelled bets are refunded in full and kept out of the Track record: they do not count in the hit rate, the odds check, the time-left table, the net result or the auto-trade count. This box is only a log, so you can see whether cancelling helped.
Window history
▾
Recording the price at every 15-minute close.
Exhaustion study: after a run of windows that all moved the same way
each at least
Every 15 minutes the page saves the price at the close, how big a move is normal for that window, and the BRTI if you typed one for it. Windows it was open for
come from live prices. When it was closed, the last 24 hours are filled in from CoinStats' 5-minute chart (approximate: interpolated to the close, and marked as chart
data). The study only counts runs of consecutive windows from the same source, and measures each move in standard deviations of that window's own volatility.
This is a gauge of how much evidence exists, not a rule yet.
Exchanges
▾
Exchange
Last trade
Age
Up to date
Use
No data yet.
Added to the combined price everywhere: the header, chart, odds and settlement. Use it when this page sits above or below the BRTI by about the same amount every time.
Averages against the BRTI
▾
This page's price, made from
Average difference
Spread
Readings
No comparisons yet.
Recent readings. Remove any that were typed wrong.
Time
BRTI typed
Page vs BRTI
No readings yet.
Save and sync
▾
Starting…
Paste this exact token into the same field on another browser or device to share this paper-trading history there. Anyone with this token can read or overwrite this history, so treat it like a password.
Bring data in from another browser without using the token: paste an export here.
Synced: your paper account, ledger, cancelled bets, BRTI readings, price adjustment, settings, and whether the session is open or closed. Not synced: whether live fetching and auto-trading are switched on
(each browser keeps its own, so two devices never trade at once), the credit counter, and live prices. Closing the session on one device closes it everywhere once the other device syncs, so remember to press Start session there too. Unlike the Claude-artifact version, this standalone build does not
detect conflicting changes from two devices at once -- the last one to sync wins -- so use one device at a time. Importing replaces this browser's data.
Live fetching
▾
How it works: the price is a combination of last-trade prices on the BRTI's USD exchanges that CoinStats lists. The odds
assume no drift by default (you can add your own drift view, or let momentum act as a drift) and use how far Bitcoin has typically moved in 5 minutes over the last hour and the last 24 hours (whichever
is larger), plus the age of the combined price, the larger of that and the last 30 minutes' moves on this page is used, widened for the news window or abnormal volume, and fat-tailed by default; then momentum adds a bounded nudge. To see how close this page is to the
BRTI, type the BRTI at expiry into a settled bet's "BRTI check" box; it re-settles that bet on the BRTI and records the
difference. CoinStats may not list every BRTI exchange, and these are last-trade prices, not order books.