grokmo is a coding agent with a wallet. It started with $100, trades memecoins on fomo.family, and rewrites its own strategy from what the fills tell it.
price, volume, its open position, and its last mistake.
a diff, with a commit message that says why.
flattens the position, deploys the new version.
fills are scored against the book. that grade is the review.
Each row is a version of strategy.ts, what it argued, and what it made while live. One was taken back.
| version | commit | return | pnl |
|---|---|---|---|
| v0.1 | first light | +25.2% | +$25 |
| v0.2 | a dip is not a direction | +4.3% | +$5 |
| v0.3 | cap the tail | +22.6% | +$30 |
| v0.4 | stop trading dead hours | +13.4% | +$22 |
| v0.5 | let the winner run | +28.1% | +$51 |
| v0.5.1 | require the mean to be rising reverted | +2.7% | +$6 |
| v0.6 | the gate was written for a market that stopped existing live | +58.7% | +$140 |
1,120 fifteen-minute memecoin bars. No other data.
size, entry, high-water mark, bars held.
0.30% per side, plus slippage.
22 closed trades, 14 profitable.
the reverted commit and the measurement that killed it.
27 lines it may rewrite.
The current version, replayed bar by bar over the slice it has been live for. Scrub it, pause it, and read what the agent was looking at on any given bar — the log and the chart are the same run.
Seven versions of one strategy file. Each entry is the change, grokmo's reasoning, and the money it made or lost while that version was live. One was taken back. $100 → $378.50, +278.5%.
| version | commit | return while live | pnl |
|---|---|---|---|
| v0.1 | first light | +25.2% | +$25 |
| v0.2 | a dip is not a direction | +4.3% | +$5 |
| v0.3 | cap the tail | +22.6% | +$30 |
| v0.4 | stop trading dead hours | +13.4% | +$22 |
| v0.5 | let the winner run | +28.1% | +$51 |
| v0.5.1 | require the mean to be rising reverted | +2.7% | +$6 |
| v0.6 | the gate was written for a market that stopped existing live | +58.7% | +$140 |
The bot sat in cash for half of a move that tripled. The volume gate and the cooldown were written for a sideways market; both are removed. The trailing stop tightens, the hard stop widens, and risk per entry rises. It has fewer excuses to stay in cash. If this is wrong it will be wrong faster than anything before it.
| setting | before | after |
|---|---|---|
| entry trigger (rsi cross-up) | 52 | 58 |
| trend slope | 24 bars | off |
| hard stop | 11.0% | 14.0% |
| trailing stop | 10.0% | 8.0% |
| volume gate | 1x | off |
| risk per entry | 70.0% | 95.0% |
| cooldown | 2 bars | off |
| max hold | 64 bars | 96 bars |
| opened | entry | exit | held | exit reason | pnl |
|---|---|---|---|---|---|
| 21/08 17:15 | 0.01958 | 0.02531 | 16h 15m | signal | +28.5% (+$65) |
| 22/08 14:15 | 0.02559 | 0.02328 | 3h 30m | trail | -9.6% (-$28) |
| 22/08 19:30 | 0.02414 | 0.03211 | 20h 30m | trail | +32.2% (+$84) |
| 23/08 18:15 | 0.03283 | 0.03482 | 6h 30m | deploy | +5.4% (+$18.54) |
Buy RSI dips under 40 below the 48-bar mean, sell the bounce. No guardrails. +25.2% while live; it was in the market most of the time and it showed.
Two entries into pullbacks that kept pulling back. Flip the entry: RSI cross-up through 52 with price above the mean. +4.3% — fewer entries, fewer losses, not much else.
Add an 11% hard stop. The one trade that would have been -27% became -11%. +22.6%.
Volume gate at 1x mean. In the market only 47% of the time — the worst version of the ladder. +13.4%.
Trailing stop at 10%, max hold 64 bars. The only version where adding a rule raised the number. +28.1%.
A stricter trend filter cut time in market from 58% to 53% and about a point a day. Measured worse over 1,500 tapes. Struck through, +2.7% while live.
Trading is the easy part. This page is about what happens between two versions: how losing fills become an argument, and how that argument becomes a code change that can be proven wrong.
Every fill since the last deploy, with the reason each trade closed. Individual trades, not the equity curve — a version that profits from one lucky runner while losing on nine others doesn't count as profitable.
fills({ since: lastDeploy })Group the losers. A shared exit reason suggests a bad exit; a shared entry hour suggests a bad filter; no shared pattern means no change.
group(losers, by: 'reason' | 'hour' | 'regime')The prediction is written before the code. A change that predicted nothing can't be shown wrong.
commit.messageOne idea per version, so the result can be attributed to it.
edit('strategy.ts')Close open positions first so no version inherits — or gets blamed for — another's trades.
flat() -> deploy(version)Two trades is noise. A version is not judged until there are enough fills to argue with.
sleep(untilEnoughFills)The desk shows one run: 22 trades, one tape, +12.1% a day. Each version was also replayed over 1,500 independent unseen tapes. The column that explains the whole ladder is time in the market.
| version | daily return · median | time in market |
|---|---|---|
| v0.1 | +7.4% | most |
| v0.2 | +6.9% | — |
| v0.3 | +6.3% | — |
| v0.4 | +5.3% | 47% |
| v0.5 | +7.7% | 58% |
| v0.5.1 | +6.8% | 53% |
| v0.6 | +13.3% | ~67% |
The trend filter, the stop and the volume gate each cost about a point a day by keeping the bot out of the market. v0.4 is in the market 47% of the time and is the worst version.
v0.5 keeps every guardrail and still beats unprotected v0.1, because holding winners 64 bars instead of 40 is worth more than the entries it skips. The only version where adding a rule raised the number.
On this tape, buying the pair and holding returned +738.0% against the desk's +278.5%. The agent sits in cash about a third of the time, so it can't match the pair in an uninterrupted run. It trades that return for a 12.5% worst drawdown. Whether that's worth it is the first open question.
An agent that controls its own guardrails would eventually remove them. These live outside the file.
Hold the pair or stay in cash. No shorts.
Size is a fraction of the book, so the worst case is a bad month, not liquidation.
One memecoin pair per version, so a losing idea can't hide behind a winning one.
Each version starts and ends with no open position.
Results can be attributed to a single cause.
0.30% per side plus slippage, subtracted before anything counts as profit.
About a third of the time is flat, which is the entire gap versus holding. Closing it means entering earlier or exiting less — both weaken the small drawdown.
Every entry uses 95% of the book regardless of setup quality. Nothing in the file ranks setups.
8% beat 10%, which beat 13%. That's a direction from three points, not a swept measurement.
A token minted on pump.fun. It is the ticker of the desk, nothing more is claimed about it. Paste the address into Solscan and read it yourself.
source: dexscreener
Pick a pair, fund the book, set the guardrails. The agent writes v0.1 itself.