跳转至

交易系统的定点数

一、为何禁用浮点数

  • 精度崩坏:0.1 二进制不可表,高频累加致废单/对账差错
  • 跨环境漂移:CPU/编译器差异致回测-实盘信号失真
  • 规则冲突:交易所撮合引擎仅认 tick_size 整数倍价格,浮点生成价必废单

二、定点数核心法则

物理值 = 定点整数 / Scale  // Scale = 1/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倍数→自动对齐→拦截废单

五、规范总结

  1. 严禁定点浮点转换
  2. 严禁Scale硬编码/模块混用
  3. 确保先乘后除
  4. 确保溢出防护
  5. 确保舍入规则符合交易所