CTP Rust SDK
一个为CTP (综合交易平台) 提供的安全、现代化的Rust绑定库,支持Linux和macOS系统。
✨ 特性
- 🔒 类型安全: 使用Rust的类型系统确保内存安全和线程安全
- 🌍 跨平台支持: 原生支持Linux和macOS (x86_64/ARM64)
- 📝 编码自动转换: 自动处理GB18030到UTF-8的编码转换
- ⚡ 高性能: 零拷贝设计,最小化性能开销
- 🛡️ 安全FFI: 安全的C++库绑定,避免内存泄露和悬空指针
- 🐛 调试支持: 内置Debug日志功能,可配置日志输出
🚀 快速开始
项目结构
直接克隆并使用本项目:
基本使用示例
整体架构流程
Rust Application ↓ 调用API Rust FFI (ffi.rs) ↓ 调用C函数 C++ Wrapper (ctp_wrapper.cpp) ↓ 调用C++类方法 CTP C++ API (libthostmduserapi_se.dylib) ↓ 回调事件 C++ Bridge (spi_bridge.cpp) ↓ 转发回调 Rust Callback Functions ↓ 处理业务逻辑 Rust Application
行情订阅
use *;
use ;
use ;
use ;
// 实现行情回调处理器
;
async
交易接口(同步)
use ;
use ;
;
async
异步交易接口
use AsyncTraderApi;
use AsyncTraderEvent;
use ;
async
📖 详细文档
系统要求
- 操作系统: Linux (x86_64) 或 macOS (x86_64/ARM64)
- Rust版本: 1.70+
- CTP库: 需要相应平台的CTP动态库
目录结构
ctp-rust/
├── src/
│ ├── lib.rs # 主库入口
│ ├── error.rs # 错误定义
│ ├── encoding.rs # 编码转换
│ ├── types.rs # 数据类型定义
│ ├── ffi.rs # FFI绑定声明
│ └── api/
│ ├── mod.rs # API模块
│ ├── md_api.rs # 行情API
│ └── trader_api.rs # 交易API
├── libs/ctp/
│ ├── common/
│ │ ├── debug_logger.h # 调试日志头文件
│ │ └── debug_logger.cpp # 调试日志实现
│ ├── linux/
│ │ ├── include/ # Linux CTP头文件
│ │ ├── lib/ # Linux动态库
│ │ └── wrapper/ # Linux C++包装器
│ └── mac64/
│ ├── include/ # macOS CTP头文件
│ ├── thostmduserapi_se.framework/ # macOS框架
│ ├── thosttraderapi_se.framework/
│ └── wrapper/ # macOS C++包装器
├── examples/ # 示例代码
└── build.rs # 构建脚本
编码处理
CTP库使用GB18030编码,而Rust默认使用UTF-8。本SDK自动处理两种编码之间的转换:
use GbkConverter;
// UTF-8 转 GB18030
let gb_bytes = utf8_to_gb18030?;
// GB18030 转 UTF-8
let utf8_string = gb18030_to_utf8?;
// 固定长度字节数组转换
use ;
let instrument_id = from_utf8_string?;
let back_to_string = instrument_id.to_utf8_string?;
错误处理
SDK提供了完整的错误处理机制:
use ;
match some_ctp_function
平台支持
Linux
# 确保系统有必要的库
# 设置库文件路径
# 运行程序
macOS
# 设置库文件路径
# 在Apple Silicon Mac上可能需要Rosetta
# 如果遇到架构问题,可以用Rosetta运行:
🔧 构建配置
构建和调试日志
项目内置了调试日志功能,可以帮助排查问题:
use ;
use CString;
// 启用控制台日志输出
let log_path = new.unwrap;
let config = CtpLogConfig ;
unsafe
// 或者输出到文件
let log_path = new.unwrap;
let config = CtpLogConfig ;
编译和运行
# 构建项目(会自动编译C++包装器)
# 运行示例
自定义构建
如果你需要自定义CTP库的位置,可以设置环境变量:
功能特性
项目使用条件编译,根据可用的CTP库自动启用相应功能:
md_api
: 当找到行情API库时自动启用trader_api
: 当找到交易API库时自动启用test_mode
: 当没有CTP库时启用测试模式
📋 API参考
主要类型
MdApi
: 同步行情API接口AsyncMdApi
: 异步行情API接口TraderApi
: 同步交易API接口AsyncTraderApi
: 异步交易API接口ReqUserLoginField
: 用户登录请求RspUserLoginField
: 用户登录响应DepthMarketDataField
: 深度行情数据OrderField
: 报单信息TradeField
: 成交信息
回调接口
MdSpiHandler
: 行情回调处理接口(同步)TraderSpiHandler
: 交易回调处理接口(同步)AsyncMdEvent
: 异步行情事件AsyncTraderEvent
: 异步交易事件
编码工具
GbkConverter
: GB18030/UTF-8编码转换器StringConvert
: 字符串转换特质
🧪 测试
运行所有测试:
运行编码测试:
运行集成测试(需要CTP库):
📚 示例
更多示例请查看 examples/
目录:
md_basic.rs
: 基础行情订阅(同步)async_md_basic.rs
: 基础行情订阅(异步)trader_basic.rs
: 基础交易功能,包含资金账户和持仓查询(同步)async_trader_basic.rs
: 基础交易功能(异步)encoding_demo.rs
: 编码转换示例error_handling.rs
: 错误处理示例debug_logger.rs
: 调试日志功能示例
运行示例
# 设置环境变量(以实际配置为准)
# 运行交易示例(macOS)
DYLD_FRAMEWORK_PATH=libs/ctp/mac64 DYLD_LIBRARY_PATH=libs/ctp/mac64/wrapper
# 运行交易示例(Linux)
LD_LIBRARY_PATH=libs/ctp/linux/lib:libs/ctp/linux/wrapper
🛠️ 开发指南
项目架构
Rust应用程序
↓ 调用API
Rust FFI层 (ffi.rs)
↓ 调用C函数
C++ Wrapper层 (ctp_wrapper.cpp)
↓ 调用C++方法
CTP C++ API (Framework/动态库)
↓ SPI回调
C++ Bridge层 (spi_bridge.cpp)
↓ 转发回调
Rust回调函数
↓ 业务逻辑处理
Rust应用程序
架构特点:
- 跨平台兼容: Linux使用.so动态库,macOS使用.framework
- 调试日志: 内置debug_logger提供详细的调用跟踪
- 内存安全: 使用RAII和智能指针管理资源
添加新的 API 方法
-
更新 C++ wrapper
// 在 ctp_wrapper.h 中添加函数声明 int ; // 在 ctp_wrapper.cpp 中添加实现 int
-
更新 Rust FFI 声明
// 在 src/ffi.rs 中添加 extern "C"
-
更新 Rust API
// 在 src/api/trader_api.rs 中添加
-
重新编译项目
添加新的回调
-
更新 SPI Bridge
// 在 spi_bridge.h 中添加回调类型 typedef void ; // 在 TraderSpiCallbacks 结构中添加 OnNewCallbackFunction on_new_callback; // 在 spi_bridge.cpp 中实现 virtual void
-
更新 Rust 回调处理
// 在 TraderSpiHandler trait 中添加 // 实现回调函数 extern "C"
调试技巧
-
启用调试日志
; debug!; init
-
使用 gdb/lldb 调试 C++ 部分
# macOS # Linux
-
内存安全检查
🤝 贡献
欢迎贡献代码!请遵循以下步骤:
- Fork本仓库
- 创建feature分支 (
git checkout -b feature/amazing-feature
) - 提交你的修改 (
git commit -m 'Add some amazing feature'
) - 推送到分支 (
git push origin feature/amazing-feature
) - 开启Pull Request
⚠️ 注意事项
- 库文件: 需要获取相应平台的CTP库文件并放置在正确位置
- 网络环境: 连接CTP服务器需要稳定的网络环境
- 账户权限: 需要有效的CTP账户和相应的交易权限
- 风险提示: 期货交易有风险,请谨慎使用
📄 许可证
本项目采用MIT或Apache-2.0双重许可证。详见 LICENSE-MIT 和 LICENSE-APACHE 文件。
🔗 相关链接
📞 联系方式
如有问题或建议,请通过以下方式联系:
- GitHub Issues: 通过项目仓库提交问题
免责声明: 本软件仅供学习和研究使用,作者不对因使用本软件导致的任何损失承担责任。期货投资有风险,入市需谨慎。