版本: v1.0.0 日期: 2025-10 目标: 在现有架构基础上快速实现网格策略,作为剥头皮策略的替代/补充方案
M1.5 (MVP) M2.5 (增强版) M3.5 (混合策略)
↓ ↓ ↓
2-3 天 +1 周 +1-2 周
固定网格 自适应网格 网格+剥头皮
验证对冲 生产就绪 最大化收益
M1 (核心骨架) → M1.5 (网格 MVP) → M2 (剥头皮) 或 M2.5 (增强网格)
↓
验证对冲架构
↓
若成功 → 继续优化网格
若失败 → 修复对冲再做剥头皮
用最小代码量验证:
packages/strategies/gridMaker.ts(新建,约 200 行)
export interface GridConfig {
symbol: string;
gridStepBps: number; // 网格间距(bps)
gridRangeBps: number; // 网格范围(bps)
baseClipUsd: number; // 单层订单大小(USD)
maxLayers: number; // 最大层数
hedgeThresholdBase: number; // 对冲阈值
}
export interface GridLevel {
index: number; // 网格索引(正=卖单,负=买单)
side: Side;
px: number;
orderId?: string;
filled: boolean;
}
export class GridMaker {
private grids: Map<number, GridLevel> = new Map();
private currentDelta: number = 0;
constructor(
private config: GridConfig,
private router: OrderRouter,
private hedgeEngine: HedgeEngine,
private shadowBook: ShadowBook
) {}
// 初始化网格
async initialize(): Promise<void>;
// Fill 回调
async onFill(fill: Fill): Promise<void>;
// 重置网格(清除旧订单,重新布置)
async reset(): Promise<void>;
// 私有方法
private async placeGridOrder(index: number, side: Side, px: number): Promise<string>;
private findGridLevel(orderId: string): GridLevel | undefined;
private updateDelta(fill: Fill): void;
}
功能点:
initialize(): 在当前 mid 周围布置双边网格onFill(): 成交后挂对手单,更新 Delta,检查对冲阈值reset(): 撤销所有旧订单,重新布网格config/config.yaml 补充:
# 策略选择
strategy_mode: grid # grid | scalper | both
# 网格策略配置
grid:
enabled: true
symbol: BTC
grid_step_bps: 100 # 1%
grid_range_bps: 400 # 4%
base_clip_usd: 500
max_layers: 4
hedge_threshold_base: 0.3 # 累积 0.3 BTC 触发对冲
apps/runner/src/index.ts 修改:
const cfg = parse(readFileSync("config/config.yaml","utf8"));
if (cfg.strategy_mode === 'grid' || cfg.strategy_mode === 'both') {
const gridMaker = new GridMaker(
cfg.grid,
router,
hedgeEngine,
shadow
);
await gridMaker.initialize();
// 监听 Fill 事件
adapter.onFill((fill) => gridMaker.onFill(fill));
}
if (cfg.strategy_mode === 'scalper' || cfg.strategy_mode === 'both') {
// 原有 Scalper 逻辑
}
packages/domain/src/types.ts 补充:
export interface GridLevel {
index: number;
side: Side;
px: number;
orderId?: string;
filled: boolean;
timestamp: number;
}
packages/strategies/__tests__/gridMaker.test.ts(新建)
describe('GridMaker', () => {
it('should initialize grid orders correctly');
it('should place opposite order on fill');
it('should trigger hedge when delta exceeds threshold');
it('should not exceed max_base_abs');
});
Day 1:
- 实现 GridMaker 核心逻辑(initialize + onFill)
- 配置扩展
- Runner 集成
Day 2:
- 测试用例
- 本地模拟测试(mock adapter)
- 修复 bug
Day 3:
- 测试网小额测试(1-2 小时)
- 观察指标:成交率、对冲延迟、Delta 控制
- 文档更新
在 MVP 基础上,增加生产级功能,使其可长期稳定运行。
packages/strategies/gridMaker.ts 扩展:
class GridMaker {
private gridCenter: number; // 当前网格中心
async onTimer() {
const mid = this.shadowBook.mid();
const deviation = Math.abs(mid - this.gridCenter) / this.gridCenter;
if (deviation > this.config.recenterThresholdBps / 1e4) {
logger.info(`Grid recenter triggered: deviation=${deviation}`);
await this.reset(); // 撤旧单,以新 mid 为中心重新布网格
this.gridCenter = mid;
}
}
}
配置:
grid:
adaptive_recenter:
enabled: true
recenter_threshold_bps: 200 # 偏离 2% 重置
packages/strategies/trendFilter.ts(新建)
export class TrendFilter {
private priceHistory: Array<{ts: number, price: number}> = [];
isTrending(): boolean {
if (this.priceHistory.length < this.config.lookbackPeriods) {
return false;
}
const oldest = this.priceHistory[0].price;
const latest = this.priceHistory[this.priceHistory.length - 1].price;
const change = Math.abs(latest - oldest) / oldest;
return change > this.config.trendThresholdBps / 1e4;
}
}
集成到 GridMaker:
async onTimer() {
if (this.trendFilter.isTrending()) {
logger.warn('Trend detected, pausing grid');
await this.pause(); // 撤销所有挂单
return;
}
// 正常逻辑...
}
配置:
grid:
trend_filter:
enabled: true
lookback_periods: 12 # 12 * 5min = 1h
trend_threshold_bps: 50 # 1h 涨跌 > 0.5%
packages/strategies/volatilityMonitor.ts(新建)
export class VolatilityMonitor {
async checkDailyRange(): Promise<void> {
const range = this.calc24hRange();
if (range < this.config.minDailyRangeBps / 1e4) {
logger.warn(`Low volatility detected: ${range}`);
switch (this.config.action) {
case 'notify':
await this.sendAlert('Low volatility');
break;
case 'reduce_step':
this.gridMaker.updateGridStep(0.5); // 缩小到 0.5%
break;
case 'switch_strategy':
await this.switchToMM();
break;
}
}
}
}
配置:
grid:
volatility_monitor:
enabled: true
min_daily_range_bps: 80
action: notify # notify | reduce_step | switch_strategy
Runner 修改:
const grids = new Map<string, GridMaker>();
for (const gridCfg of cfg.grid.symbols) {
const gridMaker = new GridMaker(gridCfg, ...);
await gridMaker.initialize();
grids.set(gridCfg.symbol, gridMaker);
}
配置:
grid:
symbols:
- symbol: BTC
grid_step_bps: 100
grid_range_bps: 400
- symbol: ETH
grid_step_bps: 120
grid_range_bps: 500
packages/backtest/gridBacktest.ts(新建)
export class GridBacktest {
async run(params: {
symbol: string;
startDate: Date;
endDate: Date;
gridConfig: GridConfig;
}): Promise<BacktestResult> {
// 事件重放
// 模拟 Fill
// 计算 PnL
// 输出报告
}
}
export interface BacktestResult {
totalReturn: number;
sharpeRatio: number;
maxDrawdown: number;
roundTrips: number;
avgProfitPerRound: number;
hedgeCost: number;
fundingCost: number;
}
CLI:
pnpm backtest:grid --symbol BTC --start 2024-08-01 --end 2024-10-31 --config config/grid_bt.yaml
新增模块:
- packages/strategies/trendFilter.ts (100 行)
- packages/strategies/volatilityMonitor.ts (80 行)
- packages/backtest/gridBacktest.ts (300 行)
扩展模块:
- packages/strategies/gridMaker.ts (+150 行)
- adaptive recenter
- pause/resume
- 多标的支持
配置:
- config/config.yaml (新增 adaptive/trend/volatility 配置)
- config/grid_backtest.example.yaml (新建)
测试:
- packages/strategies/__tests__/trendFilter.test.ts
- packages/strategies/__tests__/volatilityMonitor.test.ts
- packages/backtest/__tests__/gridBacktest.test.ts
文档:
- 更新 GRID_STRATEGY_DESIGN.md (v2.0 特性说明)
- 新增 GRID_BACKTEST_GUIDE.md (回测使用指南)
功能:
- ✅ 网格自动重置触发准确率 > 90%
- ✅ 趋势检测准确率 > 70%
- ✅ 低波动告警及时性 < 30 分钟延迟
- ✅ 多标的并行运行无冲突
性能:
- ✅ 3 个标的同时运行,CPU < 30%
- ✅ 内存占用 < 500MB
回测:
- ✅ 回测月收益率 > 0.8%(震荡市数据)
- ✅ Sharpe > 2.5
- ✅ 最大回撤 < -2%
Week 1:
Day 1-2: 自适应网格中心 + 趋势过滤器
Day 3-4: 低波动监控 + 多标的支持
Day 5: 回测框架核心逻辑
Day 6: 回测报告与参数优化
Day 7: 集成测试 + 文档更新
将网格与剥头皮策略结合,最大化收益。
┌─────────────────────────────────────────┐
│ Strategy Coordinator │
│ (优先级管理 + 冲突检测) │
└──────┬─────────────────────┬────────────┘
│ │
┌──────▼────────┐ ┌───────▼──────────┐
│ GridMaker │ │ MicroScalper │
│ (底层做市) │ │ (极端信号叠加) │
└───────────────┘ └──────────────────┘
│ │
└──────────┬──────────┘
│
┌───────▼────────┐
│ Order Router │
└────────────────┘
class StrategyCoordinator {
async submitIntent(intent: OrderIntent, source: 'grid' | 'scalper'): Promise<boolean> {
// 1. 优先级检查
if (source === 'scalper' && this.hasGridOrderAt(intent.px)) {
logger.warn('Scalper intent conflicts with grid, rejecting');
return false;
}
// 2. 方向冲突检查
const existingIntent = this.getIntentAt(intent.symbol, intent.px);
if (existingIntent && existingIntent.side !== intent.side) {
logger.warn('Direction conflict, canceling lower priority');
await this.cancel(existingIntent);
}
// 3. 通过检查,执行
await this.router.sendLimitChild(intent.toOrder());
return true;
}
}
strategy_mode: both
grid:
enabled: true
symbol: BTC
grid_step_bps: 100
grid_range_bps: 400
priority: 1 # 高优先级
scalper:
enabled: true
trigger:
spread_bps: 3.0 # 仅极端 spread 触发(避免与网格频繁冲突)
min_cooldown_ms: 500
tp_bps: 5
sl_bps: 10
max_clip_ratio: 0.2 # 仓位小于网格
priority: 2 # 低优先级
strategy_coordinator:
conflict_resolution: cancel_lower # 冲突时取消低优先级
新增:
- packages/strategies/coordinator.ts (200 行)
- 优先级管理
- 冲突检测与解决
- 意向订单队列
扩展:
- packages/strategies/gridMaker.ts (+50 行)
- 改为提交 intent 而非直接下单
- packages/strategies/microScalper.ts (+50 行)
- 改为提交 intent
配置:
- config/config.yaml (新增 strategy_coordinator 配置)
测试:
- packages/strategies/__tests__/coordinator.test.ts
- 冲突检测准确性
- 优先级执行顺序
- ✅ 网格与剥头皮无自成交事件
- ✅ 冲突检测准确率 100%
- ✅ 混合策略月收益率 > 单一策略 20%
- ✅ Delta 控制依然有效(P95 < max_base_abs * 0.5)
缓解:
缓解:
缓解:
缓解:
网格特定指标:
- grid_active_orders: 当前活跃网格订单数
- grid_filled_orders_per_hour: 每小时成交次数
- grid_recenter_count: 网格重置次数
- grid_trend_pause_count: 趋势暂停次数
- grid_round_trip_count: 往返成交次数
- grid_avg_profit_per_round: 单次往返平均利润
复用现有指标:
- delta_abs
- hedge_success_rate
- hedge_latency_p99
- funding_cost_net_bps
- pnl_intraday
- grid_filled_orders_per_hour < 1 (持续 2 小时)
→ 告警:低成交率,检查波动率
- grid_recenter_count > 5 (单日)
→ 告警:频繁重置,可能趋势市
- grid_avg_profit_per_round < 0 (持续 1 小时)
→ 告警:负收益,检查手续费或对冲成本
- delta_abs > max_base_abs * 0.8
→ 告警:库存接近上限
在 3.10 策略层补充:
### GridMaker(可选策略)
- 在价格区间内均匀分布买卖订单,捕捉震荡市价差
- 买单成交 → 挂卖单;卖单成交 → 挂买单
- 批量对冲:Delta 累积到阈值触发
- 自适应调整:价格偏离时重置网格中心
- 趋势检测:单边行情时自动暂停
在第 4 节策略设计后补充:
### 4.5 网格策略(备选方案)
- 适用场景:震荡市、高波动低趋势
- 收益模型:grid_step * 往返次数 - 手续费 - 对冲成本
- 优势:实现简单、对冲压力小、参数稳定
- 劣势:趋势市表现差、理论收益上限低
1. 完成 M1(核心骨架)
↓
2. 用 2-3 天实现 M1.5(网格 MVP)
↓
3. 测试网验证 2-4 小时
↓
4. 若成功 → M2.5(增强网格)或 M2(剥头皮)
若失败 → 修复对冲架构,再回到 M1.5
M1.5 成功:
M2.5 成功:
文档完成。代码实现见 CODE_DELIVERY_PLAN.md M1.5 & M2.5 章节。