‹ all projects
Personal project · 2016–2017

Arbitraging an MMO economy with a homemade price tracker

A game with a player-driven free market, an arbitrage seam, and no API to read it. So I built a pixel-by-pixel price reader, a bot fleet to feed it, and a nightly engine that told me what to buy and sell. At its peak I was sitting on about three billion in in-game currency.

computer visionautomationmarketsfor fun
Arbitraging an MMO economy with a homemade price tracker

The opportunity

As a student I played an MMO with a sprawling, player-run marketplace. People set their own prices, opened their own shops, even paid for extra listing visibility. A proper free market, and I was hooked: if you could see the prices move, you could buy low and sell high, with real in-game money on the table.

An illustration of how the marketplace worked: every listing was one player's own shop, priced by hand, so identical goods sat side by side at wildly different amounts, from an 80-gold herb to 24-million-gold gear, and some sellers even paid to boost a listing's visibility

The whole opportunity is what happens when you line up one item across every shop selling it:

An illustration of the arbitrage seam: the same item offered by six different shops, sorted cheapest to dearest, with a roughly 3× gap between the low and high seller. Buy from the bottom of that ladder, sell into the top.

Reading a screen that didn’t want to be read

The game ran in its own desktop client. No browser, no API, nothing to intercept. I installed and configured at least five different OCR engines before admitting the fastest option was to write my own; I regret not starting there. Off-the-shelf OCR choked on the 9-pixel market font anyway. So I built my own reader: a fleet of game accounts saved a 77×11-pixel crop of each item’s best price, and a decoder thresholded the crop, sliced it into nine fixed digit cells, and read each digit through a hand-built decision tree that checks at most nine single pixels per cell. A “1” takes exactly one. The Java project’s real name is OdioGliOcr, “I hate OCRs”.

The pixel reader at work in the rebuilt demo: a real archived crop, magnified, with the probe pixels and per-cell decode overlaid

The machine around it

The reader was the middle of a pipeline that ran every night for about four and a half months, from autumn 2016 into February 2017:

The nightly verdict for Diamante, re-run in the demo: "Compra subito!!!" with the flags that fired, exactly as the original wrote it to instaBuy.txt in February 2017

It even drew charts for every item, straight out of 2017:

One of the tool's own nightly renders: daily average and a 5-day-vs-previous-5 comparison for Diamante, drawn by the original Java pipeline

Rebuilt in the browser

In 2026 I dug the archive out and ported the tool’s logic to the browser, line for line. It isn’t a simulation: the page carries the real archived screenshots and the real price logs, and the port is verified against the archive. It re-decodes 1,677 stored crops into exactly the prices the tool logged in 2017, and a signal re-run “as of 10 Feb 2017, 18:00” reproduces the original’s final call for all 193 items, down to the flags each verdict fired and the means to the integer.

Launch the interactive demo

Runs entirely in your browser. Watch the pixel decoder work through real screenshots probe by probe, then scrub months of real market history while the buy/sell engine re-issues its verdicts. The game stays unnamed.

Months of real Diamante prices in the demo, with every day's re-computed verdict. The green triangles are the nights the tool said "buy now".

What the returns looked like

I bought the lows and sold the highs, and at one point I was sitting on about three billion in in-game currency. That number is meaningless without the mechanics: the most expensive items in the game ran around fifteen billion, and there was a real-money market for that kind of currency. Trading it for real cash would have been a heavy terms-of-service violation, so I stayed clear. Part of me still regrets not daring.

The trades that paid best usually came from other people’s mistakes. That felt more sad than funny.

The other thing I got out of it was a close look at how an economy behaves when the underlying resources are effectively infinite, as they are in most games: prices anchor to habit more than to scarcity, which makes each deviation an unusually honest signal.

Why it ended

Four and a half months in, the fun ran out. I’d solved it, and a game loses its charm when you have full knowledge over the rules and how to win. If I did it again, I’d automate the buying and selling as well. I think I might already have; I don’t fully remember.

Notes

Nobody asked me to build any of this. I just don’t like leaving a system unread, games included. The nightly pipeline lived in a class called ProbablyNotAgileAndAlsoDeprecated.java.

next project: Turning real stories into an AI-illustrated exhibition →