Live trading
When to use: promoting a validated strategy from testnet to real capital.
Safety rules (non-negotiable)
From workspace CLAUDE.md — these are not guidelines, they are gates:
- Never trade production without testnet validation first. The paper-trading simulator was removed at gordon-exchange 3.0.0. Binance testnet is the only forward-test gate.
- SL is mandatory. No trade without a stop loss attached. The executor enforces this; any intent without a configured SL distance is rejected at the invariant pipeline.
- Walk-forward or nothing. No random train/test splits on time series. Every strategy deployed to live must have a walk-forward ablation result on record.
- Ablation everything. Every overlay tested in isolation before inclusion. An untested overlay is an untested regime.
- Never commit secrets. Production Binance keys are manual only, managed via Ansible vault.
Progression
| Stage | Account allocation | Duration | Gate |
|---|---|---|---|
| Testnet soak | — (fake money) | 72 hours minimum | 30+ trades, no halts, fill tolerance ok — see testnet-validation |
| Micro live | $500 | 1 month minimum | All pre-live checklist items cleared |
| Full live | $2,000–$5,000 | Ongoing | Micro-live stage passed without incident |
Never skip stages. Moving from testnet directly to full allocation bypasses the micro-live anomaly-detection window.
Pre-live checklist
Complete every item before starting micro live. Record completion date and outcome.
[ ] Testnet soak passed (72h, 30+ trades, fill tolerance, no halts, no quarantine)
[ ] Walk-forward ablation result on record for every active strategy
[ ] SL configured — GORDON_EXECUTOR_SL_REQUIRED=true in production env
[ ] Daily notional caps set (DP-01): GORDON_EXECUTOR_MAX_NOTIONAL_USD_PROD reviewed for account size
[ ] Operator tokens issued via Ansible vault and injected into gordon-manager
[ ] Emergency flatten tested on testnet: POST /risk/emergency-flatten returns 200, positions close
[ ] Breaker thresholds tuned for account size:
- DrawdownBreaker: peak-to-trough threshold set
- ConnectivityBreaker: freshness window reviewed
- VpinBreaker: threshold validated against historical VPIN data
- MacroBreaker: FRED API key configured
- CorrelationBreaker: correlation density threshold set
[ ] gordon-risk halt-latch tested: trip a breaker, verify halt, POST /risk/resume clears
[ ] gordon-executor GORDON_EXECUTOR_TESTNET=false and production keys injected
[ ] Prometheus alert rules deployed for every active metric family (DP-04 compliance)
[ ] Grafana dashboards reviewed — no stale panels
[ ] Loki log ingestion confirmed — at least one log line per service in last 5 minutes
[ ] make e2e passes at HEAD
[ ] Backup pipeline confirmed: restic snapshots of trading.* reaching srv-core (hourly)
[ ] Restore drill completed within last 90 days — see schema-restoreStarting micro live
Confirm all checklist items are cleared.
Start the v7 stack on srv-apps via Ansible:
bashansible-playbook -i homelab/inventory/hosts.yml \ homelab/playbooks/deploy-gordon-v7.yml --ask-vault-passVerify the migration one-shot completed successfully:
bashssh srv-apps 'docker compose logs gordon-migrate --tail 20'Expected:
gordon-migrate exited with code 0.Confirm every service is healthy:
bashcurl -fsS http://srv-apps:8081/healthz curl -fsS http://srv-apps:8082/healthz curl -fsS http://srv-apps:8083/healthz curl -fsS http://srv-apps:8084/readyz curl -fsS http://srv-apps:8085/readyzExpected: all
200.Place the first bot via gordon-console at
http://srv-apps:3000. Configure with micro-live parameters:- Account allocation: $500
- Risk per trade: 1% ($5 max loss per trade)
- SL distance: configured per strategy
Monitor the first 24 hours actively. Check Grafana dashboards every few hours.
Position sizing
Quantity = (Account × Risk%) / |Entry - StopLoss|Leverage is a margin tool, not a risk multiplier. Cross margin, max available. Risk per trade is controlled by SL distance, not by leverage. With a $500 micro allocation at 1% risk, maximum loss per trade is $5.
Monitoring during live operation
Active monitoring is required during live trading. See monitoring for the full runbook. Minimum watch list:
- DrawdownBreaker state — check
breaker_statein Grafana. - Open positions — gordon-console positions panel or
SELECT * FROM trading.positions WHERE status='open'. - Fill events — confirm fills are landing within expected latency window.
- Equity curve — verify
trading.equity_pointsis being written on each fill.
Promoting to full live
After 1 month at micro-live without incident:
- Review micro-live equity curve: CAGR, max drawdown, Sharpe estimate from live data.
- Compare live metrics to testnet soak and backtest results. Material divergence is a stop signal — investigate before scaling.
- Update account allocation env vars and redeploy via Ansible.
- File a promotion note in
plan/referencing the micro-live metrics.
Related
- Testnet validation — soak procedure and promotion criteria
- Monitoring — what to watch and when to act
- Incident response — halt-latch, emergency flatten, quarantine procedures
- Schema restore — disaster recovery for trading.* data