交易系统的定点数¶
一、为何禁用浮点数
- 精度崩坏:0.1 二进制不可表,高频累加致废单/对账差错
- 跨环境漂移:CPU/编译器差异致回测-实盘信号失真
- 规则冲突:交易所撮合引擎仅认 tick_size 整数倍价格,浮点生成价必废单
二、定点数核心法则
- Scale 选择:严格对齐交易所 tick_size(例:IF期货 tick=0.2 → Scale=10)
- 数据类型:
int64_t(范围±9e18,支持负值,全平台一致,CPU原生加速) - 舍入规则:
- 价格 → 向下对齐 tick(
align_price_to_tick) - 资金/盈亏 → 四舍五入到分
三、工程化实现
// 编译期常量定义(按模块隔离)
constexpr int64_t PRICE_SCALE = 10; // 期货价格
constexpr int64_t MONEY_SCALE = 100; // 资金/盈亏
// 核心运算(强制内联 + 溢出防护)
int64_t fixed_mul(a, a_sc, b, b_sc, tgt_sc) {
// 先乘后除 + 四舍五入 + 溢出校验(is_mul_overflow编译期检查)
}
int64_t align_price_to_tick(price, tick) {
return (price / tick) * tick; // 向下对齐,杜绝废单
}
- 零浮点混用:行情解码→计算→报单全程整数
- Scale显式传递:禁止硬编码,运算时明确指定源/目标Scale
四、场景速查
| 场景 | 关键操作 | 定点逻辑 |
|---|---|---|
| 订单簿档位 | (price - min_price) / tick |
O(1)整数索引,零误差 |
| 持仓盈亏 | (最新价-开仓价)*数量*乘数 |
先乘后除,Scale=100四舍五入 |
| 保证金 | 合约价值 * 保证金比例 |
全链路Scale=100,对齐清算规则 |
| 报单校验 | is_price_valid(price, tick) |
非tick倍数→自动对齐→拦截废单 |
五、规范总结
- 严禁定点浮点转换
- 严禁Scale硬编码/模块混用
- 确保先乘后除
- 确保溢出防护
- 确保舍入规则符合交易所