stablecoin_share_anchor
stablecoin_share_anchor is a master switch wired to one number: what share of all the money in crypto is sitting in dollar-pegged coins rather than in something that can move. Every five minutes we ask CoinGecko what percentage of the total crypto market capitalisation the stablecoins account for, and you pick a condition off it — "only when the share is above 12%", "only when it's below 8%". While your condition holds the bot trades; while it doesn't, the bot places no trades at all that cycle, in any market. It gates the whole bot, not just crypto markets.
- Bots using it
- 0 (none live, none out-of-sample, none ever)
- Data source
- CoinGecko /api/v3/global
- Refresh
- Every 5 minutes (*/5 * * * *)
- Rows stored
- 1,644 readings 7 days — the rest is deleted
- Backtest-replayable
- No — see catch #6
- Anchor module
- quants/stablecoin_share_anchor.py
The idea is a good one and the pitch writes itself. Stablecoins are the cash of crypto. If a lot of the market's money is parked in them, there is "dry powder" on the sidelines waiting to be deployed — a risk-off, frightened, or patient market. If very little is, capital is fully committed and there is nobody left to buy. Our own module says exactly that, and so does the builder, and so does the starter bot we ship.
The trouble is arithmetic. Share is a fraction: stablecoins divided by the whole crypto market. The top of that fraction barely moves — stablecoins are pegged to a dollar and their supply changes only when somebody mints or redeems them, which is slow. The bottom of it is a price index, and it moves all the time. So when crypto crashes, the share goes up on its own, with not one dollar changing hands and not one coin minted. When crypto rallies, the share falls the same way.
That isn't a quibble, and we can put a number on it, because we have the readings. Across every paired reading we hold, the correlation between the stablecoin share and the total crypto market cap is −0.9964 — an r² of 0.9929. Against the thing it is supposed to be measuring, the actual dollar size of the stablecoin pile, the correlation is −0.0662. Over a full year rebuilt from free public history the story is the same: the denominator is 11.3× as volatile as the numerator, and 81.3% of the year's move in the share would have happened with zero stablecoins minted or burned. As shipped, this signal is very close to an upside-down price chart with an extra step.
Where the data comes from
One free HTTP request, no key and no account: https://api.coingecko.com/api/v3/global. We called it from the production server while writing this page — HTTP 200 at 20:32 UTC on 11 August 2026 — and it returned a market_cap_percentage map containing exactly ten entries, the ten largest coins in crypto. Two of them were stablecoins: usdt at 8.0771% and usdc at 3.1830%. The poller adds them up. That sum — 11.2601% of a $2.2663 trillion market spread across 18,377 listed coins — is the entire signal.
predictive/crypto_poller.py makes that call on cron */5 * * * *, 288 times a day, and writes one row with symbol='STABLE' into the crypto_dominance table in predictive.db. As of this writing that table holds 1,644 readings covering 4–11 August 2026, with a mean of 11.1661%, a standard deviation of 0.0647, and a full range of 11.0384% – 11.3273%. The gate in quants/stablecoin_share_anchor.py reads the newest row and compares it to your threshold.
This is the third and last signal riding that single /global call. The other two are btc_dominance_anchor and crypto_momentum_anchor. One request, three signals, and no bot uses any of them.
Where the year of history on this page came from — and its limits
Our own table only remembers eight days, so to say anything honest about whether the thresholds we ship are sensible, we had to rebuild the series from outside. Three free, keyless sources:
- The numerator — stablecoins.llama.fi/stablecoincharts/all and the per-coin endpoints (DefiLlama). Daily stablecoin supply back to 29 November 2017, 3,178 days.
- The denominator — this is the hard one, and we want to be exact about it. CoinGecko's historical global market cap is a paid endpoint; on the free tier it returns HTTP 401. So the total market cap here is reconstructed: Bitcoin's market cap (CoinGecko, free, capped at 365 days) divided by Bitcoin's dominance (the free keyless feed at api.bitcoin-data.com/v1/bitcoin-dominance, 1,300 daily readings). That is an arithmetic identity, not an estimate, but it inherits both vendors' definitions.
We checked the reconstruction against the two things we can check it against. Against CoinGecko's own live reported total market cap it lands within 1.31%. And rebuilding our own gate's reading for 10 August gives 11.1308% where our poller actually stored an average of 11.1458% that day — a difference of 0.015 percentage points. It is the same series. Where this page quotes a one-year figure, that is where it comes from, and the 365-day free cap on CoinGecko's coin history is why it is one year and not four.
What it means for your bot
It is a whole-bot master switch, not a filter on crypto markets. The engine checks it once per cycle before it looks at any market at all; if your condition isn't met, the bot does nothing that cycle — no scanning, no orders, in any category. A bot with this signal and a weather strategy will sit out weather markets because of a number about Tether.
Here is the practical translation, and it is the most useful sentence on this page. Because the share is stablecoins divided by the market, and the stablecoin half barely moves, setting a threshold on the share is very nearly setting a threshold on the price of crypto — upside down. At the moment we wrote this, with $255.19B of USDT and USDC in our reading:
| If you set… | …you are really saying | vs today |
|---|---|---|
| share above 10% | total crypto cap below $2.552T | +12.6% |
| share above 12% | total crypto cap below $2.127T | −6.2% |
| share below 8% | total crypto cap above $3.190T | +40.8% |
"Only trade when there's dry powder on the sidelines" and "only trade when crypto has fallen 6% from here" are, on this data, close to the same instruction. The second one is at least honest about what it's doing.
The catch
Every signal has one. This signal has eight, and the first is not a bug in the code — the code does exactly what it says. It's a problem with the number itself.
1. It is a price chart, not a flow gauge — measured, at both horizons
The sales pitch is that a high share means capital has moved to the sidelines. Test it against the actual size of the stablecoin pile and it collapses. Across the 1,644 paired readings we hold, the correlation between the share and the total crypto market cap is −0.9964 (r² = 0.9929). The correlation between the share and the implied dollar value of the stablecoins themselves — the thing it claims to track — is −0.0662. Over that week the stablecoin pile moved 0.376% while the market cap moved 2.562%.
The obvious defence is that a week is far too short: issuance is slow, so of course the numerator looks frozen. So we tested it over the full reconstructed year, and the defence mostly fails. Day to day, the denominator is 11.3× as volatile as the numerator; the correlation between daily changes in the share and daily changes in the market cap (inverted) is 0.9961, r² 0.9923; the variance of daily supply changes is 0.81% of the variance of the share. Over the year as a whole the share nearly doubled, 5.699% → 11.131% — and with the supply frozen at day one it would still have travelled to 10.022%, which is 81.3% of the same journey. Stablecoins were real but minor: 18.7% of the move.
The concrete version: over that year the stablecoin supply grew 13.9%, while the crypto market fell 43.1%. Read as our copy tells you to read it, the "dry powder on the sidelines" roughly doubled. Almost all of that was the sidelines staying put while the field shrank.
2. We count two of the world's 416 stablecoins — and the denominator counts all of them
The poller keeps a list of 13 stablecoin tickers to look for. It finds them in CoinGecko's market_cap_percentage map — which only ever contains the ten largest coins in crypto overall. Two stablecoins are big enough to make that cut. The other eleven tickers on our list contribute exactly zero, every cycle, including Sky Dollar ($6.63B) and Dai ($4.79B), which are simply too small to be top-ten coins.
DefiLlama tracks 416 stablecoins worth $308.10B. We see USDT ($183.03B) and USDC ($72.20B) — $255.23B. We are blind to $52.86B, 17.2% of the stablecoin universe. And the two sides of the fraction do not match: the total market cap in the denominator is computed across all 18,377 coins CoinGecko lists, stablecoins very much included. So the ratio divides two-stablecoins-worth by an-everything-worth.
This is not cosmetic — it straddles our own recipe. Our reading was 11.2601%. The all-stablecoin share was 13.5947%, an understatement of 2.33 percentage points. The builder's one-click recipe is "share above 12%". On the real stablecoin universe that condition was true; on the number our gate actually reads it was false. The recipe we ship is switched off by our own measurement error. (That 13.59% figure divides DefiLlama's universe by CoinGecko's total, so it mixes two vendors and should be read as "about 2 pp", not to four decimals — but the direction and rough size are not in doubt.)
There is a second-order hazard in the same mechanism. Because membership of that map is decided by rank, a stablecoin crossing into or out of the top ten would move our number by billions overnight with nothing happening in the world. In fairness, it hasn't happened during our record, and it isn't close: USDC sits fifth, and the tenth-placed coin is roughly 2.7× larger than the biggest stablecoin outside the map.
3. The polarity is genuinely contested, and we assert one side as settled fact
The module, the builder and the starter bot all state the same reading without qualification: high share = dry powder = risk-off. There is a well-established opposite reading. New money entering crypto arrives as freshly minted stablecoins before it buys anything, so a rising absolute stablecoin supply is widely treated as incoming liquidity — constructive, not fearful. Both stories are coherent, they point opposite ways, and nothing on our site tells you the question is open.
There's a mechanical detail underneath that makes the "cash moving to the sidelines" story weaker than it sounds. Stablecoin supply changes only when coins are minted or redeemed. A trader who sells Bitcoin for USDT on an exchange moves existing tokens between wallets; total supply is unchanged. So the very act the pitch describes — investors retreating into cash — does not move the numerator at all. It moves the share only through the denominator, by pushing the price of what they sold down.
We are not going to tell you which reading is right, because we cannot measure it. We tried. Over the reconstructed year, a high share does associate with better forward returns (correlation +0.33 at 30 days, +0.70 at 90 days) — but running the identical test on 1 ÷ market cap, which contains no stablecoin data whatsoever, gives a stronger result (+0.38 and +0.75). The signal adds nothing over simply knowing the price had fallen. And at 90 days, 363 overlapping observations amount to about three independent windows, which is no evidence at all. The honest answer is that this question cannot be settled from what we keep.
4. One shipped setting is always on, another is almost never on — and our eight days can't tell you which
Measured against every reading in our table (range 11.0384% – 11.3273%):
| Where it ships | Setting | Open, our 8 days | Open, the year |
|---|---|---|---|
| Builder field default | above 10 | 100.00% | 44.9% |
| Starter bot “Dry-Powder Watch” | above 10 | 100.00% | 44.9% |
| Builder recipe “Sidelined-cash contrarian” | above 12 | 0.00% | 1.7% |
| Starter’s suggested “level up” | below 10 | 0.00% | 55.1% |
| Module docstring example | below 8 | 0.00% | 29.5% |
On our own data every one of these is a constant — permanently open or permanently shut. A switch that can't change state isn't a switch.
But the year column is the fair answer, and it mostly exonerates the defaults. Over 363 days, "above 10" was open 44.9% of the time — close to an ideal duty cycle for a regime filter — and "below 10" the complementary 55.1%. Those are good, well-chosen thresholds. They look broken here only because our eight days happen to sit entirely between 11.04% and 11.33%, above one line and below the other. The defect is our memory, not the number.
The exception is the recipe. "Above 12" cleared on 1.7% of days in the last year — about six days out of 363, and given catch #2 it needs a real share nearer 14.3% to fire. That one is badly calibrated on any horizon, and it is the setting attached to the friendliest one-click button we offer.
5. Seven days of memory for a number with a multi-year arc
The poller prunes crypto_dominance to seven days. Over the last year this series ran from 5.424% to 12.179% — a range of 6.76 percentage points. We hold 0.29 of them, about 4% of the year's travel, and nothing older. Every question worth asking about a regime gate — how often does it open, how long does it stay open, is now unusual — is unanswerable from our own storage.
The prune also keeps slightly more than it advertises, the same way its two siblings do: it compares an ISO-8601 timestamp against SQLite's datetime() as a string, and because 'T' > ' ', rows from the cut-off day survive. Our window is 188.25 hours, not 168. Harmless here, and not fixed — this loop doesn't edit pollers.
6. The backtester can't replay it — and the code doesn't even know the signal exists
The string stablecoin appears zero times in quants/backtest.py. It is not in the supported list, and it is not in _UNSUPPORTED_ENTRY either — the documentary list of things we know we can't replay. Only the catch-all check saves it. A backtest containing this signal runs without the gate and still returns an equity curve; it flags unsupported_rules, but the curve you're looking at is a different strategy from the one you built.
The standing justification in the code is that these anchors "need a forward-captured series we don't have retroactively". Here that is half true, and worth splitting. The numerator is free and keyless back to 2017 — 3,178 days of it. The denominator genuinely is hard: CoinGecko's historical global market cap is paywalled, and we could not find a clean free keyless multi-year total-crypto-cap feed. So the excuse holds for the ratio as defined, and does not hold for the ingredient that actually carries the information.
7. Blind for more than a quarter of the clock, by design
Over our window the poller should have written 2,260 readings and wrote 1,644 — 72.7% coverage, 27.3% blind. The cause is the isolated try/except wrapped around the whole dominance step. That isolation is correct design — a CoinGecko hiccup must never break the core coin-price polling — but its consequence is that this row is the designated sacrifice whenever the database is contended. The poller's lifetime log carries 4,602 database is locked errors, 926 dominance-step failures, 434 fetch failures, and vendor losses of 112× HTTP 429 plus assorted 400s and gateway errors. (Those are lifetime counts; the log carries no timestamps, so they can't be attributed to a window.)
In fairness, missing a five-minute sample costs almost nothing for a variable this slow, and gaps never approached the failure threshold — see the defence below.
8. Configurations that validate but cannot mean anything
validate_config checks each bound is a number from 0 to 100 and never checks them against each other. So {"above": 12, "below": 8} passes validation and can never be true — the same defect documented on finance_anchor and both siblings on this API call. {"above": 100} and {"below": 0} are also legal and permanently shut.
Worse, to_english renders that impossible pair as two confident opposite statements joined by "and": "only when stablecoin share > 12% (lots of dry powder on the sidelines — risk-off) and stablecoin share < 8% (capital fully deployed into crypto — risk-on)". The genuinely useful configuration — a band, like {"above": 10, "below": 12} — works correctly but reads back as risk-off and risk-on simultaneously. Both comparisons are strict, so a threshold set exactly on the reading is a miss.
The case for the defence
Four things this signal gets right, and they aren't trivial:
- The freshness check is correctly written. It parses the stored ISO timestamp into a real Python datetime and compares it properly — it does not fall into the string-comparison trap that defeats the equivalent check in finance_anchor and tropical_anchor. Missing data, a null reading, or an unparseable timestamp all return False. It fails closed, exactly as its docstring promises.
- It has never had to. The threshold is 90 minutes; the largest gap between consecutive readings in our whole window is 35 minutes, and there were zero gaps over 90. Despite catch #7, the gate has never once been starved.
- The default threshold is well chosen. 44.9% open over a year is what a regime filter should look like. Whoever picked 10% picked a good number; the product simply can't show you that, because it deletes the evidence after a week.
- The underlying variable is real and free. Stablecoin supply is a genuine liquidity measure, it costs nothing, and it rides a request we already make. The problem is the normalisation, not the ingredient — and the ingredient is available on its own, with eight years of history, from an open API.
The real record
There isn't one, and we are not going to invent one. We checked all 76 strategy configurations on the platform — 19 live, 17 out-of-sample, 36 archived, 4 draft — and all 88 saved strategy versions. Not one mentions this signal. No bot has ever been armed with it, so there are no trades, no fills, no evaluations and no profit or loss to report.
That makes it one of the sixteen signals on this site whose poller is running right now, on schedule, writing data that nothing reads. We keep collecting it 288 times a day. That is an honest fact about the shelf rather than a secret, which is why it's on the page.
How to actually use it
If you want to use this signal well, the first thing to internalise is that you are setting a condition on the price of crypto, expressed awkwardly. That is not automatically a bad thing to do — plenty of good strategies want to trade only after a drawdown — but you should choose it deliberately rather than because the word "dry powder" sounded like an edge.
- Use the default, not the recipe. above 10 was open 44.9% of the last year. above 12 was open 1.7%, and given our 2.33 pp understatement it needs a genuinely extreme market to fire. If you want the contrarian version, 11% is the setting our data can actually support.
- Set a band, not a bound. {"above": 10, "below": 12} defines a regime rather than a direction. It works correctly; just ignore the English it prints back at you.
- Don't pair it with another crypto price gate. Combining this with crypto_momentum_anchor or a Bitcoin level feels like two independent confirmations. On this data it is close to the same condition counted twice.
- Don't backtest it and believe the curve. The gate is skipped entirely in replay. Check for the unsupported_rules flag on any result.
- Remember it gates everything. If your bot trades sports or weather, this switch will still shut it down over a number about Tether.
Where to go next
The two other signals on this same CoinGecko request are written up: btc_dominance_anchor, whose builder default has been unable to open since June 2024, and crypto_momentum_anchor, whose three recommended thresholds were all shut for the entire week we keep. All three share the isolated try/except of catch #7, the seven-day prune of catch #5, and the validation gap of catch #8 — and none of the three has a bot.
For a signal that measures our own behaviour rather than a vendor's, see resolution_anchor. For the other case where a documented data source turned out not to be the real one, see finance_anchor. The full list is in the Trade Bot Dictionary.
Every number on this page was measured on 11 August 2026 from the production database, the module source, or a live call to the named endpoint. Where a figure is reconstructed rather than vendor-reported, the page says so and gives the method. Nothing here is estimated, rounded up, or carried over from memory. If you find a figure you can't reproduce, tell us — that's a bug in the page.