面向
packages/connectors/pacifica,统一 REST / WebSocket 接口签名、限流与错误处理实现,支撑 M1.6 Placement Throttling、Incremental Grid 等工作流。
| 模块 | 文件 | 说明 |
|---|---|---|
| REST Adapter | packages/connectors/pacifica/src/adapter.ts |
下单、撤单、批量撤单、账户/仓位查询 |
| WS Order Gateway | packages/connectors/pacifica/src/wsOrderGateway.ts |
WebSocket RPC 下单、撤单、订阅 fills/orders |
| Signing | packages/connectors/pacifica/src/signing.ts |
Ed25519 签名、header 生成、时钟偏移校验 |
| Rate Limiter | packages/connectors/pacifica/src/rateLimiter.ts(待实现) |
令牌桶(REST / WS 共享);支持突发与排队 |
| Adapter Registry | packages/connectors/pacifica/src/adapterRegistry.ts |
多账户(maker/hedger/...)注册与生命周期管理 |
/api/v1/orders)const payload = {
symbol: "BTC",
side: "buy",
price: "12345.6",
amount: "0.01",
tif: "GTC",
post_only: true,
reduce_only: false,
client_order_id: "grid-BTC--3-1696766400000-0"
};
const { headers, body } = signRequest({
method: "POST",
path: "/api/v1/orders",
payload,
apiKey: account.apiKey,
secret: account.secret
});
const res = await fetch(`${baseUrl}/orders`, {
method: "POST",
headers,
body: JSON.stringify(payload),
signal: abortController.signal
});
签名要点
timestamp = Date.now();expiry_window = 5000ms(可配置)。{ method, path, queryString, body, timestamp, expiry_window }。Header:
X-Pacific-Key: <apiKey>
X-Pacific-Timestamp: <timestamp>
X-Pacific-Expiry-Window: <expiry_window>
X-Pacific-Signature: <hex/base64 signature>
/api/v1/orders/{order_id})const path = `/api/v1/orders/${orderId}`;
const { headers } = signRequest({ method: "DELETE", path, apiKey, secret });
await fetch(`${baseUrl}${path}`, { method: "DELETE", headers });
/api/v1/orders/by_client_id/{client_id})同上,path = /api/v1/orders/by_client_id/${clientId}。
注意 clientId 需 URI encode。
/api/v1/orders/cancel_batch)const payload = { symbol: "BTC", order_ids: ["..."], client_order_ids: ["..."] };
const { headers, body } = signRequest({ method: "POST", path: "/api/v1/orders/cancel_batch", payload, apiKey, secret });
await fetch(`${baseUrl}/orders/cancel_batch`, { method: "POST", headers, body });
返回体统一处理:解析 JSON;若
error.code存在则抛出ConnectorError,包含code/message/status。
const ws = new PacificaWebSocket({
url: wsUrl,
apiKey,
secret,
heartbeatIntervalMs: 30_000,
reconnectBackoff: [1000, 2000, 5000, 10000]
});
await ws.connect(); // 建立 socket
await ws.waitForOpen(); // 等待 OPEN
await ws.authenticate(); // 发送 auth 消息,携带签名与时间戳
认证 payload 与 REST 类似:
{ type: "auth", account: apiKey, timestamp, expiry_window, signature }
WebSocket 使用 request/response(JSON-RPC 风格):
const payload = {
symbol: "BTC",
side: "bid", // bid/ask
price: "12345.6",
amount: "0.01",
tif: "GTC",
client_order_id: "grid-BTC--3-1696766400000-0"
};
const res = await ws.sendRpc("create_order", payload, timeoutMs);
snake_case(参考 Pacifica 官方文档)。{ order_id: "..." };失败则包含 error 字段。error.code = "post_only_cross" → 调整价格重试;error.code = "rate_limit_exceeded" → 进入排队/回退。timeoutMs 默认 15 秒,可按 Workstream 2 需求调整。ws.subscribeAuthenticated(`orders.${apiKey}`);
ws.subscribeAuthenticated(`fills.${apiKey}`);
ws.on("message", handlePrivateMessage);
handlePrivateMessage 负责解析 channel、路由到 runner 的 routeOrder / routeFill。
{ type: "ping" },收到 { type: "pong" } 即认为连接有效。authenticate,并补发订阅。burst = 10、refill = 10/秒。burst、refillMs、maxQueueDepth。interface RateLimiter {
acquire(tokens?: number): Promise<void>; // 获取令牌,若不足则等待
tryAcquire(tokens?: number): boolean; // 无等待的尝试
pending(): number; // 当前排队任务数
}
packages/connectors/pacifica/src/rateLimiter.ts,供 REST/WS 共享。connector_rate_limiter_tokens, connector_rate_limiter_queue.rateLimiter.acquire();超时则抛出 RateLimitError。配置:
execution:
rest_rate_limiter:
burst: 10
refill_per_sec: 8
ws_rate_limiter:
burst: 6
refill_per_sec: 5
max_queue_depth: 50
| 错误类型 | 行为 | 备注 |
|---|---|---|
429 / rate_limit_exceeded |
指数退避重试(100ms → 200ms → ...,最多 5 次) | 超过次数后抛给上层触发降级 |
| 5xx / 网络错误 | 同上,若连续失败 3 次 → 触发告警 | |
post_only_cross |
调整价格(spread + cushion)重试一次 | 超过次数则上抛 |
| 订单不存在 | 视为成功(撤单幂等) | |
| 签名错误 / 401 | 立即触发 Kill-Switch | 需检查时间同步 |
connector_rest_latency_ms{method, path, status}:REST RTTconnector_ws_rpc_latency_ms{method, status}:WS RPC RTTconnector_rate_limit_retries_total{method}:限流重试次数connector_ws_reconnects_total:重连次数component: 'PacificaConnector', action: 'rest_request' | 'ws_rpc' | 'ws_reconnect'signing.ts 生成的 header 与官方示例一致;过期签名被拒。modify_order,可直接替换 cancel+place 模式;否则需在 Workstream 1 中谨慎实现原子性。