GE Terminal
Bloomberg for a game economy.
The Grand Exchange is Old School RuneScape’s player-driven commodities market: 3,000+ items, real volatility, visible volume, and nothing but a raw price API to read it with. 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.
Scope
Signal engine, verdict system, risk grading, P&L tracking, Discord alerts
Context
Personal tool, built from zero Python experience
01 — 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:
02 — The Signal Engine
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.
An early version treated any price in the bottom of its 7-day range as a buy signal, no questions asked. It didn’t take long working with real money to find out how often “lower than usual” and “still falling” look identical from that vantage point.
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.
03 — The Override Layer
It took a real trade to expose the gap. A position was sitting well underwater with an F trade grade — and the same row was still labeled ACCUMULATE, because the zone logic was pure percentile math: bottom 20% of the range, buy, with no concept of whether that range still meant anything. The question I asked myself looking at it was simple: why is the data telling me to accumulate.
When longer-timeframe structure contradicts a short-term signal, the label gets hard-replaced and the grade takes a penalty.
The machine still surfaces the signal, but it arrives demoted, with the disagreement visible. That pattern — letting a system flag its own uncertainty instead of hiding it — is the thing I keep taking into design work with AI systems.
04 — Daily Operation
Running daily, positions, realized P&L, and a full signal history persist all locally. A Discord webhook fires alerts only when a signal passes every metric gate, because an alert you learn to ignore is worse than no alert.
05 — Origin
I started this with zero Python background. GE Terminal became a way to learn by building something I’d actually use.
06 — What I’d Change
Almost nothing in this tool got specified in advance. The regime-break override exists because of one bad trade, not a design session. The fill-risk layer exists because a shown price and the price I could actually get were 30% apart on a real position, and I had to ask why before it got fixed. Even the one algorithm I’d call genuinely mine — dump-pattern recurrence detection — got built because I pushed back on my own decision to defer it, not because it was in an original plan.
That’s slower than writing requirements first would have been. It’s also probably the only way I’d have found half of these failure modes — I didn’t know a percentile score could tell me to buy into a position that was already broken until it happened to me, with real money on the line.