| Crates.io | ctp-rust |
| lib.rs | ctp-rust |
| version | 1.0.3 |
| created_at | 2025-09-20 16:53:42.872755+00 |
| updated_at | 2025-09-24 14:55:18.256096+00 |
| description | Safe Rust bindings for CTP (Comprehensive Transaction Platform) and its variations for Chinese financial markets |
| homepage | https://github.com/deepissue/ctp-rust |
| repository | https://github.com/deepissue/ctp-rust |
| max_upload_size | |
| id | 1847948 |
| size | 1,902,964 |
🚀 安全、高效、易用的CTP (综合交易平台) Rust绑定库
为中国金融市场提供完整的期货交易功能,支持同步和异步API,具备类型安全、内存安全和并发安全的特性。
在 Cargo.toml 中添加:
[dependencies]
ctp-rust = "1.0.1"
tokio = { version = "1.42", features = ["full"] }
tracing = "0.1"
tracing-subscriber = "0.3"
dotenvy = "0.15"
SDK将在构建时自动配置,无需手动下载。
如需手动配置CTP SDK,请将库文件放置在以下目录:
libs/ctp/
├── linux/
│ ├── include/ # CTP头文件
│ │ ├── ThostFtdcTraderApi.h
│ │ ├── ThostFtdcMdApi.h
│ │ └── ...
│ └── lib/ # CTP动态库
│ ├── libthosttraderapi_se.so
│ └── libthostmduserapi_se.so
└── mac64/
├── include/ # CTP头文件
└── lib/ # CTP动态库
├── libthosttraderapi_se.dylib
└── libthostmduserapi_se.dylib
创建 .env 文件:
# CTP服务器配置
CTP_TRADER_FRONT=tcp://180.168.146.187:10201
CTP_MD_FRONT=tcp://180.168.146.187:10211
# 账户配置
CTP_BROKER_ID=9999
CTP_INVESTOR_ID=your_account
CTP_PASSWORD=your_password
# 可选配置
CTP_APP_ID=simnow_client_test
CTP_AUTH_CODE=0000000000000000
CTP_FLOW_PATH=./flow/
use ctp_rust::{CtpConfig, CtpResult, TraderApi};
use ctp_rust::types::*;
use std::sync::{Arc, Mutex};
fn main() -> CtpResult<()> {
// 加载配置
let config = CtpConfig::from_env()?;
// 创建交易API
let trader_api = TraderApi::new(Some(&config.flow_path), Some(true))?;
let api_arc = Arc::new(Mutex::new(trader_api));
// 注册事件处理器
let handler = MyTraderHandler::new();
api_arc.lock().unwrap().register_spi(handler)?;
// 连接和初始化
api_arc.lock().unwrap().register_front(&config.trader_front_address)?;
api_arc.lock().unwrap().init()?;
// 等待连接...
std::thread::sleep(std::time::Duration::from_secs(30));
Ok(())
}
use ctp_rust::api::AsyncTraderApi;
use tokio;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = CtpConfig::from_env()?;
// 创建异步交易API
let mut async_trader = AsyncTraderApi::new(Some(&config.flow_path))?;
// 连接服务器
async_trader.connect(&config.trader_front_address).await?;
// 用户登录
let login_req = ReqUserLoginField::new(
&config.broker_id,
&config.investor_id,
&config.password
)?;
async_trader.login(login_req).await?;
// 查询账户信息
let account_query = QryTradingAccountField::new(&config.broker_id, &config.investor_id)?;
let account_info = async_trader.query_trading_account(account_query).await?;
println!("可用资金: {:.2}", account_info.available);
Ok(())
}
运行内置示例:
# 基础交易示例
cargo run --example trader_basic
# 异步交易示例
cargo run --example async_trader_basic
# 行情订阅示例
cargo run --example md_basic
# 异步行情示例
cargo run --example async_md_basic
# 编码处理示例
cargo run --example encoding_demo
# 错误处理示例
cargo run --example error_handling
use ctp_rust::config::DebugConfig;
// 创建debug配置
let debug_config = DebugConfig {
enable_debug: true,
log_file_path: Some("./debug.log".to_string()),
max_file_size_mb: 100,
max_backup_files: 5,
};
// 应用配置
debug_config.apply();
# 设置日志级别
export RUST_LOG=debug
# Linux库路径
export LD_LIBRARY_PATH=./libs/ctp/linux/lib:$LD_LIBRARY_PATH
# macOS库路径
export DYLD_LIBRARY_PATH=./libs/ctp/mac64/lib:$DYLD_LIBRARY_PATH
# 运行示例
cargo run --example trader_basic
当CTP发布新版本时,可以手动更新SDK:
从上期技术官网下载最新的CTP SDK:
v6.7.0_20220613_api_traderapi_se_linux64.tar.gzv6.7.0_20220613_api_traderapi_se_macos.tar.gz# Linux
cp new_sdk/libthosttraderapi_se.so libs/ctp/linux/lib/
cp new_sdk/libthostmduserapi_se.so libs/ctp/linux/lib/
cp new_sdk/*.h libs/ctp/linux/include/
# macOS
cp new_sdk/libthosttraderapi_se.dylib libs/ctp/mac64/lib/
cp new_sdk/libthostmduserapi_se.dylib libs/ctp/mac64/lib/
cp new_sdk/*.h libs/ctp/mac64/include/
如果新版本添加了新的API方法:
// 1. 在 src/ffi.rs 中添加FFI声明
extern "C" {
pub fn CThostFtdcTraderApi_ReqNewMethod(
api: *mut c_void,
req: *const NewMethodField,
request_id: c_int,
) -> c_int;
}
// 2. 在 src/api/trader_api.rs 中添加Rust包装
impl TraderApi {
pub fn req_new_method(&mut self, req: &NewMethodField) -> CtpResult<i32> {
let request_id = self.get_next_request_id();
let result = unsafe {
ffi::CThostFtdcTraderApi_ReqNewMethod(
self.api_ptr,
req as *const _ as *const c_void,
request_id,
)
};
self.handle_api_result(result, request_id)
}
}
// 3. 在 src/types.rs 中添加新的类型定义
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct NewMethodField {
pub field1: [c_char; 32],
pub field2: i32,
// ... 其他字段
}
# 清理并重新编译
cargo clean
cargo build
# 运行测试
cargo test
# 测试示例
cargo run --example trader_basic
api - 高级API接口
TraderApi - 同步交易APIMdApi - 同步行情APIAsyncTraderApi - 异步交易APIAsyncMdApi - 异步行情APItypes - CTP数据类型定义
ffi - 底层C++绑定
encoding - 编码转换
error - 错误处理
异步API基于tokio运行时,使用以下模式:
错误: 连接超时失败
解决方案:
ping 180.168.146.187错误: cannot open shared object file
解决方案:
# Linux
export LD_LIBRARY_PATH=./libs/ctp/linux/lib:$LD_LIBRARY_PATH
# macOS
export DYLD_LIBRARY_PATH=./libs/ctp/mac64/lib:$DYLD_LIBRARY_PATH
错误: 投资者账号错误或密码错误
解决方案:
错误: linker `cc` not found
解决方案:
# Ubuntu/Debian
sudo apt install build-essential
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
# macOS
xcode-select --install
export RUST_LOG=ctp_rust=debug,tokio=info
export RUST_BACKTRACE=1
# 测试连接
telnet 180.168.146.187 10201
# 检查DNS解析
nslookup 180.168.146.187
# 克隆项目
git clone https://github.com/deepissue/ctp-rust.git
cd ctp-rust
# 安装依赖
cargo build
# 运行测试
cargo test
# 检查代码格式
cargo fmt
cargo clippy
本项目采用 MIT/Apache-2.0 双许可证。
⚠️ 风险提示: 期货交易具有高风险,可能导致投资损失。请在充分理解风险的基础上进行交易,本SDK仅供技术学习和测试使用。