2 个版本

0.1.1 2022年7月11日
0.1.0 2022年7月5日

#4 in #trade

Apache-2.0

140KB
4K SLoC

libTS3 基础库

Build Status

一、基本说明

  • libTS3 是 Jesse Kuang 独立开发的「Rust 跨平台交易基础设施」程序库,移植自 C++ 版本的 libts
  • 使用 Rust (尽可能兼容 edition 2021)
    • Windows
    • Linux
      • rustc 1.58 或更高版本
  • 跨平台 Linux 优先,但不支持老旧的操作系统
  • 仅考虑 64 位平台
  • 字符串仅支持 UTF8,源文件也使用 UTF8 编码。GBK 应转码
  • 为何选择 libts3? 在众多开源项目的情况下,为何还要开发 libts3?
    • 追求速度
      • std 和 tokio 都非常好,但它们并不是追求速度的。
      • 当需要取舍速度和通用性时,libts3 选择速度。
      • 当需要取舍速度和内存 RAM 用量时,libts3 选择速度。
        • libts3 会权衡大量的 RAM 造成 CPU cache missing,速度不一定会变快。
      • 速度问题分为两类:低延迟、高吞吐量,当两者有冲突时,尽量选择低延迟。
    • 降低第三方依赖。
    • 更符合自己的需求。
      • 许多第三方库,速度很快、功能强大,但也远远超过了我的需求。
      • 我个人倾向于:设计到刚好满足自己的需求就好。

准备工作

主要开发工具及版本

  • Linux: AlmaLinux 8.5 w/ rustup
    • cargo test, rustfmt, clippy
  • Windows
    • cargo test, rustfmt, clippy
  • 开启编译器全部的警告信息:警告信息的重要性,相信不用再提醒了。
    • 警告信息 -- 零容忍。
  • 单元测试工具
    • rust 内置测试
    • bencher crates

二、支持库

julian 儒略日, message 消息包抽象,serde 实现简单类型的序列化与反序列化,timestamp 低延迟微秒/纳秒级计时与时间戳,priceType 针对价格及金额的定点与浮点 double 的互换

julian

儒略日数(Julian Day Number,JDN)的计算是从格林威治标准时间的中午开始,包含一个整天的时间,起点的时间(0日)回溯至儒略历的公元前4713年1月1日中午12点(在格里历是公元前4714年11月24日),这个日期是三种多年周期的共同起点,且是历史上最接近现代的一个起点。 Unix 纪元 1970年1月1日,儒略日为 2440588。采用儒略日,一个 16 位整数即可表示约 180 年,而且计算星期几只需要取 7 的余数即可(即 0 表示周一,6 表示周日)

serde

简单序列化与反序列化,采用 Little Endian(即小端编码,Intel/ARM64 的 CPU 整数字节编码),字符串 string 以及字节串 Bytes 采用 Pascal 编码(长度 0...255)以一字节表示长度后续 bytes 暂不支持 Rust enum 及其派生类型,完美支持 tuple/struct 类型

timestamp

timeval 类简单封装 timespec 结构并采用 u64/u32 表示秒以及纳秒 sysclock 类用于重演/模拟环境的系统时钟 timestamp 抽象毫秒/微秒/纳秒级别时间戳 DateTime 抽象 毫秒/微秒/纳秒级别的日期时间点

priceType

定点数与浮点 double 的相互转换

Mmap

支持大页的共享内存 mmap

pitch proto

类似 ITCH 的逐笔行情协议,在 ThinkPad T440s 实现每秒超两千五百万笔行情解码。

Math

公式: $ f(x) = \int_{-\infty}^\infty \hat f(\xi)e^{2 \pi \xi x}d\xi $

依赖

~1–12MB
~94K SLoC