AI ICT
AI ICT 交易辅助系统第一阶段工程实现。
当前项目已经具备从数据、结构、信号、执行、回测到报告的最小闭环,并提供轻量查询 API、HTTP 调试服务与一键编排入口。
See docs/ for architecture, database, rule, and migration references.
Database connectivity defaults to a 5 second PostgreSQL connect timeout. Override with DATABASE_CONNECT_TIMEOUT when needed.
Set MIGRATIONS_OUTPUT_JSON=1 when running run_migrations.py for a machine-readable migration summary.
Hard mainline requirement
All trading-analysis development must strictly follow docs/ICT交易全书_出版终校版.md and docs/AI_ICT_硬性主线约束_必须遵循ICT交易全书_2026-05-21_v1.md.
The trader-facing product must stay on this chain:
Range / Draw / Location
-> Liquidity / Sweep / Inducement / Path
-> Displacement / MSS / FVG / Retest / Session
-> backtest evidence
-> pre-market plan
-> intraday unique focus or no-trade reason
-> journal / study-notes feedback
Any capability that cannot serve this chain must stay out of the trader-facing UI and, if still needed for operations, belongs under System Ops.
Current closed loop
当前主线可运行链路:
OKX -> candles -> market_sessions -> swings -> dealing_ranges -> liquidity_pools -> sweep_events -> displacement_events -> MSS -> FVG -> bias_snapshots -> trade_signals -> trade_executions -> backtest_runs -> backtest_results -> reports
Training Case Engine milestone index
Training Case Engine is the external-facing product training module. The public milestone state is M1-M40, with current product maturity through M40.
Accepted milestone range: M1-M40, with current product maturity through M40.
Offline validation commands:
.venv/bin/python -m unittest discover -s tests/unit -p "test_*.py".venv/bin/python scripts/run_offline_checks.py
Accepted user-facing surfaces:
-
Trading Workbench at
/ -
Training Console at
/training -
public API routes
-
offline public package import/export
-
public error catalog
-
public privacy contract coverage
-
Acceptance and offline validation: M35 acceptance posture, Training Case acceptance manifest, focused milestone test suites, offline checks, and public validation.
-
Public API and privacy contracts: API contract coverage, error contract coverage, and privacy contract coverage keep public routes audited while public responses scrub private solution material and internal solution details.
-
Package smoke and offline registry: offline package smoke covers local import/export with public package, public export, and public output flows; broader offline checks register
training_case_package. -
Dashboard and public docs privacy: trading workbench syntax validation is registered as
dashboard_js_syntax, training console syntax validation is registered astraining_console_js_syntax, and public docs privacy smoke coverage keeps Training content to public case fields only. -
Local Docker guard: single-set local Docker deployment uses the documented rebuild order and Docker smoke guard coverage for one active deployment set, one
ai-ictcontainer, andhealthystatus.
Training public error catalog
- Training API validation failures are deterministic public validation errors:
400withinvalid_json_body,400withmissing_required_json_field:<field>,400withinvalid_json_field:<field>,400withinvalid_path_param:<field>, or400withinvalid_limit_query_param:limit. - Missing Training cases return
404withnot_found. - Masked unexpected Training API failures return
500withinternal_server_error; the public response masks raw internals, and responses do not echo raw internals. - Package CLI public errors for invalid input paths and invalid output targets emit one-line JSON with
passed,input,output, anderror; stable public error codes includeinput_file_not_found,input_path_is_directory,output_path_is_directory, andoutput_path_unwritable.
Public API response examples:
- Malformed or non-object JSON body:
POST /training/attempts-> HTTP400
{"error": "invalid_json_body"}
- Missing required JSON field:
POST /training/attemptswith{}-> HTTP400
{"error": "missing_required_json_field:case_id"}
- Invalid JSON field value:
POST /training/attemptswith textcase_id-> HTTP400
{"error": "invalid_json_field:case_id"}
- Invalid path identifier:
GET /training/cases/not-an-id-> HTTP400
{"error": "invalid_path_param:case_id"}
- Invalid list limit:
GET /training/cases?limit=not-a-number-> HTTP400
{"error": "invalid_limit_query_param:limit"}
- Missing case:
GET /training/cases/404-> HTTP404
{"error": "not_found"}
- Masked internal server error: any Training route -> HTTP
500
{"error": "internal_server_error"}
Package CLI public error examples:
- Missing input file:
{"passed": false, "input": "missing_training_case_package.json", "output": "training_case_public_export.json", "error": "input_file_not_found"}
- Directory input path:
{"passed": false, "input": "training_case_package_dir", "output": "training_case_public_export.json", "error": "input_path_is_directory"}
- Directory output target:
{"passed": false, "input": "tests/fixtures/training_case_package_m6.json", "output": "training_case_public_export_dir", "error": "output_path_is_directory"}
Local Docker deployment
Use the single-set local Docker deployment policy for local server deployment:
- Deploy from the deploy directory
/root/deploy/ai-ict. - Keep the compose project
ai-ict, containerai-ict, and exactly one active deployment set. - Keep one active
ai-ictcontainer; do not create a second local stack or a secondai-ictcontainer. - Before every local rebuild, stop stale services first, then start the same set:
cd /root/deploy/ai-ict
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml down --remove-orphans
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml up -d --build
- After the rebuild, verify the same one active set, one active
ai-ictcontainer, and Dockerhealthystatus:
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml ps
test "$(docker ps --filter label=com.docker.compose.project=ai-ict --format '{{.Names}}' | wc -l | tr -d ' ')" = "1"
test "$(docker ps --filter name=^/ai-ict$ --format '{{.Names}}' | wc -l | tr -d ' ')" = "1"
test "$(docker inspect -f '{{.State.Health.Status}}' ai-ict)" = "healthy"
- Check the documented local demo readiness without starting containers; this offline check does not invoke Docker:
.venv/bin/python scripts/check_local_demo_readiness.py
Trading Delivery Checklist
Use this locked trading delivery checklist before every market validation or deploy, so the trading module can be promoted without relying on chat memory.
must-run before every market validation or deploy:
.venv/bin/python -m unittest discover -s tests/unit -p "test_*.py"
.venv/bin/python scripts/run_offline_checks.py
.venv/bin/python scripts/check_local_demo_readiness.py
.venv/bin/python scripts/run_secret_static_checks.py
.venv/bin/python scripts/check_trading_delivery_readiness.py
Database gate:
READINESS_OUTPUT_JSON=1 .venv/bin/python scripts/run_database_readiness.py
HISTORICAL_REPAIR_OUTPUT_JSON=1 .venv/bin/python scripts/run_historical_compatibility_repair.py
.venv/bin/python scripts/run_historical_compatibility_repair.py --apply-safe-repairs
HISTORICAL_REPAIR_OUTPUT_JSON=1 .venv/bin/python scripts/run_historical_compatibility_repair.py
PIPELINE_OUTPUT_JSON=1 BACKTEST_REQUIRE_QUALITY_GATE=1 .venv/bin/python scripts/run_pipeline.py
Use --apply-safe-repairs only when the dry-run output shows safe candidates. After the second dry-run, manual review is still required for needs_sweep_reference_migration and keep_version_history, and backtest_quality_gate.passed must be true before promotion.
Deploy and health check:
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml down --remove-orphans
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml up -d --build
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml ps
test "$(docker ps --filter label=com.docker.compose.project=ai-ict --format '{{.Names}}' | wc -l | tr -d ' ')" = "1"
test "$(docker ps --filter name=^/ai-ict$ --format '{{.Names}}' | wc -l | tr -d ' ')" = "1"
test "$(docker inspect -f '{{.State.Health.Status}}' ai-ict)" = "healthy"
curl -fsS http://127.0.0.1:8000/health
curl -fsS "http://127.0.0.1:8000/trading/candidates?instrument_id=1&limit=1"
Post-deploy observe:
READINESS_OUTPUT_JSON=1 .venv/bin/python scripts/run_database_readiness.py
REPORTS_OUTPUT_JSON=1 .venv/bin/python scripts/run_reports.py
The paper execution boundary remains in force here: run_pipeline.py and the execution path are still paper-only, and any API 5xx, Docker unhealthy state, or non-empty readiness reasons should stop promotion immediately.
For one-command rehearsal orchestration, use scripts/run_trading_delivery_rehearsal.py; it runs checklist drift validation, historical repair gating, readiness plus auto-backfill, guarded pipeline, optional deploy/health-check, and post-deploy observe in one scripted flow.
Rollback trigger:
git rev-parse HEAD
docker compose -p ai-ict -f /root/deploy/ai-ict/docker-compose.yml logs --tail=100 ai-ict
git worktree add /tmp/ai-ict-rollback <last-known-good-sha>
cd /tmp/ai-ict-rollback && AI_ICT_DEPLOY_PASSWORD=<set-in-shell> AI_ICT_DEPLOY_USE_SUDO=1 .venv/bin/python scripts/deploy_with_password.py --host 192.168.3.90 --user yuqei --port 22 --remote-path /home/yuqei/project/ai-exchange --remote-archive /home/yuqei/ai-ict-deploy.tgz
rm -rf /tmp/ai-ict-rollback
Record the current commit as the last-known-good SHA before deploy. If any gate above fails, capture logs first, then redeploy from the clean rollback worktree rather than mutating the active development checkout.
Runtime utility scripts
python3 scripts/run_dev.py- start the local development API server and minimal dashboardpython3 scripts/show_models.py- list exported ORM model namespython3 scripts/check_db.py- run a simple database connectivity checkpython3 scripts/run_migrations.py- apply SQL files inmigrations/orderpython3 scripts/run_okx_backfill.py- fetch and write sample OKX candlespython3 scripts/run_session_generator.py- generate market sessionspython3 scripts/run_swings.py- rebuild swingspython3 scripts/run_ranges.py- rebuild dealing rangespython3 scripts/run_liquidity.py- rebuild liquidity poolspython3 scripts/run_sweeps.py- rebuild sweep eventspython3 scripts/run_displacement.py- rebuild displacement eventspython3 scripts/run_mss.py- rebuild MSS structure eventspython3 scripts/run_fvg.py- rebuild FVG zonespython3 scripts/run_trading_plans.py- generate today's structured BTC/ETH trading plans before signal generation; active plans require a Draw and at least one Invalidationpython3 scripts/run_trade_plan_candidates.py- watch the active trading plan for the first executable candidate model: OSOK/Daily Range context, Sweep, MSS, and FVG retrace; missing confirmations are reported instead of promoted to executionpython3 scripts/run_signals.py- generate bias and signals with structuraltarget_planselection; TP1 prefers IRL and TP2 prefers ERL, and signals are skipped when traceable structural targets are missingpython3 scripts/run_execution.py- run paper execution gating, require structural targets plus management rules for modeled signals, create an execution record, then auto-settle the latest execution for that signalpython3 scripts/run_execution_ticket.py- generate a human-confirmation execution ticket, run Risk Governor before ticket creation and before confirmation, and then create eitherpaperorsemi_autoexecution only after a valid confirmation steppython3 scripts/run_live_adapter.py- exercise the live broker preparation layer forsubmit,reconcile,cancel_all, orkill_switch; every attempted live operation is audited and real submission stays blocked unless live trading is explicitly enabled and confirmedpython3 scripts/run_risk_governor.py- run the independent market-state and risk governor pre-execution gatepython3 scripts/run_backtest.py- run backtest asplan_replayby default, replay active-plan candidates from appearance to confirmation to entry/invalidation, and write target-source traceability plus management rules into result metapython3 scripts/run_autonomous_cycle.py- run the unattended cycle: offline checks, database probe, readiness checks, then guarded pipeline when the database is available; printsNext actionsfor the next unattended steppython3 scripts/run_database_readiness.py- run read-only database readiness checks for connection, schema, seed data, and candle availability; printsnext_actionsandaction_planin JSON mode.venv/bin/python scripts/run_trading_delivery_rehearsal.py- run the P0 trading delivery rehearsal as one scripted flow: checklist drift check, historical repair decision, readiness/auto-backfill, guarded pipeline, deploy/health-check, and post-deploy observe.venv/bin/python scripts/run_offline_checks.py- run the broader offline check suite, including the M35 acceptance posture through the Training Case acceptance manifest for focused milestone test suites, the Training Case package smoke registered astraining_case_package, trading delivery checklist drift guard registered astrading_delivery_readiness, trading workbench syntax validation asdashboard_js_syntax, training console syntax validation astraining_console_js_syntax, and dashboard and public docs privacy smoke coverage; this public validation runs as offline checks without external services.venv/bin/python scripts/check_trading_delivery_readiness.py- verifyREADME.mdandRUNBOOK.mdstill expose the locked trading delivery checklist for preflight, deploy, observe, and rollback without relying on chat memory.venv/bin/python scripts/run_training_case_package.py --help- show the offline package smoke help for public package import/export behavior, public export/public output semantics, and stable public error codes for invalid input paths and invalid output targets.venv/bin/python scripts/run_training_case_package.py --input tests/fixtures/training_case_package_m6.json --output /tmp/training_case_public_export.json- run the Training Case offline package smoke, an import/export smoke with local files, and write public output as the public export in the public package shape; exported public JSON omits internal solution details.venv/bin/python scripts/run_training_case_generator.py --help- show the offline prototype generator help for read-only Training case draft generation from trading-derived seed events.venv/bin/python scripts/run_training_case_generator.py --input tests/fixtures/training_case_generator_seed_v1.json --output /tmp/generated_training_case_drafts.json- run the offline Training case generator prototype and write a public draft package without touching Training database tables.venv/bin/python scripts/run_historical_compatibility_repair.py- scan for older stored signal/FVG/MSS/liquidity compatibility issues in the connected database without applying changes.venv/bin/python scripts/run_historical_compatibility_repair.py --apply-safe-repairs- apply the safe historical compatibility repairs for signal invalidations, MSS/FVG meta backfills, and liquidity safe merges limited to unreferenced supersets plus exact duplicate rows with identical sweep events;needs_sweep_reference_migrationandkeep_version_historygroups still require manual review.venv/bin/python scripts/run_historical_compatibility_repair.py --apply-liquidity-reference-migrations- apply executable liquidity reference migrations for exact duplicate pools with nonidentical sweep events; duplicate sweep timestamp conflicts are blocked instead of auto-mergedpython3 scripts/run_migration_static_checks.py- check migration order and required core schema without connecting to the databasepython3 scripts/run_script_static_checks.py- check automation scripts for unsafe ambient environment fallback patterns and repo-tracked secret literalspython3 scripts/run_secret_static_checks.py- scan git-tracked text files for high-confidence secret material without printing secret valuespython3 scripts/run_replay_file.py <candles.json|candles.jsonl|candles.csv>- run offline no-lookahead candle replay without database accesspython3 scripts/run_reports.py- build sample reports from current servicespython3 scripts/run_api_server.py- start a lightweight HTTP API server on127.0.0.1:8000;/serves the trading workbench and/trainingserves the training consolepython3 scripts/run_pipeline.py- run the current end-to-end closed loop and print a structured summary
Optional report environment variables used by run_reports.py:
REPORTS_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable sample report output
Optional utility JSON output variables:
CHECK_DB_OUTPUT_JSONCHECK_DB_CONNECTION_OUTPUT_JSONHISTORICAL_REPAIR_OUTPUT_JSONMIGRATION_CHECKS_OUTPUT_JSONSCRIPT_CHECKS_OUTPUT_JSONSHOW_MODELS_OUTPUT_JSONRISK_GOVERNOR_OUTPUT_JSONTRADE_PLAN_CANDIDATES_OUTPUT_JSONTRADING_JOURNAL_OUTPUT_JSONTRADING_PLANS_OUTPUT_JSONTRADING_REHEARSAL_OUTPUT_JSONLIVE_ADAPTER_OUTPUT_JSONBACKTEST_OUTPUT_JSONEXECUTION_TICKET_OUTPUT_JSON
Optional structure script JSON output variables:
SESSION_GENERATOR_OUTPUT_JSONSWINGS_OUTPUT_JSONRANGES_OUTPUT_JSONLIQUIDITY_OUTPUT_JSONSWEEPS_OUTPUT_JSONDISPLACEMENT_OUTPUT_JSONMSS_OUTPUT_JSONFVG_OUTPUT_JSON
Optional backtest cost environment variables used by run_backtest.py and run_pipeline.py:
BACKTEST_FEE_RATEBACKTEST_SLIPPAGE_RATEBACKTEST_FIXED_COST_R
Optional replay-backed backtest mode variables used by run_backtest.py and run_pipeline.py:
BACKTEST_MODE- supported values:entry_then_outcomeorreplay_no_lookaheadBACKTEST_REPLAY_LEFT_BARSBACKTEST_REPLAY_RIGHT_BARS
Optional backtest automation gate used by run_backtest.py and run_pipeline.py:
BACKTEST_OUTPUT_JSON- set to1,true,yes, oronfor machine-readablerun_backtest.pyoutputBACKTEST_REQUIRE_QUALITY_GATE- set to1,true,yes, oronto exit with code2when the backtest quality gate failsBACKTEST_MIN_TOTAL_SIGNALSBACKTEST_MIN_EXECUTED_SIGNALSBACKTEST_MIN_EXPECTANCY_RBACKTEST_MIN_PROFIT_FACTOR_RBACKTEST_MAX_DRAWDOWN_RBACKTEST_MAX_CONSECUTIVE_LOSSES
Optional pipeline environment variables used by run_pipeline.py:
PIPELINE_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable pipeline error output
Optional replay environment variables used by run_replay_file.py:
OFFLINE_REPLAY_FILE- optional candle file path used byrun_offline_checks.pyto include replay validationOFFLINE_CHECKS_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable offline check summary outputREPLAY_LEFT_BARSREPLAY_RIGHT_BARSREPLAY_MIN_CANDLESREPLAY_MIN_SWINGSREPLAY_MAX_GAP_MINUTESREPLAY_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable replay summary output
Example offline replay gate:
OFFLINE_REPLAY_FILE=tests/fixtures/offline_replay_sample.jsonl \
REPLAY_LEFT_BARS=1 REPLAY_RIGHT_BARS=1 \
REPLAY_MIN_CANDLES=5 REPLAY_MIN_SWINGS=2 \
.venv/bin/python scripts/run_offline_checks.py
Optional OKX backfill environment variables used by run_okx_backfill.py:
OKX_BACKFILL_SYMBOL- defaults toBTC-USDTOKX_BACKFILL_INST_ID- defaults to<symbol>-SWAPOKX_BACKFILL_PAGES- defaults to20OKX_BACKFILL_LIMIT- defaults to100OKX_BACKFILL_TIMEFRAMES- defaults to1m,5m,15mOKX_BACKFILL_OUTPUT_JSON- emit a machine-readable backfill summary
Optional autonomous cycle environment variables used by run_autonomous_cycle.py:
AUTONOMOUS_OUTPUT_JSON- emit a machine-readable cycle summaryAUTONOMOUS_REQUIRE_DB- return code2when the database is unavailableAUTONOMOUS_RUN_PIPELINE- set to0to stop after a successful database probeAUTONOMOUS_MAX_DB_PROBES- number of database probe attempts before stoppingAUTONOMOUS_PROBE_INTERVAL_SECONDS- sleep interval between database probe attemptsAUTONOMOUS_REQUIRE_SCHEMA- enabled by default; set to0to skip core table readiness checks before the guarded pipelineAUTONOMOUS_APPLY_MIGRATIONS- enabled by default; when schema is not ready, run migrations, recheck schema, then continueAUTONOMOUS_REQUIRE_DATA_READINESS- enabled by default; set to0to skip read-only seed/candle readiness before the guarded pipelineAUTONOMOUS_BACKFILL_CANDLES- enabled by default; when readiness only lacks candles, run OKX backfill, recheck readiness, then continue- The guarded pipeline step defaults
BACKTEST_REQUIRE_QUALITY_GATE=1andPIPELINE_OUTPUT_JSON=1unless explicitly overridden
Current autonomous modes emit machine-readable next_actions and action_plan, including:
waiting_for_database->wait_for_database_recoverydatabase_schema_not_ready->run_migrations_before_pipelinemigration_failed->inspect_migration_output_and_schemadatabase_readiness_failed-> the readiness script's own next action, such asrun_okx_backfill_or_load_replay_samplebackfill_failed->inspect_backfill_output_and_data_readinesspipeline_failed->inspect_pipeline_output_and_quality_gates
Each action_plan item includes the action name, suggested command, description, and requires_database.
Optional database readiness environment variables used by run_database_readiness.py:
READINESS_OUTPUT_JSONREADINESS_REQUIRED_VENUESREADINESS_REQUIRED_INSTRUMENTSREADINESS_CANDLE_INSTRUMENT_IDREADINESS_CANDLE_TIMEFRAMEREADINESS_MIN_CANDLES- defaults to50READINESS_MIN_CANDLE_SPAN_MINUTES- defaults to60READINESS_MAX_CANDLE_AGE_MINUTES- defaults to240
Optional account risk environment variables used by run_execution.py and run_pipeline.py:
EXECUTION_OUTPUT_JSON- set to1,true,yes, oronfor machine-readablerun_execution.pyoutputEXECUTION_SETTLEMENT_OUTPUT_JSON- set to1,true,yes, oronfor machine-readablerun_execution_settlement.pyoutputEXECUTION_KILL_SWITCHEXECUTION_DAILY_PNL_PCTEXECUTION_CONSECUTIVE_LOSSESEXECUTION_OPEN_POSITIONSEXECUTION_SAME_SIDE_OPEN_POSITIONSEXECUTION_MAX_DAILY_LOSS_PCTEXECUTION_MAX_CONSECUTIVE_LOSSESEXECUTION_MAX_OPEN_POSITIONSEXECUTION_MAX_SAME_SIDE_POSITIONS
Optional market-state and risk governor environment variables used by run_risk_governor.py:
RISK_GOVERNOR_OUTPUT_JSONRISK_INSTRUMENT_IDRISK_TIMEFRAMERISK_EXECUTION_MODEMARKET_STATE_MAX_CANDLE_AGE_SECONDSNEWS_WINDOW_ACTIVENEWS_WINDOW_IDNEWS_WINDOW_MINUTES_BEFORENEWS_WINDOW_MINUTES_AFTEROPENING_VOLATILITY_GUARD_MINUTESBLOCK_OPENING_VOLATILITY
Optional signal quality environment variables used by run_signals.py and run_pipeline.py:
SIGNALS_OUTPUT_JSON- set to1,true,yes, oronfor machine-readablerun_signals.pyoutputSIGNAL_EVIDENCE_MODE-strictby default, orminimalto allow the older reduced evidence set
Optional trading plan environment variables used by run_trading_plans.py:
TRADING_PLANS_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable plan outputTRADING_PLAN_SYMBOLS- comma-separated symbols; defaults toBTC-USDT,ETH-USDTTRADING_PLAN_BIAS_TIMEFRAMETRADING_PLAN_SETUP_TIMEFRAMETRADING_PLAN_TRIGGER_TIMEFRAME
Optional backtest replay environment variables used by run_backtest.py:
BACKTEST_SUBJECT_TYPE- defaults toplan_replay; usesignalonly when you intentionally want the legacy signal-only backtestBACKTEST_TRADING_PLAN_ID- optional plan scope for replayBACKTEST_CANDIDATE_MODEL_CODE- optional candidate model filter such asOSOK_DAILY_RANGE_SWEEP_MSS_FVG_RETRACE
Optional trade plan candidate environment variables used by run_trade_plan_candidates.py:
TRADE_PLAN_CANDIDATES_OUTPUT_JSON- set to1,true,yes, oronfor machine-readable candidate outputTRADE_PLAN_CANDIDATE_SYMBOLS- comma-separated symbols; defaults toBTC-USDT,ETH-USDTTRADE_PLAN_CANDIDATE_SETUP_TIMEFRAMETRADE_PLAN_CANDIDATE_TRIGGER_TIMEFRAME
Lightweight API helpers
The src/api/ package exposes internal query helpers and HTTP routes for:
GET /healthGET /candles?instrument_id=1&timeframe=1m&limit=100GET /sessions?instrument_id=1&limit=20GET /trading-plans?instrument_id=1&limit=20GET /trade-plan-candidates?instrument_id=1&limit=20GET /signals?instrument_id=1&limit=20GET /executions?instrument_id=1&limit=20GET /execution-tickets?instrument_id=1&limit=20GET /live-operation-audits?execution_ticket_id=1&limit=20GET /backtests?instrument_id=1&limit=10
Open / in the browser for the minimal dashboard, which now includes health, candles, signals, sessions, executions, and backtests.
Validation
Unit tests:
python3 -m unittest discover -s tests/unit -p "test_*.py"