After stabilizing execution and cleaning up training behavior, I moved into a deeper optimization pass on SOUN (SoundHound AI).
Almost immediately, something felt wrong.
Over a multi-year window, SOUN’s broader trend is clearly positive — yet my “optimized” strategy could still produce near-total drawdowns.
That’s not just disappointing.
That’s a diagnostic signal.
A strategy can lose money in a bull market.
But losing that badly, while trading that actively, usually means the system isn’t just wrong…
…it’s wrong in the same direction over and over.
What I Was Seeing: Trend-Fighting Behavior
When I watched individual trade sequences, a pattern kept showing up:
- Shorting strength
- Buying weakness
Not occasionally.
Consistently.
It wasn’t missing the trend.
It was leaning against it.
That’s a classic anti-correlated signature.
The Uncomfortable Thought
Instead of immediately tweaking indicators or parameters, I stopped and asked a harder question:
What if the strategy’s intent is inverted?
Not “slightly off.”
Not “needs tuning.”
Actually flipped.
So I tested a simple but uncomfortable idea:
Same data.
Same signals.
Opposite trade direction.
The result shocked me.
Performance improved dramatically.
That immediately told me this wasn’t a tuning problem.
It was structural.
Where It Came From: Candle Ordering
Digging deeper, I found that in some ingestion paths, candle data was arriving:
Newest → Oldest
Most indicator pipelines assume:
Oldest → Newest
When that assumption breaks:
- Momentum math can invert
- Crossovers can flip sign
- Trend confirmation can become trend rejection
The worst part?
The code still runs.
Logs still look reasonable.
Nothing crashes.
You just get a system that executes perfectly…
in reverse.

The Fix: Making Signal Generation Order-Invariant
I changed the signal generator so ordering no longer matters.
Before any indicators are computed:
- Bars are explicitly sorted chronologically
- If reversed ordering is detected, a one-time warning per symbol is logged
This turns a silent catastrophic bug into a visible, diagnosable condition.
It also explains a huge amount of historical weirdness.
What Changed in the Numbers
Internal diagnostics on the same data slice:
- Before fix: roughly ~-60% return with ~7,000 trades
- After fix: roughly ~+176% return with ~3,000 trades
The trade count drop matters just as much as the return.
Fewer trades → less churn
Less churn → fewer fees
Fewer fees → edge has room to exist
Reducing Churn Without Hard Locks
Once directionality looked sane again, another behavior stood out:
Capital rotation flip-flopping.
Enter A
Rotate to B
Tiny wiggle
Rotate back to A
To address this, I implemented adaptive hysteresis — a soft re-entry penalty.
When a symbol exits due to:
- TRIM
- ROTATE
- REALLOC
…it gets temporarily marked as a “recent exit.”
On subsequent scans:
- Max penalty: 20 confidence points
- Half-life: 180 seconds
That means the system needs stronger evidence to jump right back in, but isn’t hard-blocked.
It stays adaptive, just less twitchy.
The Second-PC Training Workflow
Another operational change: heavy optimization now runs on a separate machine.
Flow:
- Run optimizer on second PC
- Score configs
- Deploy winners to production
Production stays focused on execution.
Experimentation stays isolated.
Fewer moving parts in the live environment.
How I Think About This Now
Building trading systems isn’t about clever indicators.
It’s about layers:
- Fix correctness
- Fix behavior
- Fix operations
Only then do indicators really matter.
Takeaway
If your bot feels like it’s fighting the tape:
Don’t start by rewriting the strategy.
Start by proving the system is reading time in the right direction.
Because edge doesn’t usually disappear in a dramatic explosion.
It bleeds quietly.
Risk note: Sentinel Trader is experimental software. Past results don’t guarantee future performance. Always paper test and size conservatively.



