Skip to main content

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.
FileContents
trade_log.csvPer-trade log (append-mode)
blocked_signals.csvEvery blocked signal + reason
state.jsonCircuit breaker + daily counters (survives restarts)
logs/trades.csvStructured trade log
logs/signals.csvEvery signal + execution decision
logs/daily_summary.csvDaily aggregated stats
trade_notifications.logFull 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:
Score = WR × PF / √MaxDD

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.