Trust
DRY_RUN and the paper-trade checklist
DRY_RUN=true is the switch that keeps create_order off the wire. If that flag is optional, misspelled, or defaulted to live, you are not paper trading.
Going live with $50 “just to see” is still live. Size does not turn a market order into a simulation.
The flag
DRY_RUN=true
# in code: live only when explicitly false
if os.environ.get("DRY_RUN", "true").lower() != "false":
log.info("DRY FILL %s %s @ %s", side, symbol, price)
return FakeOrder(...)
Default must be dry. Missing env should not mean live. systemd EnvironmentFile= is how the service sees the flag — a shell export in an old SSH session does not count.
What to log while dry
- Time UTC, symbol, side, size, mark, assumed fee.
- Would-have PnL and drawdown.
- Zero real create_order in journalctl.
Print the checklist
The free setup list is VPS, keys, alerts, paper, kill switch. Do not flip DRY_RUN=false until every box is boring.
Before live
- Unit stays active overnight.
- Telegram “up” and halt messages make sense.
- You forced a fake red day and the daily loss limit halted.
- Withdraw is still off. IP allowlist is still the VPS.
Use Checklist in the header for the printable list. The paper-trade guide is the longer why.
Get the full walkthrough
The paid guide includes the source, config template, and deploy script. 50% off: $19.99 (was $39.99). One-time.
Get the ebook — $19.99Educational product. Trading can lose money. Not financial advice.