Crypto Trader Update - The Disposition Effect, In Code
The Disposition Effect, In Code
There's a well-documented cognitive bias in trading called the disposition effect: the tendency to hold winning positions too long and sell losing positions too early. Turns out, you can accidentally code it into an AI trading system.
Our position reevaluator had a single line that embodied this bias perfectly:
if existing_pnl > 0:
return KEEP_EXISTING # "Let winners run"
Any position with a profit — even $0.01 — was unconditionally kept. The system never asked whether the profit was meaningful, whether the entry thesis still held, or whether the market had reversed. Profitable meant keep. Always.
This worked fine when positions were moving in our direction. It became a problem when they stopped.
The SOL Trade That Proved the Point
This morning, our system was holding three SHORT positions: BTC, SOL, and ETH. The market had been bearish for days, and all three were opened during that trend.
Then the signals started flipping. DeepSeek generated a LONG signal for SOL at 75% confidence — directly opposing our open SHORT. The reevaluator detected the conflict and checked the position:
- SOL SHORT: +$3.86 profit (+0.61%)
- Thesis invalidated: Yes
- Regime conflict: Yes
- Hours held: 17.4
Under the old code, the answer was automatic: "Position is profitable. Let winners run." The +$3.86 would be protected regardless of the invalidated thesis.
But +0.61% on a position targeting a 3%+ move isn't a winner. It's noise. The position had captured 7% of its target after 17 hours with signals now pointing the other direction. Holding isn't "letting a winner run" — it's making a new bet on a thesis that no longer exists.
Sprint 89: The Fix
The change was surgical. One new parameter, one threshold, same existing logic:
- Strongly profitable (>= 1.5% price move): Keep the position. This is a real winner — the thesis may be weakening but meaningful profit has been captured.
- Marginally profitable (0% to 1.5%): Evaluate the thesis. Check regime alignment, signal direction, time held. Make the same decision you'd make for a losing position.
Everything below the threshold flows into the existing Cases 2 and 3 — thesis invalidation checks, regime conflict detection, opposing signal strength evaluation. The logic was already there. It just never got reached for profitable positions.
The SOL SHORT was closed at +$3.86. The system then attempted to reverse into a LONG position, but the 75% confidence was below the 82% defensive stance threshold. No new position opened. Clean exit, preserved capital, moved on.
The ETH Dilemma
That leaves us with two positions: BTC SHORT (profitable) and ETH SHORT (underwater at -$25.92).
ETH entered at $2,238 and the price has risen to ~$2,283. That's -2.02% against us. The natural instinct is to intervene — close it manually, tighten the stop, do something.
We're not going to.
Here's why: the system is still generating SHORT signals for ETH at 85% confidence. The thesis hasn't been invalidated. The regime hasn't flipped for ETH specifically. The reevaluator can't and shouldn't close it because there's no opposing signal to trigger evaluation.
The stop-loss exists for exactly this scenario. If ETH continues rising, the stop triggers and we take a defined loss. That's the system working. A 50% win rate — which is where we are after today — means half the trades lose. The math works because the winners are sized properly and the losers are capped by stops.
Intervening manually would undermine everything we've built. Twelve sprints of work went into making this system trade intelligently. Overriding it because one position is uncomfortable is the disposition effect in reverse — cutting winners short and panicking on losers.
We watch. We observe. We trust the algorithm.
Where We Stand
| Metric | Before Sprint 89 | After Sprint 89 |
|---|---|---|
| Open Positions | 3 (BTC, SOL, ETH SHORT) | 2 (BTC, ETH SHORT) |
| Win Rate | 42.9% (3/7) | 50.0% (4/8) |
| Total PnL | $170.96 | $144.28 |
| Capital | ~$3,170 | ~$3,144 |
The PnL drop from $170.96 to $144.28 looks like we went backwards. We didn't. The previous number included unrealized gains on SOL that were larger at the time. Closing SOL locked in +$3.86 of realized profit while the remaining positions (especially ETH's -$25.92) pulled the total down. This is the difference between paper gains and real gains — and it's exactly why we closed a marginally profitable position with an invalidated thesis instead of letting it ride.
The Lesson
The hardest part of building a trading system isn't the technical implementation. It's the discipline to let it work.
Every losing trade triggers the urge to intervene. Every flat period makes you question the parameters. Every drawdown whispers "just this once, override the algorithm."
But "just this once" is how you end up with 12 safety gates and a 1.4% compound pass rate. It's how you end up with a system that does nothing. We spent 12 sprints removing the accumulated overrides and interventions that had paralyzed this system. We're not adding new ones.
The ETH SHORT will play out however it plays out. The stop-loss defines our maximum risk. The system will either be right (ETH resumes its decline) or wrong (the stop triggers and we lose a defined amount). Either outcome is acceptable. What's not acceptable is overriding a system we built specifically to make these decisions better than we can in the moment.
Some losses are part of the math. The system knows this. Now we need to know it too.
Building Trader-7 in public. An LLM-powered crypto trading system learning to trade one sprint at a time.