spb/crypto-trade-bot
Public
Python 54.7%
TypeScript 42.5%
SQL 1.9%
1export type ParamSpec = {2 name: string;3 type: "int" | "float" | "bool" | "choice";4 default: unknown;5 min?: number | null;6 max?: number | null;7 step?: number | null;8 choices?: unknown[] | null;9 description?: string;10};11export type StrategyMeta = {12 name: string;13 label: string;14 family: string;15 hypothesis: string;16 universe_note: string;17 experimental: boolean;18 allows_short: boolean;19 min_bars: number;20 params: ParamSpec[];21 failure_modes: string[];22 references: string[];23};24export type OverviewSymbol = {25 symbol: string;26 last: number | null;27 change_pct: number | null;28 bid: number | null;29 ask: number | null;30 volume: number | null;31 spread_bps: number | null;32 age_s: number | null;33 stale: boolean;34 rv_7d_annualized: number | null;35 hourly_bars: number;36};37export type SystemStatus = {38 mode: "offline" | "paper" | "live";39 live_trading_enabled: boolean;40 env: string;41 version: string;42 universe: string[];43 intervals: number[];44 timescale: boolean;45 credentials: { data_key: boolean; trade_key: boolean; withdrawal: string };46 preflight: Record<string, unknown> | null;47 kraken: { status: string; timestamp?: string; rtt_ms?: number; clock_drift_s?: number; error?: string };48 stream: { connected: boolean; last_msg_age: number | null; reconnects: number; checksum_failures: number; messages: number; counts: Record<string, number>; ts: number } | null;49};50export type Candle = { ts: number; open: number; high: number; low: number; close: number; vwap: number; volume: number; count: number; closed: boolean };51export type Book = {52 symbol: string;53 bids: [number, number][];54 asks: [number, number][];55 best_bid: number | null;56 best_ask: number | null;57 spread: number | null;58 spread_bps: number | null;59 imbalance: number;60 timestamp: string | null;61 valid: boolean;62 received_at?: number;63 age_s?: number;64};65export type Trade = { trade_id: number; ts: number; price: number; volume: number; side: "buy" | "sell"; order_type: string };66export type Pair = { pair_id: string; altname: string; wsname: string; base: string; quote: string; status: string; ordermin: number; costmin: number; tick_size: number; pair_decimals: number; lot_decimals: number; in_universe: boolean };67export type Quality = { symbol: string; interval_min: number; bars: number; first_ts: number; last_ts: number; gaps: number; missing_bars: number; lag_bars: number; stale: boolean; coverage_days: number };68export type Gap = { symbol: string; interval_min: number; gap_start: number; gap_end: number; missing_bars: number; detected_at: string };69export type RiskLimits = {70 max_order_notional: number; max_position_notional: number; max_gross_exposure: number; max_net_exposure: number; max_concentration: number;71 daily_loss_limit: number; max_drawdown_limit: number; min_cash: number; max_open_orders: number; max_participation: number; max_price_deviation: number;72 stale_data_seconds: number; max_clock_drift_seconds: number; var_limit_95: number | null;73};74export type KillSwitch = { active: boolean; reason?: string | null; since?: number | null };75export type RiskStatus = { limits: RiskLimits; kill_switch: KillSwitch; mode: string; recent_events: { ts: string; action: string; details: Record<string, unknown> }[] };76export type AuditItem = { id: number; ts: string; actor: string; action: string; entity: string | null; details: Record<string, unknown>; cid: string | null; hash: string };77export type RunRow = {78 id: string; created_at: string; finished_at: string | null; status: string; strategy: string; symbol: string; interval_min: number;79 params: Record<string, unknown>; label: string | null; error: string | null; start_ts: number | null; end_ts: number | null;80 sharpe: string | null; total_return: string | null; max_drawdown: string | null; n_trades: string | null;81};82export type EquityPoint = { ts: number; equity: number; drawdown: number; exposure: number; price: number };83export type Metrics = Record<string, number | null | undefined> & {84 bootstrap?: { sharpe_ci: [number | null, number | null]; cagr_ci: [number | null, number | null]; n_boot: number; block?: number };85 deflated_sharpe?: { dsr: number | null; sr0_annual?: number | null; n_trials?: number };86};87export type TradeRec = { ts: number; side: string; qty: number; price: number; ref_price: number; fee: number; slippage_cost: number; notional: number; reason: string; strategy_target: number; partial: boolean };88export type Artifacts = {89 equity: EquityPoint[];90 rolling_sharpe: { ts: number; sharpe: number }[];91 trades: TradeRec[];92 rejected: { ts: number; side: string; qty: number; reasons: string[] }[];93 benchmarks: Record<string, { metrics: Metrics; equity: EquityPoint[] }>;94 stress: Record<string, Record<string, number | null>>;95 shuffled_trades: { n: number; max_dd_p50?: number; max_dd_p95?: number; max_dd_worst?: number; total_pnl?: number };96 walk_forward: { folds: { fold: number; train: [number, number]; test: [number, number]; best_params: Record<string, unknown>; is_sharpe: number | null; oos_sharpe: number | null; oos_return: number | null; oos_max_dd: number | null }[]; anchored?: boolean; n_trials?: number; grid?: Record<string, unknown[]>; embargo_bars?: number; stitched_oos?: { sharpe: number | null; total_return: number | null; bars: number }; error?: string } | null;97 sensitivity: { x: { name: string; values: unknown[] }; y: { name: string; values: unknown[] }; metric: string; z: (number | null)[][] } | null;98 holdout: { start_ts: number; metrics: Metrics; equity: EquityPoint[] } | null;99 features_tail: Record<string, number>[];100};101export type Run = RunRow & {102 cost_model: Record<string, unknown>;103 metrics: Metrics | null;104 provenance: Record<string, unknown> | null;105 artifacts: Artifacts | null;106};107