定义各 package 暴露的主要类、方法签名、数据模型及依赖关系,统一编码约束。
统一 Typescript 接口位于 packages/domain/src/types.ts,需至少包含:
export type Side = 'buy' | 'sell';
export type TimeInForce = 'GTC' | 'IOC' | 'FOK';
export interface OrderIntent {
symbol: string;
side: Side;
price: number;
size: number;
tif: TimeInForce;
postOnly?: boolean;
clientId: string;
strategyTag: 'grid' | 'scalper' | 'hedge';
}
export interface FillEvent {
orderId: string;
clientId: string;
symbol: string;
side: Side;
price: number;
size: number;
fee: number;
liquidity: 'maker' | 'taker';
timestamp: number;
}
所有模块引用公共类型,不允许重复定义字段。
| 模块 | 文件 | 责任 |
|---|---|---|
ShadowBook |
packages/utils/src/shadowBook.ts |
聚合多标的订单簿,提供 mid/spread/OBI 等派生指标 |
MarketDataAdapter |
packages/utils/src/marketDataAdapter.ts |
拉取或订阅行情并同步至 ShadowBook |
核心接口:
class ShadowBook {
constructor(options?: { maxDepth?: number; stalenessMs?: number });
updateFromSnapshot(symbol: string, snapshot: OrderBook, seq?: number): void;
applyIncrement(symbol: string, delta: OrderBookDelta): void;
snapshot(symbol: string): OrderBook | undefined;
mid(symbol: string): number | undefined;
spreadBps(symbol: string): number | undefined;
computeObi(symbol: string, depth?: number): number | undefined;
topDepthUsd(symbol: string, depth?: number): number | undefined;
detectDataGap(symbol: string, now?: number): boolean;
reset(): void;
}
ShadowBook 维护每个标的的最新订单簿,与策略/风控共享数据;若底层行情支持增量更新,可通过 applyIncrement 合并。
class MarketDataAdapter extends EventEmitter {
constructor(options: { symbols: string[]; shadowBook: ShadowBook; fetchSnapshot: (symbol: string) => Promise<OrderBook>; pollIntervalMs?: number });
start(): Promise<void>;
stop(): void;
ingestSnapshot(symbol: string, snapshot: OrderBook, seq?: number): void;
ingestDelta(symbol: string, delta: OrderBookDelta): void;
}
type SymbolStatus = 'inactive' | 'active' | 'paused' | 'disabled';
interface SymbolConfig {
symbol: string;
maxNotional: number;
maxBase: number;
enabled?: boolean;
tags?: string[];
metadata?: Record<string, unknown>;
}
class SymbolRegistry extends EventEmitter {
constructor(initialConfigs?: SymbolConfig[]);
register(config: SymbolConfig): SymbolRuntimeState;
updateConfig(symbol: string, patch: Partial<SymbolConfig>): SymbolRuntimeState;
activate(symbol: string): SymbolRuntimeState;
pause(symbol: string, reason: string): SymbolRuntimeState;
disable(symbol: string, reason?: string): SymbolRuntimeState;
remove(symbol: string): void;
list(status?: SymbolStatus): SymbolRuntimeState[];
listActive(): SymbolRuntimeState[];
setAllocation(symbol: string, allocation: RiskAllocation | undefined): SymbolRuntimeState;
setScore(symbol: string, score: number | undefined): SymbolRuntimeState;
on(event: 'registered' | 'updated' | 'statusChanged' | 'removed', handler: (...args)=>void): this;
}
interface RiskBudget { totalNotional: number; totalBase: number; }
class RiskAllocator {
constructor(budget: RiskBudget, options?: { minNotionalPerSymbol?: number; minBasePerSymbol?: number });
allocate(states: SymbolRuntimeState[]): Map<string, RiskAllocation>;
}
SymbolRuntimeState.score 按比例分配风险预算,自动裁剪至每个符号的配置上限。minNotionalPerSymbol / minBasePerSymbol,会确保分配不低于该最小值。interface SymbolMetrics {
spreadBps: number;
topDepthUsd: number;
volumePerMin: number;
fundingCorrelation: number;
dataLatencyMs?: number;
}
class SymbolScorer {
constructor(options?: ScorerOptions);
score(metrics: SymbolMetrics): number; // 0~1,越高代表越适合启用
shouldEnable(metrics: SymbolMetrics): boolean;
}
shouldEnable 同时检查 spread、深度、资金费率等硬阈值。interface StrategyCoordinatorOptions {
priorities: ('grid' | 'scalper')[];
}
class StrategyCoordinator {
constructor(options: StrategyCoordinatorOptions);
registerProducer(tag: 'grid' | 'scalper', producer: AsyncGenerator<OrderIntent[]>): void;
async nextIntentBatch(): Promise<OrderIntent[]>; // 按优先级+冲突处理返回
resolveConflicts(intents: OrderIntent[]): OrderIntent[];
}
nextIntentBatch 需支持 Promise.race 超时,避免阻塞。当前网格策略直接依赖 OrderRouter 与 HedgeEngine:
class GridMaker {
constructor(
cfg: GridConfig,
router: OrderRouter,
hedgeEngine: HedgeEngine,
shadowBook: ShadowBook
);
initialize(): Promise<void>; // 读取 mid,按配置挂出买卖网格
onFill(fill: Fill): Promise<void>; // 补挂对手单、更新 delta、触发 hedge
onHedgeFill(fill: Fill): Promise<void>; // Hedger 成交后,根据实际结果校准 delta
onTick(): Promise<void>; // 定时调用,驱动自适应逻辑
reset(): Promise<void>; // 撤销未成交挂单并重新初始化
getStatus(): GridStatus; // 提供监控数据
}
GridConfig 字段详见 config/grid.example.yaml 与 docs/CONFIG_REFERENCE.md。StrategyCoordinator,需新增返回 OrderIntent[] 的变体并在此文档说明。class MicroScalper {
constructor(cfg: ScalperConfig, shadow: ShadowBook, signalBus: EventEmitter);
onBook(book: OrderBookEvent): void;
onTrade(trade: TradeEvent): void;
drainIntents(): OrderIntent[];
}
drainIntents 每个周期输出并清空累计意向。interface GlobalOrderSnapshot {
orderId: string;
accountId: string;
symbol: string;
side: Side;
price: number;
}
class GlobalOrderCoordinator extends EventEmitter {
constructor(options?: { stpToleranceBps?: number });
validate(intent: { accountId: string; symbol: string; side: Side; price: number }): void;
register(snapshot: GlobalOrderSnapshot): void;
release(orderId: string): void;
}
(symbol, price) 到挂单列表的索引,阻止关联账户在相同价位对向挂单触发 STP。stpToleranceBps 用于允许极小价差以内的并行挂单(默认 0 表示严格禁止)。interface OrderRouterConfig {
maxBps: number;
minIntervalMs?: number;
forbidPostOnlyCross?: boolean;
clientIdCacheSize?: number;
}
class OrderRouter {
constructor(
sendLimit: (order: Order) => Promise<{ id: string }>,
getBook: (symbol: string) => OrderBook | undefined,
config: OrderRouterConfig
);
sendLimit(order: Order): Promise<string>;
sendLimitChild(order: Order): Promise<string>; // 兼容旧接口
sendIOC(order: Order): Promise<string>;
}
getBook 通常由 ShadowBook.snapshot(symbol) 实现,确保 router 获得最新 top-of-book。interface RiskLimits {
maxBaseAbs: number;
maxNotionalAbs: number;
maxOrderSz: number;
}
interface KillSwitchConfig {
drawdownPct: number;
triggers?: Array<{ type: 'pnl_drawdown' | 'delta_abs' | 'hedge_failure_count' | 'data_gap_sec'; threshold: number }>;
}
class RiskEngine {
constructor(limits: RiskLimits, killSwitch?: KillSwitchConfig);
preCheck(order: Order, position: PositionSnapshot, midPrice: number): void;
reportFill(pnlDelta: number): void;
updateEquity(equity: number): void;
updateDeltaAbs(deltaAbs: number): void;
recordHedgeFailure(): void;
recordHedgeSuccess(): void;
setDataGap(seconds: number): void;
shouldHalt(): boolean;
getStatus(): RiskStatus;
}
preCheck 在下单前验证名义、库存、单笔限额。updateEquity/updateDeltaAbs/recordHedgeFailure 等接口由上层定期调用,Kill-switch 根据 drawdown 与触发器自动判定停机。interface HedgeCfg { kp: number; ki: number; Qmax: number; minIntervalMs: number; }
interface HedgeResult { hedged: number; orderId?: string; clientId?: string; }
class HedgeEngine {
constructor(cfg: HedgeCfg, place: (order: Order) => Promise<{ id: string }>, getMid: () => number | undefined);
compute(delta: number): number; // PI 控制器输出,截断至 ±Qmax
maybeHedge(symbol: string, delta: number): Promise<HedgeResult>; // 按节流阈值提交 IOC 对冲,返回下单信息
}
-### 6.2 FundingRateMonitor
interface FundingRate { rate: number; timestamp: number; venue?: string; }
class FundingRateMonitor extends EventEmitter {
constructor(options: { fetchPrimary: () => Promise<FundingRate>; fetchHedge: () => Promise<FundingRate>; pollIntervalMs?: number });
start(): Promise<void>;
stop(): void;
}
class Telemetry {
recordCounter(name: string, labels: Record<string,string>, value?: number): void;
observeHistogram(name: string, labels: Record<string,string>, value: number): void;
setGauge(name: string, labels: Record<string,string>, value: number): void;
}
packages/telemetry/metrics.ts,模块通过依赖注入使用。prom-client,避免重复注册。最小可运行流程:
config.yaml(或 config/grid.example.yaml)并实例化 GridConfig、HedgeCfg、风险参数。Pacifica adapter)。ShadowBook,在收到行情快照时调用 shadowBook.set(book).OrderRouter、HedgeEngine、GridMaker,并在首个 mid 可用时调用 gridMaker.initialize().gridMaker.onFill(fill),由其内部处理补单与对冲。引入其他策略或协调器后,请扩展本节并保证文档与实现保持一致。
packages/errors.捕获异常需写入结构化日志:
logger.error({ err, intent, module: 'OrderRouter' }, 'order rejected');
日志字段:
traceId: 贯穿意向 → 下单 → 成交 → 对冲 → 降级accountId, strategyTag, symboldeltaBefore, deltaAfter (RiskEngine / HedgeEngine)Version: 1.0.0 初始)。新增模块需补充章节,PR 必须更新该文档并通过审查。
packages/connectors/pacifica/src/adapterRegistry.ts)interface AdapterRegistryEntry {
id: string;
role?: string;
adapter: PacificaAdapter;
}
class AdapterRegistry {
register(id: string, config: PacificaConfig, role?: string): AdapterRegistryEntry;
attach(id: string, adapter: PacificaAdapter, role?: string): AdapterRegistryEntry;
get(id: string): PacificaAdapter;
findByRole(role: string): PacificaAdapter | undefined;
collectPositions(symbol: string): Promise<PositionSnapshot[]>;
}
同时管理 maker / hedger 等账户 adapter,便于在执行层动态选择账户。collectPositions 供 PositionManager 聚合风险使用。
packages/connectors/pacifica/src/wsClient.ts)interface PacificaWebSocketConfig {
url: string;
apiKey?: string; // account address
secret?: string; // private key
subaccount?: string;
reconnectIntervalMs?: number;
maxReconnectIntervalMs?: number;
heartbeatIntervalMs?: number;
}
class PacificaWebSocket extends EventEmitter {
constructor(config: PacificaWebSocketConfig);
connect(): void;
disconnect(): void;
subscribe(channel: string, params?: Record<string, unknown>): void;
subscribeAuthenticated(channel: string, params?: Record<string, unknown>, authOverride?: SigningConfig): void;
sendRaw(payload: unknown): void;
}
open、close、error、message、reconnected。SigningConfig 定义复用 packages/connectors/pacifica/src/signing.ts。subscribeAuthenticated 可显式传入凭证(多账号时很有用),否则默认使用 constructor 配置;orders.* / fills.* / account.* 会自动套用签名。