Grand Exchange “GE” Terminal
Market intelligence for a 4,700-item game economy.
Context
The Grand Exchange is Old School RuneScape’s player-driven commodities market: 4,700+ items, real volatility, visible volume, and nothing but a raw price API to read it with. Grand Exchange “GE” Terminal is the market intelligence terminal I built and run daily, with a layered signal engine, verdicts that explain themselves, and an override that keeps a human in the loop.
4,700+
4
2,400+
18+
1
Problem
Flipping items on the Grand Exchange is a decision-making problem under noisy data. Prices spike and crash hourly, some items dump on predictable cycles, and the wiki’s raw price API tells you what happened without telling you what it means.
Every trade came down to the same question
“Is this signal real, or am I about to chase a correction?”
Solution
GE Terminal answers that with a layered signal engine. It pulls live and historical prices across four timeframes, scores movers on momentum and volume, then runs each candidate through graded buy and sell checklists before anything surfaces as an action.
Grading the market before looking at the signal
A momentum scanner’s failure mode is enthusiasm. Every violent move looks like an opportunity, and the biggest movers are almost always the worst trades; thin, wide-spread items where the move is two people trading at once. So the market gets graded first: range width, volatility, volume, spread, sample depth, each subtracting from a 100-point start. Below 45, and an item is graded with an F, and with the Trade grade ≥ B filter on, F never becomes an action.
The extreme case is a hard stop. If price breaks below its own 7-day floor, the zones the signal was derived from stop being valid, so the label is replaced with BROKEN and the grade takes a −60 penalty, enough to fail an item on its own. It fires rarely, because once an item crashes, the floor moves down to meet it. Most suppression happens in the grading.
Surface every mover, or suppress by default?
The obvious build surfaces the biggest movers. That’s what a scanner is for, and it’s what makes the tool feel alive but it’s also how you train yourself to ignore your own alerts. The market gets graded before the signal does, and what reaches Discord clears a floor I set, plus anything I hold or watch.
Two scales, one word
Two grade systems run in parallel, measuring different things. Trade grade asks whether the item is worth trading at all: range width, volatility, volume, spread, sample depth. It’s a property of the market and it barely moves hour to hour. Signal grade asks whether right now is the moment: three checklist questions, rescored on every refresh. Is this a dip rather than a trend? Is there room to move? Are buyers in control?
Verdicts that explain themselves
A verdict engine weighs 7-day, 30-day, and 90-day percentile position into plain-English calls, from SELL NOW to DON’T SELL, each with its reasoning attached. Nothing appears on screen without a letter-grade and a reason why. Dump detection doesn’t just classify the drop, it also measures how long recovery historically takes.
In Use
Eighteen-plus versions, running daily, still the tool I trade with.
Early versions had no exit logic at all. I’d buy into something that looked like it was climbing and then sit on it, holding inventory I couldn’t read: no sell zone, no sense of whether it was coming back or whether I should take the loss. That’s where the verdict engine came from, and the recovery window with it. The tool learned to tell me when to get out because I’d already proved I couldn’t work it out myself.
Learning
The thing I’d fix first isn’t a feature. I let six classification systems accumulate in parallel, each with its own vocabulary. Individually every one is defensible; they were added months apart, each solving a real problem.
None of this was a decision so much as an accumulation. Each system arrived with a feature, named itself sensibly in isolation, and never got reconciled against the ones already there. The cost isn’t confusion inside any single card; every card is readable. It’s that fluency doesn’t transfer. Learning what ACCUMULATE means teaches you nothing about what HOLD or WAIT means, even though they’re the same measurement over a different window.
The fix isn’t fewer states, it’s fewer vocabularies. Zone and Verdict collapse into one percentile scale with a timeframe parameter. Signal grade and trade grade stop surfacing as letters at all and exist only as inputs to tier. Six scales down to three, and each remaining answering something the others can’t: where the price sits, whether the item is worth trading, and whether to act now.
No single naming decision was wrong because each one was sensible when it was made. However, across eighteen versions I never asked whether they still added up to one language.
Origin
I started this with zero Python background. GE Terminal became a way to learn by building something I’d actually use. 18+ versions later, it isn’t shipped software, but it’s built like it wants to be: cached API layers, state persistence, alert thresholds a user can trust.
It’s what happens when the barrier between an idea and a working tool gets low enough that a designer stops waiting for an engineer.