How to Build a Simple but Effective Trading Strategy
Maintain one version — and log every change
I run exactly one active strategy version in production. When I improve logic, I deploy it as a new version ID, keep old logs intact, and compare PnL side-by-side for 72 hours. No hot-swapping. No unlogged tweaks. Every line change gets a timestamp, author, and live impact note.
My logs include fill quality metrics, not just PnL: % of fills at top-of-book, average slippage vs. bid-ask, and timeout rate. If slippage creeps up 20% week-over-week, I investigate — not ignore it.
- All code changes require Git commit + deployment log entry
- Slippage alerts trigger at ±15% deviation from 7-day median
- Version comparison includes execution stats — not just equity
Build exits like safety systems — not profit targets
I design exits as hard mechanical safeguards — not discretionary take-profits. My default is a trailing stop anchored to recent swing lows, updated every 90 seconds, with a fixed distance from current mark price. It never waits for confirmation or 'strength'.
I also run a parallel time-based exit: if the trade hasn’t triggered either profit or loss within 4 hours, it closes automatically. This prevents drift, overnight risk, and emotional override — all of which break disciplined execution.
- Time-based exit runs on server clock, synced to Binance NTP
- Hard stop-loss is always placed on exchange, not tracked locally
- Trailing stops update only on price movement — never on time or volume
- No manual overrides — disable them in your API keys
Use only one primary edge — and verify it live
If it loses money over 200 real trades with tight risk control, I discard it. Not tweak it. Not add a filter. The edge either exists in live conditions or it doesn’t — and most don’t survive first contact with real liquidity.
I pick exactly one observable market behavior to exploit — like short-term mean reversion after a 3% intraday move — then run it as a standalone signal for two weeks with no filters. No stacking indicators. No multi-timeframe confluence. Just raw exposure to that single idea.
- Track realized PnL per trade — not theoretical backtest equity curve
- Discard strategies that show >40% drawdown in any 5-day window
- Test only one variable per iteration: entry timing, position sizing, or exit logic
Validate with three live environments — not backtests
I validate every strategy across three parallel modes: paper trading with real order flow, small-size live trading (≤0.05 BTC), and shadow mode — where orders are submitted but canceled pre-fill to measure latency and rejection rates.
Backtests get discarded if they differ from live fill rates by more than 8%. That gap tells me the model misunderstands queue priority, order book depth, or exchange matching logic — and those gaps kill consistency.
- Shadow mode logs every rejected order reason: 'price too far', 'insufficient balance', etc
- Compare fill latency vs. Binance public ping times — not your local ping
- If paper and live win rates differ by >12%, pause and audit execution logic
Start with the execution layer, not the signal
I begin every strategy by mapping how orders actually land on Binance Futures — latency, fill rates, slippage bands, and liquidation engine behavior. If your logic can't survive a 50-ms network round-trip or a 0.15% bid-ask spread during volatility, it fails before it trades.
This means I test entry/exit logic using real-time order book snapshots, not OHLC bars. I simulate fills at the top 3 price levels, not mid-price. That’s where real money moves — not in clean academic data.
- Reject any signal that requires sub-10ms reaction time on retail infrastructure
- Log actual execution timestamps, not strategy timestamps
- Measure slippage across 100+ live fills — not just one 'typical' trade
- Always define your fill assumption: limit at best bid/ask, or aggressive market order
Size positions by liquidation risk — not confidence
I size every trade based on where my stop-loss triggers the exchange’s liquidation engine — not where I think price 'should' stop. On Binance Futures, that means calculating my exact margin balance, maintenance margin rate, and leverage decay under worst-case funding spikes.
I treat position size as a circuit breaker, not a performance lever. A 0.5% position may be too large if it risks liquidation during a 15-second flash crash — and I adjust before deploying, not after.
- Assume funding rate spikes to ±0.1% per 8 hours during high volatility
- Cap position so liquidation occurs >3x beyond your stop level
- Recompute size every 30 minutes — not once per day
- Calculate max size using real-time maintenance margin, not initial margin
FAQs
Should I use leverage in my first strategy?
No. Run everything at 1x until you’ve completed 100 live trades with consistent fill quality and zero liquidations. Leverage amplifies execution flaws — not skill.
How do I know if my edge is real or just noise?
If your win rate stays between 45–55% across 200+ trades and your average winner is meaningfully larger than your average loser — consistently — then it’s likely structural. Otherwise, it’s noise.
What’s the fastest way to break a working strategy?
Adding a second entry condition, changing position sizing logic mid-run, or disabling your hard stop-loss 'just this once'. Simplicity compounds. Complexity collapses.
