ctp-rust 1.0.0

Safe Rust bindings for CTP (Comprehensive Transaction Platform) and its variations for Chinese financial markets
# CTP Rust SDK

[![Crates.io](https://img.shields.io/crates/v/deepissue-ctp-rust.svg)](https://crates.io/crates/deepissue-ctp-rust)
[![Documentation](https://docs.rs/deepissue-ctp-rust/badge.svg)](https://docs.rs/deepissue-ctp-rust)
[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/deepissue/ctp-rust)

一个为CTP (综合交易平台) 提供的安全、现代化的Rust绑定库,支持Linux和macOS系统。

## ✨ 特性

- 🔒 **类型安全**: 使用Rust的类型系统确保内存安全和线程安全
- 🌍 **跨平台支持**: 原生支持Linux和macOS (x86_64/ARM64)
- 📝 **编码自动转换**: 自动处理GB18030到UTF-8的编码转换
-**高性能**: 零拷贝设计,最小化性能开销
- 📚 **完整文档**: 提供完整的中文API文档和使用示例
- 🛡️ **安全FFI**: 安全的C++库绑定,避免内存泄露和悬空指针
- 🔄 **异步支持**: 支持tokio异步运行时

## 🚀 快速开始

### 安装依赖

在你的 `Cargo.toml` 中添加:

```toml
[dependencies]
deepissue-ctp-rust = "1.0.0"
tokio = { version = "1.0", features = ["full"] }
```

### 基本使用示例

#### 行情订阅

```rust
use deepissue_ctp_rust::*;
use deepissue_ctp_rust::api::{MdApi, CtpApi};
use deepissue_ctp_rust::api::md_api::{MdSpiHandler, DepthMarketDataField};
use deepissue_ctp_rust::types::{ReqUserLoginField, RspUserLoginField, RspInfoField};

// 实现行情回调处理器
struct MyMdHandler;

impl MdSpiHandler for MyMdHandler {
    fn on_front_connected(&mut self) {
        println!("行情前置已连接");
    }
    
    fn on_rsp_user_login(
        &mut self,
        user_login: Option<RspUserLoginField>,
        rsp_info: Option<RspInfoField>,
        request_id: i32,
        is_last: bool,
    ) {
        if let Some(rsp) = rsp_info {
            if rsp.is_success() {
                println!("登录成功");
            } else {
                if let Ok(msg) = rsp.get_error_msg() {
                    println!("登录失败: {}", msg);
                }
            }
        }
    }
    
    fn on_rtn_depth_market_data(&mut self, market_data: DepthMarketDataField) {
        println!("收到行情数据,最新价: {}", market_data.last_price);
    }
}

#[tokio::main]
async fn main() -> CtpResult<()> {
    // 创建行情API
    let mut md_api = MdApi::new(Some("./flow"), false, false)?;
    
    // 注册回调处理器
    md_api.register_spi(MyMdHandler)?;
    
    // 注册前置机地址
    md_api.register_front("tcp://180.168.146.187:10131")?;
    
    // 初始化
    md_api.init()?;
    
    // 创建登录请求
    let login_req = ReqUserLoginField::new("9999", "投资者账号", "密码")?
        .with_product_info("MyApp")?;
    
    // 发送登录请求
    md_api.req_user_login(&login_req)?;
    
    // 订阅行情
    md_api.subscribe_market_data(&["rb2501", "i2501"])?;
    
    // 等待API退出
    md_api.join()?;
    
    Ok(())
}
```

#### 交易接口

```rust
use deepissue_ctp_rust::api::{TraderApi, CtpApi};
use deepissue_ctp_rust::api::trader_api::{TraderSpiHandler, ReqAuthenticateField};

struct MyTraderHandler;

impl TraderSpiHandler for MyTraderHandler {
    fn on_front_connected(&mut self) {
        println!("交易前置已连接");
    }
    
    fn on_rsp_authenticate(
        &mut self,
        rsp_authenticate: Option<deepissue_ctp_rust::api::trader_api::RspAuthenticateField>,
        rsp_info: Option<RspInfoField>,
        request_id: i32,
        is_last: bool,
    ) {
        if let Some(rsp) = rsp_info {
            if rsp.is_success() {
                println!("认证成功");
            }
        }
    }
}

#[tokio::main]
async fn main() -> CtpResult<()> {
    // 创建交易API
    let mut trader_api = TraderApi::new(Some("./flow"))?;
    
    // 注册回调处理器
    trader_api.register_spi(MyTraderHandler)?;
    
    // 注册前置机地址
    trader_api.register_front("tcp://180.168.146.187:10130")?;
    
    // 初始化
    trader_api.init()?;
    
    // 客户端认证
    let auth_req = ReqAuthenticateField {
        broker_id: [0; 11], // 填入实际的经纪公司代码
        user_id: [0; 16],   // 填入实际的用户代码
        // ... 其他字段
        ..Default::default()
    };
    
    trader_api.req_authenticate(&auth_req)?;
    
    Ok(())
}
```

## 📖 详细文档

### 系统要求

- **操作系统**: 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
│       └── callbacks.rs    # 回调处理
├── libs/
│   └── ctp/
│       ├── include/        # CTP头文件
│       └── lib/
│           ├── linux64/    # Linux动态库
│           └── mac64/      # macOS动态库
├── tests/                  # 测试文件
├── examples/               # 示例代码
└── docs/                   # 文档
```

### 编码处理

CTP库使用GB18030编码,而Rust默认使用UTF-8。本SDK自动处理两种编码之间的转换:

```rust
use deepissue_ctp_rust::encoding::GbkConverter;

// UTF-8 转 GB18030
let gb_bytes = GbkConverter::utf8_to_gb18030("期货合约")?;

// GB18030 转 UTF-8
let utf8_string = GbkConverter::gb18030_to_utf8(&gb_bytes)?;

// 固定长度字节数组转换
use deepissue_ctp_rust::types::{InstrumentIdType, StringConvert};

let instrument_id = InstrumentIdType::from_utf8_string("rb2501")?;
let back_to_string = instrument_id.to_utf8_string()?;
```

### 错误处理

SDK提供了完整的错误处理机制:

```rust
use deepissue_ctp_rust::error::{CtpError, CtpResult};

match some_ctp_function() {
    Ok(result) => println!("操作成功: {:?}", result),
    Err(CtpError::ConnectionError(msg)) => println!("连接错误: {}", msg),
    Err(CtpError::AuthenticationError(msg)) => println!("认证错误: {}", msg),
    Err(CtpError::BusinessError(code, msg)) => {
        println!("业务错误 [{}]: {}", code, msg);
    }
    Err(e) => println!("其他错误: {}", e),
}
```

### 平台支持

#### Linux

```bash
# 确保系统有必要的库
sudo apt-get install build-essential

# 设置库文件路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libs/ctp/lib/linux64

# 运行程序
cargo run
```

#### macOS

```bash
# 设置库文件路径
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:./libs/ctp/lib/mac64

# 在Apple Silicon Mac上可能需要Rosetta
# 如果遇到架构问题,可以用Rosetta运行:
arch -x86_64 cargo run
```

## 🔧 构建配置

### 自定义构建

如果你需要自定义CTP库的位置,可以设置环境变量:

```bash
export CTP_LIB_PATH=/path/to/your/ctp/libs
export CTP_INCLUDE_PATH=/path/to/your/ctp/headers
```

### 功能特性

```toml
[dependencies]
deepissue-ctp-rust = { version = "1.0.0", features = ["channel"] }
```

可用特性:
- `channel`: 启用crossbeam-channel支持
- `ctp`: 默认启用,CTP SDK支持

## 📋 API参考

### 主要类型

- `MdApi`: 行情API接口
- `TraderApi`: 交易API接口  
- `ReqUserLoginField`: 用户登录请求
- `RspUserLoginField`: 用户登录响应
- `DepthMarketDataField`: 深度行情数据
- `OrderField`: 报单信息
- `TradeField`: 成交信息

### 回调接口

- `MdSpiHandler`: 行情回调处理接口
- `TraderSpiHandler`: 交易回调处理接口

### 编码工具

- `GbkConverter`: GB18030/UTF-8编码转换器
- `StringConvert`: 字符串转换特质

## 🧪 测试

运行所有测试:

```bash
cargo test
```

运行编码测试:

```bash
cargo test --test encoding_tests
```

运行集成测试(需要CTP库):

```bash
cargo test --features integration
```

## 📚 示例

更多示例请查看 `examples/` 目录:

- `md_basic.rs`: 基础行情订阅
- `trader_basic.rs`: 基础交易功能
- `encoding_demo.rs`: 编码转换示例
- `error_handling.rs`: 错误处理示例

## 🤝 贡献

欢迎贡献代码!请遵循以下步骤:

1. Fork本仓库
2. 创建feature分支 (`git checkout -b feature/amazing-feature`)
3. 提交你的修改 (`git commit -m 'Add some amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 开启Pull Request

## ⚠️ 注意事项

1. **库文件**: 需要获取相应平台的CTP库文件并放置在正确位置
2. **网络环境**: 连接CTP服务器需要稳定的网络环境
3. **账户权限**: 需要有效的CTP账户和相应的交易权限
4. **风险提示**: 期货交易有风险,请谨慎使用

## 📄 许可证

本项目采用MIT或Apache-2.0双重许可证。详见 [LICENSE-MIT](LICENSE-MIT) 和 [LICENSE-APACHE](LICENSE-APACHE) 文件。

## 🔗 相关链接

- [CTP官网]http://www.sfit.com.cn/
- [Rust官网]https://www.rust-lang.org/
- [文档]https://docs.rs/deepissue-ctp-rust
- [问题反馈]https://github.com/deepissue/ctp-rust/issues

## 📞 联系方式

如有问题或建议,请通过以下方式联系:

- GitHub Issues: [提交问题]https://github.com/deepissue/ctp-rust/issues
- Email: 36625090@qq.com

---

**免责声明**: 本软件仅供学习和研究使用,作者不对因使用本软件导致的任何损失承担责任。期货投资有风险,入市需谨慎。