行情接入:从模拟行情源切换到交易所直连行情
做市系统从模拟盘迁移到实盘,最刺激的一步就是行情切换。模拟盘时你用的可能是自己造的假数据,或者从历史库里回放的老数据。但实盘不一样,交易所的行情是活的,而且L1和L2的数据差异,搞不好会让你整个策略崩掉。
我个人习惯,先把行情源分清楚。模拟行情源通常长这样:
- 本地CSV文件回放
- 数据库里存的TICK快照
- 第三方模拟网关(比如CTP的模拟环境)
而实盘直连,你得面对交易所的行情网关。拿国内期货市场举例,就是CTP的行情前置机。嗯,这里要注意,CTP的行情接口和交易接口是分开的,别搞混了。
L1和L2到底差在哪?
说白了,L1是快照行情,L2是逐笔行情。我在项目中遇到过不止一次,有人把L1当L2用,结果策略在实盘里频繁报单又撤单,手续费亏得比利润还多。
来看个对比表:
| 维度 | L1(Level 1) | L2(Level 2) |
|---|---|---|
| 数据频率 | 约500ms-3s一次快照 | 逐笔成交,微秒级 |
| 盘口深度 | 通常只有买卖5档 | 买卖10档甚至全量 |
| 成交量 | 累计成交量 | 每笔成交明细 |
| 订单信息 | 无 | 逐笔委托(部分市场) |
| 延迟 | 较高,适合低频策略 | 极低,适合高频做市 |
做市系统,说白了就是靠吃盘口差价活着。你用L1的500ms快照去算中间价,等你算出来,行情早变了。所以实盘做市,L2是标配。
切换时最容易踩的坑
我曾经在切换行情源时,没注意时间戳的精度。模拟行情的时间戳是毫秒级的,但CTP的L2行情是微秒级。我的策略里有个订单簿重建逻辑,直接用时间戳做排序,结果微秒和毫秒混在一起,订单簿乱成一锅粥。
避坑指南:
- 时间戳统一用纳秒或微秒,别混用
- L2的逐笔成交和L1的快照,要分开处理
- 行情网关断线重连后,要清空旧数据重建订单簿
代码层面的切换要点
我一般会封装一个行情抽象层。模拟和实盘都实现同一个接口,切换时改个配置就行。给你看个简化版:
// 行情接口抽象
interface IMarketDataFeed {
// 订阅合约
void Subscribe(string symbol);
// 取消订阅
void Unsubscribe(string symbol);
// 注册行情回调
void OnMarketData(Action<MarketData> callback);
}
// 模拟行情实现
class SimMarketDataFeed : IMarketDataFeed {
// 从CSV文件读取数据,按时间戳回放
// 注意:模拟时速度可以调快,但实盘必须实时
}
// 实盘CTP行情实现
class CTPMarketDataFeed : IMarketDataFeed {
// 直连CTP行情前置机
// 处理心跳、重连、数据校验
}
为什么这样做?你想想看,模拟盘和实盘切换时,最怕的就是改代码。你改一行,可能引入十个bug。抽象层隔离后,切换就是改个配置文件的事。
L2数据的特殊处理
L2行情里有个东西叫「逐笔成交」,它和L1的累计成交量不一样。逐笔成交是每一笔实际成交的明细,包括价格、数量、时间、买卖方向。
我在做市策略里,会用逐笔成交来估算瞬时流动性。比如某只股票,L2显示最近1秒内有10笔大单买入,那说明买方力量强,我的做市报价就要往卖盘倾斜。
小技巧:L2的逐笔成交数据量很大,别直接丢到策略里算。我习惯先做一层聚合,比如按100ms窗口聚合出买卖压力指标,再喂给策略。这样既保留了L2的精度,又不会让策略被高频噪声干扰。
行情网关的容错设计
实盘行情网关不是100%可靠的。CTP偶尔会断线,交易所也会维护。你的系统必须能优雅处理。
我建议的容错策略:
- 双行情源:主用CTP,备用其他行情商(比如万得、彭博)
- 断线检测:连续3秒没收到行情,触发重连
- 数据校验:收到行情后,检查价格是否在合理范围(比如涨跌停内)
- 降级处理:如果L2断了,自动降级到L1,但策略要降低报单频率
嗯,这里有个血泪教训。我曾经只依赖一个行情源,结果交易所网关升级,断线了5分钟。那5分钟里我的做市系统还在按旧行情报价,直接被人套利套走了十几万。从那以后,双行情源就成了我的标配。
知识体系结构图
下面这张图,概括了行情接入的核心逻辑:
从图里你能看到,行情源切换不是简单的换根网线。它涉及数据格式、频率、深度、容错等多个维度的变化。我建议你在模拟盘阶段,就先把L2的代码写好,用历史L2数据回放测试。等模拟盘跑顺了,再切到实盘L2,这样风险最小。
核心总结:行情接入是模拟盘到实盘迁移的第一道坎。L1和L2的数据差异,直接影响你的做市策略能不能赚钱。用抽象层隔离变化,用双行情源保证可用性,用逐笔聚合提升策略质量。这三件事做好了,行情切换就稳了。
公众号:蓝海资料掘金营,微信deep3321