Most of us can now build a working trading bot in an afternoon. What almost none of the tutorials give you is a way to answer the only question that matters: **does this strategy make money, or does it just run without crashing?** Those are different questions. Joseph made this split really clearly in his posts here — strategy evidence and operational readiness are independent, and a bot that never errors while trading a worthless strategy is a very efficient way to lose money. I want to show the missing half: how to get strategy evidence cheaply, in minutes, before anything touches an exchange. I'll use a real worked example, including the part where I found a bug in my own test. ### The trap that started this I deployed a bot on a 4-hour schedule and planned to paper trade for 72 hours to "see how it does." Then I did the arithmetic: - 72 hours ÷ 4-hour cron = **18 evaluations** - Historically, only **0.9%** of evaluations on that timeframe produced a trade - Expected trades in 72 hours: **0.16** I was going to wait three days to collect approximately zero trades, and then probably deploy anyway. Forward testing at low frequency is almost useless for judging a strategy. A backtest produced **2,581 trades in three minutes**. ### The one rule that makes a backtest mean anything **The backtest must run the exact same code the bot runs.** If you reimplement the strategy in your backtest, you are validating code that never trades, and trading code that was never validated. They drift, silently. The fix is simple: extract the decision logic into a shared module both import. ``` strategy.js <- indicators + entry/exit decisions, pure functions | +-- bot.js (live/paper: prints, places orders) +-- backtest.js (replays history) My backtest asserts indicator parity on every run and **refuses to print results** if the numbers diverge from what the live bot computes. That assertion is worth more than any statistic in the output. ## Bias controls you need or the numbers lie