CLI dashboards
User lane: use dashboards and health checks only. Developer/operator lane handles sweeps, optimization, and retraining.
python scripts/dashboard.py # trade performance summary
python scripts/performance_monitor.py # detailed metrics report
Log files
These are runtime files, gitignored, and not written in --dry mode.
| File | Contents |
|---|
trade_log.csv | Per-trade log (append-mode) |
blocked_signals.csv | Every blocked signal + reason |
state.json | Circuit breaker + daily counters (survives restarts) |
logs/trades.csv | Structured trade log |
logs/signals.csv | Every signal + execution decision |
logs/daily_summary.csv | Daily aggregated stats |
trade_notifications.log | Full text of all Telegram messages sent |
Model health check
Run this any time to verify the models and feature config are in sync:
python3 -c "
import json
mc = json.load(open('models/model_compat.json'))
ml = json.load(open('ml_config.json'))
assert mc['feature_count'] == len(ml['features']), 'MISMATCH'
print('OK -- features:', mc['feature_count'], '-- trained:', mc['trained_at'][:10])
"
If this returns MISMATCH, the models were not trained with the current feature config. Pull the approved model revision from R2 before going live.
Parameter sweeps (no retrain required)
Developer/operator lane only. Regular users should run onboarding, select profile 1-5, pull approved model revisions from R2, and run trading.
These scripts test combinations of config parameters using OOS backtests. No model retraining needed — safe to run any time.
Position model thresholds
# Core 8 configs (exit_threshold, min_prob_diff, min_bars_held)
python scripts/sweep.py --target pos
# Extended sweep including partial_close, trailing, Kelly (13 configs)
python scripts/sweep.py --target pos --full
Signal and execution parameters
# Confidence threshold + min_probability_diff
python scripts/sweep.py --target signal --mode confidence
# TP/SL ATR multipliers
python scripts/sweep.py --target signal --mode sltp
# risk_percent + max_consecutive_losses
python scripts/sweep.py --target signal --mode risk
# All of the above (~68 configs)
python scripts/sweep.py --target signal --mode full
# Custom single-axis sweep
python scripts/sweep.py --target signal --mode custom \
--param dynamic_sltp.tp_atr_multiplier \
--values 0.7 0.8 0.9 1.0 1.2
All sweep scripts save results to results/sweep_*.csv and print a ranked table sorted by:
Compare two configs
python scripts/compare_configs.py \
--old-config config_old.json \
--old-ml ml_config_old.json \
--old-label "before" \
--new-label "after"
PM2 process management
pm2 logs novosky # tail live output
pm2 status # process health
pm2 restart novosky # restart
pm2 stop novosky # stop gracefully
pm2 monit # interactive dashboard
Supabase parity checks (live)
Use these checks when debugging dashboard mismatches.
# Broker open tickets
curl -sS -H "Authorization: Bearer $API_TOKEN" "$API_URL/positions?symbol=BTCUSD" | jq 'map(.ticket)'
# Supabase open tickets for this bot
curl -sS "$SUPABASE_URL/rest/v1/open_positions?bot_name=eq.$SUPABASE_BOT_NAME&select=ticket&order=updated_at.desc" \
-H "apikey: $SUPABASE_KEY" -H "Authorization: Bearer $SUPABASE_KEY" | jq 'map(.ticket)'
# Recent closed trades
curl -sS "$SUPABASE_URL/rest/v1/trades?bot_name=eq.$SUPABASE_BOT_NAME&select=ticket,closed_at,profit,result&order=closed_at.desc&limit=20" \
-H "apikey: $SUPABASE_KEY" -H "Authorization: Bearer $SUPABASE_KEY"
If broker and Supabase open tickets differ, first ensure the bot process is actually running (pm2 status).
open_positions reconciliation happens from the live heartbeat loop.