Will it rob me?
No — read-only
Your mate reckons he's got notes on your bot. Type the password he sent you.
A mate's review · read it and weep
Had a proper poke through it. Good news — it's not going to rob you. Bad news — the number you keep quoting me has been quietly cooking the books, and I've got the receipts.
Will it rob me?
No — read-only
Is the research good?
Annoyingly, yes
Cooking the books?
In 3 spots
Dependencies
Zero — respect
Credit where it's due, so the roast lands fair. Don't change any of this.
crypto_turtle_era.py) is exactly the thing that separates you from the "my backtest made 9000%" crowd. The edge surviving it (PF 1.72 vs 1.74) is your strongest card — lead with it.crypto_turtle_era.py:59) catching redenomination artifacts — sneaky-good touch.crypto_turtle.py:112) — picking coins on old data, judging on new, and admitting the ones you binned still made money. That's honesty most quants would quietly bury.So yeah — you clearly know what you're doing. Which is exactly why the next bit is embarrassing. 😏
Three things, all in your code, all inflating the number you keep sending me.
You literally wrote a concurrency cap — MAX_CONCURRENT = 5 in crypto_trend.py:33 — and then forgot to put it in the Turtle engine. So crypto_turtle.py:71 compounds every trade like you only ever hold one position at a time. Mate, that +2,676% ran through the engine that ignores 40 coins mooning at once — which is the exact drawdown risk your own notes flag. Copy your cap over and re-run it. I'll wait.
You're counting ~3,900 trades like they're all independent (crypto_turtle.py:88). It's crypto — when Bitcoin sneezes the whole book catches a cold. Thirty alts trending together isn't 30 bets, it's basically one. So that "seven sigma" is nowhere near seven. Cluster the trades by week, bootstrap the daily returns, or do a Deflated Sharpe that also docks you for all the variants you tried — that's the honest headline stat, and it'll be a lot humbler.
Flat spread of 0.12% (crypto_turtle.py:37) — and your two engines don't even charge the same fees. Breakout entries fill worse than that (you're buying into a rip), and you've modelled zero funding on shorts — a short that rides for a fortnight bleeds funding every 8 hours. Add real taker fees + slippage + funding carry and watch the short book get a lot less pretty.
Right now every script is a monolith doing everything at once, your two Turtle files are ~80% copy-paste waiting to drift, and your coin list is hardcoded in four places that already disagree — trend runs 20 coins, turtle runs 40. Split it up:
crypto-lab/
config/
universes.yaml # ONE coin list, not four that argue
costs.yaml # fees / slippage / funding, per venue
runs/turtle.yaml # a run manifest = reproducible result
cryptolab/
data.py # fetch + load + sanity checks
indicators.py # atr / ema / swings (with TESTS)
engine.py # ONE event loop, all strategies
strategies/*.py # signal only, nothing else
portfolio.py # the cap + sizing (used EVERYWHERE)
stats.py # PF, clustered t, deflated Sharpe
report.py # stamps each run w/ config hash + git SHA
The payoff: fix the cap once in portfolio.py and every strategy inherits it. And with run manifests, every number in your PROGRESS.md becomes "here's the config, re-run it yourself" instead of "trust me bro."
crypto_trend.py:40 — there's a spread_of() function full of forex stuff (gold, S&P, oil, JPY) sat in your crypto engine. It's also completely dead — you compute the real spread 40 lines later. It does nothing but look confused.crypto_trend.py:138 — a comment about "OANDA daily bars completing at 17:00 New York" and a date-minus-2 fudge. That's forex market hours copy-pasted into a 24/7 crypto engine, where it's flat wrong — crypto candles close at 00:00 UTC. That lag could be quietly misaligning your trend filter.fetch_crypto.py:11 — you define a coin list, then redefine it three lines down. The first one and the "DONE" set are dead. Housekeeping.P0 stop flattering the number
P1 make it reproducible
P2 go deeper
All of that makes the research better — it still doesn't make it live money. Even a clean, cost-stressed edge gets chewed up by real slippage, funding and latency (and that DEX counterparty risk you already clocked). So after P0–P1: paper-trade it small first and measure how far real fills drift from the backtest, before a single quid of size. Your "gauntlet" instinct is bang on — this just makes the gauntlet meaner.
MAX_CONCURRENT into a shared portfolio.py, added real costs (fee + slippage + funding) and swapped the fool's-gold t-stat for a clustered-t, a block-bootstrap and a proper Deflated Sharpe. Pure stdlib, nothing to install. Every number below is reproduced — unzip it and run it yourself.
| each row adds one honesty fix | 9yr return | maxDD | PF |
|---|---|---|---|
| as you reported it | +2,676% | 25.8% | 1.74 |
| + realistic costs (fee+slip+funding) | +1,820% | 30.4% | 1.64 |
| + concurrency cap of 5 (your own trend-engine rule) | −10% | 39.9% | 0.95 |
| sized sanely (0.10%/trade, keep every trade) | +235% | 13.5% | 1.64 |
And here's the tell you won't like: the return scales with how much stacking you allow. Cap 3 → −16%. Cap 5 → −10%. Cap 10 → +64%. Cap 20 → +347%. No cap → +2,676%. When a "strategy's" return is just a dial for how many correlated coins you hold at once, that's not alpha — it's leverage on one big bet against the dollar. Your survivorship version does the exact same thing (+366% → sized-real +71% at 5.5% DD).
I tried to kill the edge and couldn't. After proper costs, the per-trade edge passes everything:
So the real number is ~+235%/yr-basket over 9yr at ~13.5% drawdown — not +2,676%. A quarter of the flex, but it's a number you can say out loud without someone who does this for a living laughing at you. The research was always good. The headline was the only lie, and now it isn't one.
⬇ grab the patched engine (18 KB, zero deps)Unzip over your repo → python analysis/crypto_turtle.py → scroll to the HONEST RE-RUN block. HONEST-FIXES.md inside has the full write-up and the before→after for both engines. Signal logic untouched — your original numbers still print, mine print underneath, so you can audit every downgrade.
Reviewed off your actual source · crypto_trend.py · crypto_turtle.py · crypto_turtle_era.py · fetch_crypto.py · fetch_era_coins.py · PROGRESS.md
Update: fixes implemented + reproduced on your data (pure stdlib, no code of yours changed except recording entry dates). Still a mate's opinion, not financial advice — and still not me being nice.