现有系统是一个交易系统,核心是两个账户(Account A 和 Account B)成组协作。交易策略组件负责生成交易信号,包括:
信号生成依赖于:
基于这些数据,系统决定是否开启交易对冲(Hedging),以实现风险管理和利润优化。下单执行也通过带授权的WebSocket实现,确保实时性和安全性。所有WS交互遵循Pacifica API规范,包括心跳机制(ping/pong,每60秒)以维持连接。认证示例(基于提供的Python sample)展示如何为私有操作(如取消订单)生成签名消息,可扩展到订阅账户数据和下单。
认证机制概述(基于sample):
注意:Python sample为参考;在TypeScript中,使用库如@solana/web3.js
或tweetnacl
实现Ed25519签名和base58解码。后续需确认Pacifica的精确type值(如"subscribe_account" for 账户订阅)。
wss://ws.pacifica.fi/ws
,Testnet wss://test-ws.pacifica.fi/ws
。ws
(WebSocket)、tweetnacl
(签名)、bs58
(base58)。系统采用分层架构:
[外部数据源: Pacifica WS API]
- 市场数据 (WS: Price/Orderbook,无auth)
- 账户数据 (WS: Orders/Balance/Position,带签名auth)
- 下单执行 (WS: Send Orders,带签名auth)
↓ (数据采集层)
[数据采集组件]
- Market Data Fetcher (WS,无auth)
- Account Data Fetcher (WS,带签名auth)
↓ (数据流: 实时推送)
[核心处理层]
- Data Aggregator (聚合市场与账户数据)
- Trading Strategy Engine (生成信号: 平衡/减仓/开仓)
- Hedging Decision Module (决定对冲)
↓ (信号输出)
[执行层]
- Signal Executor (通过WS下单,带签名auth)
- Logger & Monitor (日志与监控)
↓ (反馈循环)
[账户组: Account A & B]
{"id": "uuid", "params": {...}}
。私有操作需签名。以下表格列出系统主要组件、职责、输入/输出及依赖。更新点:集成签名认证模块;所有私有WS操作使用TypeScript等效逻辑。
组件名称 | 职责描述 | 输入数据 | 输出数据 | 依赖/技术 |
---|---|---|---|---|
Market Data Fetcher | 通过WebSocket订阅实时市场数据(公共通道),确保无授权访问。处理断线重连和心跳(ping每60秒)。 | WS URL (e.g., wss://ws.pacifica.fi/ws) | 实时Price/Orderbook JSON | TypeScript + ws库;消息: {"method": "subscribe", "params": {channel: "market"}} |
Account Data Fetcher | 通过带签名的WebSocket订阅两个账户的个人数据(私有通道)。实时接收更新,支持账户组配置。处理签名生成、token刷新(expiry_window)、断线重连和心跳。 | WS URL + Private Key (base58) | Orders/Balance/Position JSON | TypeScript + ws库 + tweetnacl/bs58;签名: signMessage(header, payload, keypair) |
Data Aggregator | 聚合市场和账户数据,进行初步清洗和同步。缓存最近数据以减少延迟。 | 来自Fetcher的实时数据 | 聚合数据集 (e.g., {'market': {...}, 'accounts': {...}}) | TypeScript;Redis/Memory Cache |
Trading Strategy Engine | 根据聚合数据运行策略算法,生成信号。支持自定义规则(如阈值触发)。 | 聚合数据集 | 信号列表 (e.g., [{'type': 'open', 'account': 'A', 'details': {...}}]) | TypeScript + 自定义算法 (e.g., lodash for analysis) |
Hedging Decision Module | 评估信号是否需对冲(e.g., 如果A开仓,B减仓)。基于风险模型决定。 | 生成的信号 + 聚合数据 | 对冲决策 (e.g., {'hedge': True, 'actions': [...]}) | TypeScript;规则引擎/Risk Model |
Signal Executor | 通过带签名的WebSocket执行信号/对冲,向交易所发送订单。处理执行失败重试和确认。 | 信号 + 对冲决策 + WS URL + Private Key | 执行结果 (成功/失败日志) | TypeScript + ws库 + tweetnacl/bs58;消息: {"id": "uuid", "params": {order: signedMessage}} |
Logger & Monitor | 记录所有操作、信号和错误。监控系统健康(如数据延迟、WS连接状态、心跳响应、签名有效性)。 | 全系统事件 | 日志文件/警报 | TypeScript + Winston库;Prometheus |
Auth Signer (新) | 通用签名模块:生成Keypair、signature_header/payload、message/signature。复用于私有WS操作。 | Private Key + operation type + params | Signed message_to_send | TypeScript + tweetnacl (Ed25519) + bs58;等效Python sign_message |
Order Lifecycle Manager (新) | 基于WebSocket实时监控订单生命周期,追踪未成交订单的存活时间,自动取消超时订单。支持配置超时阈值、检查间隔和重试策略。 | WebSocket订单更新 + 配置参数 (maxOrderAge, checkInterval) | 订单取消信号 (Cancel Signal) | TypeScript + 定时器 + Map缓存;集成 Account Data Fetcher 和 Signal Executor |
{"method": "subscribe", "params": {...}}
订阅公共市场数据。Account Data Fetcher 通过WS(带签名)订阅私有账户数据:使用Auth Signer生成签名消息,发送{"id": "uuid", "params": {"subscribe_account": signedPayload}}
。{"method": "ping"}
维持连接,响应{"channel": "pong"}
。签名expiry_window=5000ms,确保及时性。created_at
)和当前状态(open
/filled
/cancelled
)。lifecycleCheckInterval
)所有未成交订单的存活时间。maxOrderAge
)时,生成订单取消信号。{"id": uuid(), "params": {"cancel_order": signedMessage}}
。cancelRetryAttempts
),每次重试间隔1秒(可配置cancelRetryDelay
)。preferredOrderType
选择(默认 'limit')。限价单价格策略(穿越价差快速成交):为保证刷量交易的快速成交,采用接近对手价的定价策略。买单(bid)使用 orderbook 最优卖价(best_ask)作为基准并略微降低,卖单(ask)使用最优买价(best_bid)作为基准并略微提高。这样订单价格会非常接近当前成交区域,确保快速成交。价格计算公式:bid_price = orderbook.best_ask * (1 - priceBuffer)
, ask_price = orderbook.best_bid * (1 + priceBuffer)
,其中 priceBuffer 为价格缓冲(默认0.0001=0.01%),用于避免完全穿越价差变成纯taker订单。市价单策略:当配置为 market 时,直接使用市价单成交,无需计算价格,成交速度最快但支付 taker 费用。可通过配置参数 emergencyMarketThreshold
设置紧急市价单阈值,当限价单超时或价格波动超过阈值时自动切换为市价单。ws
库,支持WSS。订阅格式:{"method": "subscribe", "params": {channel: "name"}}
;私有操作:{"id": "uuid", "params": {type: signedMessage}}
。心跳:setInterval发送ping。认证TypeScript等效(基于Python sample):
import nacl from 'tweetnacl';
import bs58 from 'bs58';
import { v4 as uuidv4 } from 'uuid';
import WebSocket from 'ws'; // 或 ws 库
// 生成Keypair (假设Ed25519)
const privateKeyBytes = bs58.decode(PRIVATE_KEY);
const keypair = nacl.sign.keyPair.fromSecretKey(privateKeyBytes);
const publicKey = bs58.encode(keypair.publicKey);
// 签名函数 (等效 sign_message)
function signMessage(header: any, payload: any, keypair: any): [string, string] {
const message = JSON.stringify({ header, payload });
const messageBytes = new TextEncoder().encode(message);
const signatureBytes = nacl.sign.detached(messageBytes, keypair.secretKey);
const signature = bs58.encode(signatureBytes);
return [message, signature];
}
// 示例: 取消订单 (泛化到其他操作)
async function sendSignedWS(WS_URL: string, operationType: string, payload: any, privateKey: string) {
const timestamp = Math.floor(Date.now());
const signatureHeader = { timestamp, expiry_window: 5000, type: operationType };
const [message, signature] = signMessage(signatureHeader, payload, keypair);
const requestHeader = { account: publicKey, signature, timestamp: signatureHeader.timestamp, expiry_window: signatureHeader.expiry_window };
const messageToSend = { ...requestHeader, ...payload };
const ws = new WebSocket(WS_URL, { pingInterval: 30000 }); // 30s ping
ws.on('open', async () => {
const wsMessage = { id: uuidv4(), params: { [operationType]: messageToSend } };
ws.send(JSON.stringify(wsMessage));
});
ws.on('message', (data) => { console.log('Response:', data.toString()); });
// 处理 close/error/reconnect
}
订单生命周期管理TypeScript实现(新增):
import { EventEmitter } from 'events';
// 订单追踪数据结构
interface TrackedOrder {
orderId: number;
symbol: string;
side: 'bid' | 'ask';
createdAt: number; // timestamp in ms
status: 'open' | 'filled' | 'cancelled';
checkCount: number; // 检查次数
retryCount: number; // 取消重试次数
}
// 配置接口
interface LifecycleConfig {
maxOrderAge: number; // 订单最大存活时间(ms),默认30000
lifecycleCheckInterval: number; // 检查间隔(ms),默认5000
cancelRetryAttempts: number; // 取消重试次数,默认3
cancelRetryDelay: number; // 重试延迟(ms),默认1000
}
// 订单生命周期管理器
class OrderLifecycleManager extends EventEmitter {
private orders: Map<number, TrackedOrder> = new Map();
private checkTimer: NodeJS.Timeout | null = null;
private config: LifecycleConfig;
constructor(config: Partial<LifecycleConfig> = {}) {
super();
this.config = {
maxOrderAge: config.maxOrderAge || 30000,
lifecycleCheckInterval: config.lifecycleCheckInterval || 5000,
cancelRetryAttempts: config.cancelRetryAttempts || 3,
cancelRetryDelay: config.cancelRetryDelay || 1000
};
}
// 启动生命周期监控
start(): void {
if (this.checkTimer) return;
this.checkTimer = setInterval(() => {
this.checkAndCancelStaleOrders();
}, this.config.lifecycleCheckInterval);
console.log('Order lifecycle manager started');
}
// 停止监控
stop(): void {
if (this.checkTimer) {
clearInterval(this.checkTimer);
this.checkTimer = null;
}
console.log('Order lifecycle manager stopped');
}
// 监听订单更新(从 WebSocket Account Data Fetcher)
onOrderUpdate(order: any): void {
const orderId = order.order_id || order.i;
const status = order.order_status || order.status;
if (status === 'open') {
// 新订单或未成交订单,添加到追踪
if (!this.orders.has(orderId)) {
this.orders.set(orderId, {
orderId,
symbol: order.symbol || order.s,
side: order.side,
createdAt: (order.created_at || order.t) * 1000, // convert to ms
status: 'open',
checkCount: 0,
retryCount: 0
});
console.log(`Tracking new order: ${orderId} (${order.symbol})`);
}
} else {
// 已成交或已取消,从追踪中移除
if (this.orders.has(orderId)) {
this.orders.delete(orderId);
console.log(`Order ${orderId} removed from tracking (status: ${status})`);
}
}
}
// 定期检查并取消超时订单
private async checkAndCancelStaleOrders(): Promise<void> {
const now = Date.now();
const staleOrders: TrackedOrder[] = [];
for (const [orderId, tracked] of this.orders) {
tracked.checkCount++;
const age = now - tracked.createdAt;
if (age > this.config.maxOrderAge) {
staleOrders.push(tracked);
console.warn(`Order ${orderId} has exceeded max age: ${age}ms (limit: ${this.config.maxOrderAge}ms)`);
}
}
// 批量取消超时订单
for (const order of staleOrders) {
await this.cancelOrderWithRetry(order);
}
}
// 带重试的订单取消
private async cancelOrderWithRetry(order: TrackedOrder): Promise<void> {
const maxRetries = this.config.cancelRetryAttempts;
while (order.retryCount < maxRetries) {
try {
// 发出取消信号(由 Signal Executor 处理)
const cancelSignal = {
type: 'cancel_order',
order_id: order.orderId,
symbol: order.symbol,
reason: 'timeout',
age: (Date.now() - order.createdAt) / 1000 // 秒
};
this.emit('cancel_signal', cancelSignal);
console.log(`Cancel signal emitted for order ${order.orderId} (attempt ${order.retryCount + 1}/${maxRetries})`);
// 等待确认(假设有确认机制)
// 如果成功,从追踪中移除
this.orders.delete(order.orderId);
return;
} catch (error) {
order.retryCount++;
console.error(`Failed to cancel order ${order.orderId} (attempt ${order.retryCount}/${maxRetries}):`, error);
if (order.retryCount < maxRetries) {
await this.delay(this.config.cancelRetryDelay);
} else {
// 达到最大重试次数,记录错误并移除
console.error(`Max retry attempts reached for order ${order.orderId}, giving up`);
this.emit('cancel_failed', {
orderId: order.orderId,
symbol: order.symbol,
error: 'Max retries exceeded'
});
this.orders.delete(order.orderId);
}
}
}
}
// 延迟工具函数
private delay(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 获取当前追踪的订单数量
getTrackedOrderCount(): number {
return this.orders.size;
}
// 清理所有追踪的订单
clear(): void {
this.orders.clear();
}
}
// 使用示例
const lifecycleManager = new OrderLifecycleManager({
maxOrderAge: 30000, // 30秒
lifecycleCheckInterval: 5000, // 每5秒检查一次
cancelRetryAttempts: 3,
cancelRetryDelay: 1000
});
// 监听取消信号
lifecycleManager.on('cancel_signal', (signal) => {
// 传递给 Signal Executor 执行取消
console.log('Executing cancel signal:', signal);
// signalExecutor.execute(signal);
});
// 监听取消失败事件
lifecycleManager.on('cancel_failed', (info) => {
console.error('Order cancellation failed:', info);
// 记录到日志或告警系统
});
// 启动监控
lifecycleManager.start();
// 接收 WebSocket 订单更新
// accountDataFetcher.on('order_update', (order) => {
// lifecycleManager.onOrderUpdate(order);
// });
说明:以下优化专门针对Delta中性刷量交易策略,旨在提高成交效率、降低风险、优化手续费成本。
同步下单(Synchronized Order Placement):
syncOrderDelay
(默认50ms),控制两单之间的最大时间差交叉成交预防(Self-Trade Prevention):
minPriceGap
(默认0.01%),防止自成交动态主从切换(Dynamic Master-Slave Switching):
基于深度的动态调整(Depth-Based Sizing):
const depth = orderbook.getDepthAt(targetPrice, side);
const baseSize = calculateBaseSize(balance);
const adjustedSize = baseSize * Math.min(1, depth / (baseSize * 2));
阶梯式拆单(Ladder Order Splitting):
splitThreshold
)自动拆分成3-5个小单priceStep
(默认0.005%)splitDelay
(默认200ms)订单大小随机化(Size Randomization):
const randomFactor = 0.8 + Math.random() * 0.4; // 80%-120%
const finalSize = baseSize * randomFactor;
orderSizeRandomRange
(默认±20%)基于波动率的动态间隔(Volatility-Based Intervals):
const volatility = calculateVolatility(priceHistory, 60); // 60秒窗口
const baseInterval = 5000; // 5秒基础间隔
const dynamicInterval = baseInterval * (1 - volatility * 0.5);
volatilityMultiplier
(默认0.5)避开高频时段(Avoid Peak Hours):
skipPeakHours
(默认true)基于价差的触发(Spread-Based Trigger):
const spread = (orderbook.ask - orderbook.bid) / orderbook.mid;
if (spread > maxSpreadThreshold) return; // 价差过大时不交易
maxSpreadThreshold
(默认0.002 = 0.2%)动态价格缓冲(Dynamic Price Buffer):
const baseBuffer = 0.0001; // 0.01%
const spreadFactor = currentSpread / averageSpread;
const dynamicBuffer = baseBuffer * Math.max(0.5, Math.min(2, spreadFactor));
队列位置优化(Queue Position Optimization):
queuePositionStrategy
('aggressive' | 'passive' | 'adaptive')多档挂单(Multi-Level Orders):
orderLevels
(默认2)分层Delta管理(Multi-Timeframe Delta Control):
const delta1m = calculateDelta(positions, 60); // 1分钟Delta
const delta5m = calculateDelta(positions, 300); // 5分钟Delta
const delta1h = calculateDelta(positions, 3600); // 1小时Delta
// 综合判断,短期Delta权重更高
const weightedDelta = delta1m * 0.5 + delta5m * 0.3 + delta1h * 0.2;
Delta容忍度动态调整(Dynamic Delta Tolerance):
预测性Delta调整(Predictive Delta Adjustment):
(bidVolume - askVolume) / totalVolume
立即对冲(Immediate Hedging):
ws.on('order_filled', async (order) => {
const hedgeOrder = createHedgeOrder(order);
await sendOrderWithinMs(hedgeOrder, 50); // 50ms内发出对冲单
});
成交价差利用(Fill Spread Capture):
连续成交激励(Consecutive Fill Boost):
consecutiveFillBonus
(默认1.1)做市商模式识别(Market Maker Detection):
function detectMarketMaker(orderbook) {
// 检测固定大小、固定间隔的订单模式
const patterns = findRepetitivePatterns(orderbook);
return patterns.length > threshold;
}
大单跟随(Large Order Following):
largeOrderThreshold
(默认10x)智能避让(Smart Avoidance):
Maker比例最大化(Maximize Maker Ratio):
// 优先使用post-only订单
const order = {
...baseOrder,
postOnly: true, // 如果会成为taker则自动取消
price: adjustPriceForMaker(targetPrice)
};
VIP等级优化(VIP Tier Optimization):
时段选择(Time-Based Optimization):
新闻事件自动检测(News Event Detection):
priceChangeThreshold
(默认0.01)异常价格快速响应(Anomaly Response):
if (Math.abs(currentPrice - ma20) / ma20 > 0.05) {
// 价格偏离MA20超过5%
await cancelAllOrders();
await pauseTrading(60000); // 暂停1分钟
}
流动性危机处理(Liquidity Crisis Handling):
循环交易优化(Circular Trading):
// A买B卖 -> B买A卖 循环
async function circularTrade() {
await placeOrders(accountA, 'buy', accountB, 'sell');
await waitForFills();
await placeOrders(accountB, 'buy', accountA, 'sell');
}
短期价差收割(Micro Spread Harvesting):
滑点容忍度调整(Slippage Tolerance):
volumeModeSlippage
(默认0.0005)```typescript interface DeltaStrategyConfig { // 双账户协同 syncOrderDelay: number; // 同步延迟(ms),默认50 minPriceGap: number; // 最小价差,默认0.0001
// 订单大小 orderSizeRandomRange: number; // 随机范围,默认0.2 splitThreshold: number; // 拆单阈值,默认1000 USDC
// 时机选择 volatilityMultiplier: number; // 波动率系数,默认0.5 maxSpreadThreshold: number; // 最大价差,默认0.002 skipPeakHours: boolean; // 跳过高峰,默认true
// 价格策略 dynamicPriceBuffer: boolean; // 动态缓冲,默认true queuePositionStrategy: string; // 队列策略,默认'adaptive' orderLevels: number; // 挂单层数,默认2
// Delta控制 deltaTimeframes: number[]; // 时间框架[60,300,3600] deltaWeights: number[]; // 权重[0.5,0.3,0.2]
// 成交处理 immediateHedgeTimeout: number; // 对冲超时(ms),默认50 consecutiveFillBonus: number; // 连续奖励,默认1.1
// 竞争避让 competitorDetection: boolean; // 竞争检测,默认true largeOrderThreshold: number; // 大单阈值,默认10
// 手续费 preferMakerOrders: boolean; // 优先Maker,默认true postOnlyOrders: boolean; // 仅挂单,默认false
// 风险控制 priceChangeThreshold: number; // 价格突变,默认0.01 liquidityCrisisSpread: number; // 流动性危机,默认0.01
// 刷量优化 volumeModeSlippage: number; // 刷量滑点,默认0.0005 circularTradeEnabled: boolean; // 循环交易,默认true }