QuantDingerQuantDingerv5.0.1 Docs 文档中心
GitHub

QuantDinger Backend Module Boundaries

This document defines target ownership for the backend. It does not require an immediate rewrite. It is the contract to follow as existing code is decomposed.

Layer Model

Layer Owns Must Not Own
routes HTTP parsing, auth checks, status codes, request/response mapping trading loops, exchange-specific rules, long-running jobs
openapi schema registration, OpenAPI export, operation metadata business logic
services business workflows and use-case orchestration raw Flask request objects except at route boundary
services/live_trading exchange and broker adapters, order API normalization strategy lifecycle, user auth, HTTP responses
services/grid grid engine, cell state, fill normalization, reconciliation route parsing, frontend-specific formatting
data_sources market data adapters and fetch policy strategy execution or account mutation
data_providers dashboard/global-market aggregation and cache policy trading decisions or order placement
utils low-level auth, db, cache, logging, time, crypto helpers feature workflows
config environment and settings resolution runtime mutation side effects
migrations schema and seed data Python runtime behavior

Current Hotspots

These files mix multiple responsibilities and should be decomposed gradually:

File Current Risk Target Split
app/__init__.py app factory plus core Flask wiring keep app factory only
app/startup.py worker boot, strategy restore, process-local singletons distributed worker ownership guards
app/routes/strategy.py lifecycle, templates, AI generation route modules per subdomain
app/routes/strategy_account_routes.py account snapshot and account position mirror account service facade
app/routes/backtest_center.py unified V2 backtest endpoint facade one request schema and one simulation service facade
app/routes/strategy_deviation_routes.py dry-run deviation endpoint deviation service facade
app/routes/strategy_grid_routes.py grid resting order endpoint grid route facade
app/routes/strategy_ledger_routes.py trades, equity curve, performance endpoints ledger/read-model service facade
app/routes/strategy_positions_routes.py strategy live position read model position query service facade
app/routes/strategy_review_routes.py AI strategy review endpoints review request schema and service facade
app/routes/strategy_logs_routes.py runtime log query endpoint observability route facade
app/routes/strategy_notifications.py strategy notification endpoints notification service facade
app/routes/quick_trade.py HTTP, credential handling, exchange selection, order formatting route facade plus quick-trade service
app/routes/ai_chat.py memory, skills, tools, chat, streaming separate AI route modules
app/routes/settings.py schema, config values, brand, connection testing settings service plus config schemas
app/services/trading_executor.py signal loops, order placement, sync, persistence executor core, order intents, locks, recorders
app/services/backtest.py data loading, strategy execution, simulation, metrics backtest pipeline components
app/services/pending_order_worker.py worker loop plus dispatch and sync details worker shell, dispatcher, reconciliation

Route Layer Rules

  • Routes may validate input, call services, and shape HTTP responses.
  • Routes must not start background threads directly.
  • Routes must not contain exchange-specific order sizing logic.
  • Routes must not perform multi-step database transactions inline unless the logic is being migrated and covered by tests.
  • Streaming routes must define timeout, heartbeat, and cancellation behavior.

Service Layer Rules

  • Services own use-case flow and can coordinate repositories/adapters.
  • Services should accept plain Python values, not Flask request objects.
  • Services should return plain dicts/dataclasses or typed result objects.
  • Services should define idempotency behavior when they mutate state.
  • Long-running service work should be runnable as a job or worker task.

Adapter Rules

  • Exchange and broker adapters normalize external APIs into internal contracts.
  • Adapters should not know about Flask, users, or frontend response shapes.
  • Adapter methods should accept explicit client_order_id when the venue supports it.
  • Adapter-specific rate limits and retry rules should be isolated from business logic.

Startup Boundary

Target structure:

  • create_app() creates Flask, configures JSON/CORS, registers routes.
  • startup.py owns worker startup and process-local service singletons.
  • Worker startup is disabled for OpenAPI export, tests, and one-off scripts.
  • Multi-process deployments must have an explicit owner for each background worker.

Documentation Boundary

  • Root README.md: user-facing quick start and product overview.
  • docs/: architecture, API, operations, integration guides.
  • docs/agent/: agent-facing docs only, English only.
  • Generated API files must say how they were generated.
  • Deprecated docs must be moved to an archive or marked with a date and replacement.

Language Boundary

  • Code comments, docstrings, log messages, internal error details, module names, function names, variables, and engineering documentation should be English by default.
  • Chinese is allowed only for user-facing localized text, prompts, translation dictionaries, examples that intentionally demonstrate Chinese output, exchange or market terminology that is inherently Chinese, and backward-compatible API fields that already expose localized content.
  • Do not mix Chinese comments into core trading, concurrency, API, database, or deployment code. If localized text is needed, keep it behind an explicit language selector or i18n structure.
  • When replacing legacy Chinese comments, preserve the technical meaning and avoid changing runtime behavior in the same edit.

Compatibility Rule

When moving code, keep the old import path or route path until all callers are verified. If compatibility cannot be preserved, document the break and update frontend/API tests in the same change.