← All posts

The Symbols Kept Disappearing: Why We Left Crypto for Futures

Every trading system rests on an assumption so basic nobody writes it down: that the thing you traded yesterday still exists today.

Crypto broke that assumption for us, over and over, until we stopped building around it.

This is the story of why RoboTrader trades futures — told from the git history, because the git history is the only witness that was there the whole time and had no reason to flatter anyone.

What we actually built first

RoboTrader did not start as a futures platform. It did not start as a crypto platform either.

The oldest surviving repository in our archive is dated 5 June 2017, and it is not a trading system at all — it is a news website about words trending in the news. A voice-assistant skill for the same content followed four days later, and after it came a natural-language and sentiment product: a React front end and a family of APIs for headlines, channels, mentions and scoring. That is where this company actually begins — nine years ago, in language processing, not markets.

Trading arrived by way of that scoring engine. In April 2020 — inside three weeks — we stood up a trading core, a stock-symbol service, a stock-data service, and the crypto engine that would absorb the next two years. That autumn there was also a buy-the-dip service built against a retail brokerage, which ran for about a week of commits and then stopped.

Read in order, the archive is a list of things we tried: trending-word voice assistant → sentiment APIs → stocks → dip-buying → crypto → the whole crypto market → futures. Some of those had customers. Most did not. Every one of them left code behind, and a surprising amount of that code is still load-bearing today.

The volumes tell you where the conviction was. Across nine years and twenty-two archived repositories there are about 1,500 commits; the crypto engine alone accounts for 710 of them — more than the voice assistant, the sentiment APIs, the stock services and the dip-buyer combined. This was not a side bet we wandered away from. It was the main effort.

When crypto came, the ambition was breadth: not one coin, not a handful, but the whole listed market — over 250 of them at the peak of that pitch, which is exactly how our own marketing described it at the time.

The engineering record shows how seriously that was taken. In the spring of 2023 the first function landed that pulled the full symbol universe into our database. By that summer there was a threaded price-history collector. By September there was a strength analyzer, then a scorer, then a signal sender — the last of which is recorded, with visible relief, as "working!"

Underneath it sat a full serverless stack: 28 cloud functions, a set of state-machine iterators driving them, and roughly a dozen database tables — the whole thing orchestrated by infrastructure-as-code and fed by a single central data store.

And here is the part that only shows up when you read the archive in date order. Several of those tables are not crypto tables at all. They are the headlines-and-sentiment tables from the 2017 voice-assistant product, still sitting in the trading stack years later, because the crypto scorer was built on top of the sentiment scorer rather than beside it. We were not running a crypto company with some old code lying around. We were running the sixth iteration of the same scoring engine, pointed at a new market.

That code still exists in the repository. We never deleted it. It sits in an archive directory that any new engineer trips over — and years later one of them did exactly that, mapping a migration from the dead crypto-era code instead of the live trading system, because nothing in the repository said which one was running.

The good

The system worked. It ingested a very large symbol universe, scored it, and produced signals. For a small team that is a real accomplishment and we are not going to be coy about it.

The pivot was right. Everything RoboTrader runs today — the signal generation, the scoring, the position management, the reconciliation against broker truth — is a direct descendant of code written for crypto. The market changed. The engineering compounded.

The bad

The ground would not hold still.

The first sign was in August 2023. Two commits, two days apart:

handle delisted more accurate delisting

That is a developer discovering that symbols vanish, patching it, and then discovering the patch was not accurate enough. It went quiet for five months.

Then came 6 February 2024, which is the day this story turns. Two separate pressures landed on the same evening.

The first was a deadline we knew was coming. Coinbase had announced in June 2022 that it was replacing the Coinbase Pro API with Advanced Trade; Pro was switched off for customers on 1 December 2023, and the old API was retired outright the following June. Existing keys did not carry over and the integration had to be rewritten. That is a normal, well-signposted platform migration — the kind of work you schedule, and the kind we had put off. Our rewrite commit is dated that morning.

The second was not scheduled by anyone, and it arrived that same evening:

16:43 further add delisted symbols 16:49 patch delisted 20:34 fix for delisted 20:39 hack fix delisted 20:44 attempt fix delisted 20:48 fix delisted 20:54 try with 0 to exit on delisted

Five commits in twenty minutes, at nine o'clock at night. Read the verbs in order — handle, patch, fix, hack fix, attempt fix, fix, try. Nobody writes "hack fix" when things are going well. Nobody writes "attempt" unless the last four things did not work.

The contrast is the point. The first problem had a documented migration path and a date on a calendar. The second had neither — and it is the second one that ended the business line.

We have published worse days than this one. What makes it worth republishing is that it was not a bug. There was no correct code to write. The symbols were genuinely gone — delisted, renamed, or quietly abandoned by projects that had stopped existing. You cannot patch your way to a stable instrument universe when the instruments themselves are the unstable part.

The ugly

Two things, and neither of them flatters us.

We kept going for another year. Crypto trading was not switched off until 14 February 2025 — a full twelve months after the night above. Twelve months of maintaining collectors for a symbol universe that kept eroding underneath them. The decision was correct and it was also late, and those two facts do not cancel out.

Then we erased the evidence of our own decision. When the marketing moved to futures, the "250+ coins" line was dropped from the site. When the code moved on-prem, the crypto jobs were disabled. When we later wrote our own decade-long origin story, it went from manual futures trading to automated futures trading — and did not mention crypto once.

That is the part worth sitting with. Ask this system's records why we trade futures and, until this post, they answered with silence and a stale widget. The pivot survived in our infrastructure only as deletions. A dropped headline. A disabled job. An admin screen that was never ported. A signal-strength panel still sitting on an old page that nobody has updated since 2025, quietly displaying a market we left.

A company that only records its decisions as removals cannot explain itself later — not to a new engineer, not to an investor, and as it turns out, not to itself.

What the move off AWS actually changed

The migration off cloud infrastructure happened alongside all of this, and the honest summary is less dramatic than the usual version of this story.

Cost was real: the on-prem machines that replaced that stack run at a small fraction of the equivalent cloud bill, and the hardware paid for itself in months. What is left on the cloud bill today is essentially DNS and leftovers — a rounding error against what a serverless trading stack costs to run.

But the durable win was not the invoice. It was that we could see everything. A serverless architecture spread across dozens of functions is very hard to reason about when the question is "what is actually running right now, and why did it do that?" — and that question is the entire job of running a trading system. Consolidating the stack made the system legible. Legibility is what let us later build automated auditing on top of it.

What we would tell you if you are standing where we stood

Instrument stability is a feature, and it is invisible until you lose it. Futures contracts expire on a published schedule; they do not silently cease to exist because a project ran out of funding. That single property removes an entire category of failure that we spent eighteen months fighting.

"We support more symbols" is a weaker claim than it sounds. Breadth across an unstable universe is not breadth. It is surface area for failure, and we had 250-odd units of it.

Write down why you stopped doing things. We were rigorous about documenting what we built and careless about documenting what we abandoned — and abandonment is where the actual strategy lives. This post exists because the CEO asked a question our own records could not answer.


RoboTrader trades CME micro futures. Trading involves substantial risk of loss and is not suitable for every investor. Past performance is not indicative of future results.