Page - Strategies

abstract

Manage trading strategies — view all configured strategies as cards or list, create new ones, edit/delete, toggle active state, bind to accounts, and manually trigger analysis.

Route

PropertyValue
Path/strategies
Filefrontend/src/app/strategies/page.tsx
Auth RequiredNo
LayoutRoot layout with sidebar
Dynamic SegmentNone

Sub-routes:

  • /strategies/new — Create strategy form
  • /strategies/[id] — Strategy detail view
  • /strategies/[id]/edit — Edit strategy

Component Tree

StrategiesPage (page.tsx)
├── AppHeader (title="Strategies")
├── Toolbar: view mode toggle (grid | list) + "New Strategy" button
├── Tabs: "Strategies" view | "Accounts" view
├── Strategy Cards (grid or list layout)
│   └── StrategyCard × N
│       ├── Name + type badge (config/prompt/code)
│       ├── Execution mode badge (llm_only / multi_agent / ...)
│       ├── Symbols list + timeframe
│       ├── Stats (win rate, total trades, P&L from getStats())
│       ├── Bindings (accounts bound to this strategy)
│       ├── Switch: is_active toggle
│       └── Actions: Edit | Delete | Trigger buttons
└── DeleteDialog (confirm before delete)

Data Layer

Server State — Direct fetch

CallAPIEndpointTriggered When
Fetch strategiesstrategiesApi.list()GET /api/v1/strategiesOn mount
Fetch accountsaccountsApi.list()GET /api/v1/accountsOn mount (for binding display)
Fetch statsstrategiesApi.getStats(id)GET /api/v1/strategies/{id}/statsPer strategy on mount (parallel)
Fetch bindingsstrategiesApi.getBindings(id)GET /api/v1/strategies/{id}/bindingsPer strategy on mount (parallel)
DeletestrategiesApi.delete(id)DELETE /api/v1/strategies/{id}Delete button + confirm dialog
TriggerstrategiesApi.trigger(id)POST /api/v1/strategies/{id}/triggerTrigger button

Local State — useState

VariableTypeInitialPurpose
strategiesStrategy[][]Full strategy list
accountsAccount[][]For binding display
viewMode"strategies" | "accounts""strategies"Tab state
deletingIdnumber | nullnullTracks which strategy is being deleted
triggeringIdnumber | nullnullLoading state for trigger button
statsMapRecord<number, StrategyStats>{}Per-strategy stats
bindingsMapRecord<number, StrategyBinding[]>{}Per-strategy account bindings

Page Lifecycle

Validation & Conditions

Type Badge Colors

strategy_type / execution_modeColor Class
configbg-blue-100 text-blue-800
promptbg-purple-100 text-purple-800
codebg-green-100 text-green-800
llm_onlybg-purple-100 text-purple-800
rule_then_llmbg-blue-100 text-blue-800
hybrid_validatorbg-amber-100 text-amber-800
multi_agentbg-orange-100 text-orange-800

Render Conditions

ConditionWhat Shows
strategies.length === 0Empty state + "Create first strategy" CTA
deletingId === strategy.idLoading spinner on delete button
triggeringId === strategy.idLoading spinner on trigger button
strategy.is_active === falseCard grayed out
RoleLink
Backend APIAPI-Strategies
DB SchemaDB - strategies
DB SchemaDB - account_strategy