大数跨境
0
0

使用 C++20 从零构建一个完整的低延迟交易系统

使用 C++20 从零构建一个完整的低延迟交易系统 CppGuide
2025-03-24
1

我毕业时,刚开始从事股票交易系统的开发,那个时候纯追求技术,做的功能总是被老板评价为技术有余、业务不足,后来老板给我和另外一个同事拨专款各1万元,让我们去股票市场去练习,熟悉股票业务。炒股票一般有两大流派,一派是K线技术派,即通过分析各种K线的走向预测涨跌,然后对应的加仓和减仓;另外一派,是基本面派,即分析一只股票背后的公司的发展情况,来走长线,例如,10年前买了茅台股票的人,现在应该财务自由了吧。

后来,又陆续做过期货和现货的交易系统。2011年的时候,有幸独立与人创业,独立地把交易系统各个服务从零实现了一遍,收益匪浅。

老实说,交易系统与互联网公司的一般业务不太一样,其对技术的深度要求比较高,尤其是C++、操作系统原理和网络编程知识,不需要大而全面的技术栈,例如我对网络编程相对比较熟悉,就是那几年做交易系统磨炼出来的技能;另外一块就是要对业务熟悉程度有一点的要求,例如各大证券公司、交易所招人,要求有证券从业资格证的应聘者。一旦你有幸加入一家做交易系统的公司,基本上可以做一辈子,是技术人一个不错的方向。

东隅已失,桑榆非晚。

今天给大家推荐一个专栏《使用 C++20 从零构建一个完整的低延迟交易系统》。

以下是目录:

前言

第一部分:介绍C++ concepts并探索重要的低延迟应用

第1章:C++中的低延迟应用开发入门

  • 理解对延迟敏感型应用的要求
    • 理解延迟敏感型与延迟关键型应用
    • 测量延迟
    • 区分延迟指标
    • 对延迟敏感型应用程序的要求
  • 理解为何C++是首选编程语言
    • 编译型语言
    • 更贴近硬件——低级语言
    • 资源的确定性使用
    • 速度与高性能
    • 语言结构和特性
    • 成熟且庞大的社区支持
    • 持续积极发展的语言
  • 介绍一些重要的低延迟应用
    • 低级低延迟应用
    • 高级低延迟应用
    • 物联网和机器对机器应用
  • 总结

第2章:用C++设计常见的低延迟应用

  • 理解实时视频流应用中的低延迟性能
    • 定义低延迟流中的重要概念
    • 理解视频流中的延迟来源
    • 测量低延迟视频流中的延迟
    • 理解高延迟的影响
    • 探索低延迟视频流技术
    • 探索低延迟流的解决方案和平台
  • 理解在游戏应用中低延迟的关键限制
    • 低延迟游戏应用中的概念
    • 提升游戏应用性能
  • 讨论物联网和零售分析系统的设计
    • 确保物联网设备的低延迟
  • 探索低延迟电子交易
    • 理解现代电子交易对低延迟的需求
    • 在电子交易中实现最低延迟
  • 总结

第3章:从低延迟应用的角度探索C++概念

  • 技术要求
  • 用C++进行低延迟应用开发的方法
    • 先保证代码正确性,再进行优化
    • 设计最优的数据结构和算法
  • 关注处理器
  • 理解缓存和内存访问成本
  • 理解C++特性的底层原理
  • 利用C++编译器
  • 测量和提升性能
  • 避免陷阱并利用C++特性最小化应用延迟
    • 选择存储方式
    • 选择数据类型
    • 使用类型转换操作
    • 优化数值运算
    • 优化布尔和位运算
    • 对象的初始化、销毁、复制和移动
    • 使用引用和指针
    • 优化跳转和分支
    • 高效调用函数
    • 使用位域
    • 使用运行时多态
    • 使用编译时多态
    • 使用额外的编译时处理
    • 处理异常
    • 访问缓存和内存
    • 动态分配内存
    • 多线程
  • 最大化C++编译器优化参数
    • 理解编译器如何优化
    • 理解编译器何时无法优化
    • 了解编译器优化标志
  • 总结

第4章:构建低延迟应用的C++基础模块

  • 技术要求
  • C++线程处理在多线程低延迟应用中的应用
    • 定义一些有用的宏和函数
    • 创建并启动新线程
    • 设置线程亲和性
    • 构建示例
  • 设计C++内存池以避免动态内存分配
    • 理解内存池的定义
    • 理解内存池的使用场景
    • 设计内存池存储
    • 初始化内存池
    • 处理新的分配请求
    • 处理内存释放
    • 结合示例使用内存池
  • 使用无锁队列传输数据
    • 线程和进程间通信
    • 设计无锁队列存储
    • 初始化无锁队列
    • 向队列添加元素
    • 从队列消费元素
    • 使用无锁队列
  • 构建低延迟日志框架
    • 设计时间相关的实用方法
    • 设计低延迟日志记录器
    • 定义一些日志记录器结构
    • 初始化日志记录器数据结构
    • 创建日志记录器并启动日志记录器线程
    • 将数据推送到日志记录器队列
    • 添加一个实用的通用日志函数
    • 学习如何结合示例使用日志记录器
  • 使用套接字进行C++网络编程
    • 构建基本的套接字API
    • 实现发送/接收TCP套接字
    • 构建TCP服务器组件
    • 构建TCP服务器和客户端示例
  • 总结

第二部分:用C++构建实时交易所

第5章:设计我们的交易生态系统

  • 理解电子交易生态系统的布局
  • 定义电子交易生态系统的拓扑结构
  • 介绍电子交易生态系统的组件
  • 设计交易所中的C++撮合引擎
    • 理解撮合引擎的目的
    • 理解交易所订单簿
    • 匹配参与者订单
    • 设计我们的撮合引擎
  • 理解交易所如何向参与者发布信息
    • 通过市场数据传达市场事件
    • 设计市场数据发布者
    • 通过订单网关接口通知市场参与者
    • 设计订单网关服务器
  • 构建市场参与者与交易所的接口
    • 理解市场数据消费者基础设施
    • 设计市场数据消费者
    • 理解订单网关客户端基础设施
    • 设计订单网关客户端基础设施
  • 设计低延迟C++交易算法框架
    • 构建订单簿
    • 构建特征引擎
    • 开发执行逻辑
    • 理解风险管理系统
    • 设计我们的交易策略框架
  • 总结

第6章:构建C++撮合引擎

  • 技术要求
  • 定义撮合引擎中的操作和交互
    • 定义一些类型和常量
    • 设计撮合引擎
    • 设计订单簿
  • 构建撮合引擎并交换外部数据
    • 构建撮合引擎
    • 从订单网关队列消费数据并向其发布数据
    • 向市场数据发布者队列发布数据
    • 构建交易所应用程序二进制文件
    • 运行交易所应用程序二进制文件
  • 构建订单簿并进行订单撮合
    • 构建内部数据结构
    • 处理新的被动订单
    • 处理订单取消请求
    • 撮合主动订单并更新订单簿
  • 总结

第7章:与市场参与者通信

  • 技术要求
  • 定义市场数据协议和订单数据协议
    • 设计市场数据协议
    • 设计订单数据协议
  • 构建订单网关服务器
    • 定义订单网关服务器中的数据成员
    • 初始化订单网关服务器
    • 处理传入的客户请求
    • 使用先进先出(FIFO)排序器公平处理请求
    • 发送客户响应
  • 构建市场数据发布者
    • 定义市场数据发布者中的数据成员
    • 初始化市场数据发布者
    • 发布订单簿更新
    • 合成并发布快照
  • 构建主交易所应用程序
  • 总结

第三部分:构建实时C++算法交易系统

第8章:用C++处理市场数据并向交易所发送订单

  • 技术要求
  • 订阅市场数据并解码市场数据协议
    • 定义市场数据消费者中的数据成员
    • 初始化市场数据消费者
    • 运行市场数据消费者主循环
    • 处理市场数据更新并处理数据包丢失
    • 与快照流同步
  • 从市场数据构建订单簿
    • 定义市场订单簿的结构
    • 定义订单簿中的数据成员
    • 初始化订单簿
    • 处理市场更新并更新订单簿
    • 回顾订单簿管理的通用实用方法
  • 连接到交易所并发送和接收订单流
    • 定义订单网关客户端中的数据成员
    • 初始化订单网关客户端
    • 向交易所发送订单请求
    • 处理来自交易所的订单响应
  • 总结

第9章:构建C++交易算法的基础模块

  • 技术要求
  • 对交易执行做出反应并管理仓位、盈亏(PnL)和风险
  • 构建特征并计算复杂特征
    • 定义特征引擎中的数据成员
    • 初始化特征引擎
    • 根据订单簿变化计算特征
    • 根据交易事件计算特征
  • 利用成交情况更新仓位和盈亏
    • 声明PositionInfo中的数据成员
    • 在PositionInfo中处理订单执行
    • 在PositionInfo中处理订单簿变化
    • 设计PositionKeeper
    • 初始化PositionKeeper
    • 在PositionKeeper中处理订单执行和市场更新
  • 发送和管理订单
    • 定义OMOrder结构体及其相关类型
    • 设计OrderManager类
    • 定义OrderManager中的数据成员
    • 初始化OrderManager
    • 从OrderManager发送新订单
    • 从OrderManager取消订单
    • 添加简化订单管理的方法
    • 处理订单更新并更新订单
  • 计算并管理风险
    • 定义RiskCfg结构
    • 定义TradeEngineCfg结构
    • 声明RiskCheckResult枚举
    • 定义RiskInfo结构
    • 在RiskInfo中执行风险检查
    • 设计RiskManager中的数据成员
    • 初始化我们的RiskManager类
    • 在RiskManager中执行风险检查
  • 总结

第10章:构建C++做市和流动性获取算法

  • 技术要求
  • 理解我们交易算法的行为
    • 理解做市交易算法
    • 通过示例研究做市机制
    • 理解流动性获取交易算法
    • 添加枚举以定义算法类型
  • 管理订单簿中提供的被动流动性
    • 定义做市(MarketMaker)算法中的数据成员
    • 初始化做市算法
    • 处理订单簿更新和交易事件
    • 在做市算法中处理订单更新
  • 激进地开仓和平仓
    • 定义流动性获取(LiquidityTaker)算法中的数据成员
    • 初始化流动性获取交易算法
    • 处理交易事件和订单簿更新
    • 在流动性获取算法中处理订单更新
  • 构建交易引擎框架
    • 定义交易引擎中的数据成员
    • 初始化交易引擎
    • 发送客户请求
    • 处理市场数据更新和客户响应
    • 处理订单簿、交易和订单响应更新
    • 添加一些杂项方法
  • 构建并运行主交易应用程序
    • 构建主交易应用程序
    • 运行最终的交易生态系统
    • 检查运行输出
  • 总结

第四部分:分析和提升性能

第11章:添加检测工具并测量性能

  • 技术要求

  • 添加检测系统以测量系统性能

    • 使用RDTSC添加性能测量实用工具
    • 更新我们之前的时间实用工具
    • 理解实际测量系统中的一些问题
  • 测量交易所的延迟

    • 理解交易所的关键环节
    • 测量市场数据发布者内部的延迟
    • 测量订单服务器内部的延迟
    • 测量撮合引擎和订单簿内部的延迟
  • 测量交易引擎内部的延迟

    • 理解内部测量方法
    • 理解交易客户端系统中的关键节点
    • 测量市场数据消费者内部的延迟
    • 测量订单网关内部的延迟
    • 测量交易引擎内部的延迟
  • 使用新的检测系统运行整个生态系统

  • 总结

第12章:分析和优化C++系统的性能

  • 技术要求
  • 分析我们交易生态系统的性能
    • 回顾我们测量的延迟
    • 分析性能
    • 理解分析结果
  • 探讨优化C++交易系统的技巧和方法
    • 优化发布版本构建
    • 正确设置线程亲和性
    • 优化日志记录器对字符串的处理
    • 避免使用std::function实例
    • 检查这些优化的效果
  • 思考我们交易生态系统的未来发展
    • 动态扩展容器
    • 扩展和增强哈希映射
    • 优化快照消息
    • 在订单协议中添加认证和拒绝消息
    • 在订单协议中支持修改消息
    • 增强交易引擎组件
  • 总结

阅读方式

专栏今晚会在小方说服务器开发知识星球上线。对这个专栏有兴趣的小伙伴可以通过下面的二维码扫码加入(原价325一年,扫码立即优惠40元):


老球友可以通过下面的二维码扫码续费(半价基础上再优惠10元):


祝大家玩得愉快~


推荐阅读



【声明】内容源于网络
0
0
CppGuide
专注于高质量高性能C++开发,站点:cppguide.cn
内容 1260
粉丝 0
CppGuide 专注于高质量高性能C++开发,站点:cppguide.cn
总阅读783
粉丝0
内容1.3k