136 lines
3.9 KiB
Markdown
136 lines
3.9 KiB
Markdown
# mt5-rs
|
||
|
||
纯 Rust 实现的 MetaTrader 5 IPC 通信库,无需 Python 依赖。
|
||
|
||
与 Python `MetaTrader5` 库 API 完全兼容。
|
||
|
||
## 特性
|
||
|
||
- 纯 Rust 实现,无 Python 或 C++ 依赖
|
||
- 通过 Windows 命名管道与 MT5 终端进行 IPC 通信
|
||
- 与 Python `MetaTrader5` 库完全兼容(32个函数中的30个)
|
||
- 支持 MT5 Build 5836+
|
||
|
||
## 快速开始
|
||
|
||
```rust
|
||
use mt5_rs::{Mt5Client, discover_mt5_pipe};
|
||
|
||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||
// 自动发现 MT5 管道
|
||
let pipe_name = discover_mt5_pipe();
|
||
|
||
// 初始化客户端
|
||
let mut client = Mt5Client::new();
|
||
client.initialize(Some(&pipe_name))?;
|
||
|
||
// 获取账户信息
|
||
let account = client.account_info()?;
|
||
println!("Balance: {}", account.balance);
|
||
println!("Equity: {}", account.equity);
|
||
println!("Margin Free: {}", account.margin_free);
|
||
|
||
Ok(())
|
||
}
|
||
```
|
||
|
||
## API 参考
|
||
|
||
### 初始化
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `Mt5Client::new()` | 创建新客户端 |
|
||
| `initialize(pipe_name)` | 初始化与 MT5 的连接 |
|
||
| `shutdown()` | 关闭连接 |
|
||
| `login(login, password, server)` | 登录 MT5 账户 |
|
||
|
||
### 账户与终端
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `account_info()` | 获取账户信息 |
|
||
| `terminal_info()` | 获取终端信息 |
|
||
| `version()` | 获取 MT5 版本 |
|
||
| `last_error()` | 获取最后错误代码和消息 |
|
||
|
||
### 交易品种
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `symbol_info(symbol)` | 获取品种信息 |
|
||
| `symbol_info_tick(symbol)` | 获取品种当前报价 |
|
||
| `symbols_get()` | 获取所有可用品种 |
|
||
| `symbol_select(symbol, enable)` | 在市场报价中选择/取消选择品种 |
|
||
|
||
### 行情数据
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `copy_rates_from_pos(symbol, timeframe, start_pos, count)` | 从指定位置复制K线 |
|
||
| `copy_rates_from(symbol, timeframe, date_from, count)` | 从指定日期复制K线 |
|
||
| `copy_rates_range(symbol, timeframe, date_from, date_to)` | 复制指定范围的K线 |
|
||
| `copy_ticks_from(symbol, from, count, flags)` | 从指定时间复制Tick |
|
||
| `copy_ticks_range(symbol, from, to, flags)` | 复制指定范围的Tick |
|
||
|
||
### 持仓与订单
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `positions_total()` | 获取未平仓持仓总数 |
|
||
| `positions_get(symbol)` | 获取未平仓持仓 |
|
||
| `orders_total()` | 获取挂单总数 |
|
||
| `orders_get(symbol)` | 获取挂单 |
|
||
|
||
### 历史数据
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `history_deals_total(from, to)` | 获取指定范围内成交总数 |
|
||
| `history_deals_get(from, to)` | 获取指定范围内成交记录 |
|
||
| `history_orders_total(from, to)` | 获取指定范围内订单总数 |
|
||
| `history_orders_get(from, to)` | 获取指定范围内订单记录 |
|
||
|
||
### 市场深度
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `market_book_add(symbol)` | 订阅市场深度 |
|
||
| `market_book_get(symbol)` | 获取市场深度数据 |
|
||
| `market_book_release(symbol)` | 取消订阅市场深度 |
|
||
|
||
### 交易计算
|
||
|
||
| 函数 | 描述 |
|
||
|------|------|
|
||
| `order_calc_margin(action, symbol, volume, price)` | 计算所需保证金(本地计算) |
|
||
| `order_calc_profit(action, symbol, volume, price_open, price_close)` | 计算预期利润(本地计算) |
|
||
|
||
### 未实现
|
||
|
||
| 函数 | 状态 |
|
||
|------|------|
|
||
| `order_check(request)` | TODO - 检查交易请求有效性 |
|
||
| `order_send(request)` | TODO - 发送交易请求到 MT5 |
|
||
|
||
## 实现说明
|
||
|
||
### `order_calc_margin` 和 `order_calc_profit` 的本地计算
|
||
|
||
与通过命名管道发送命令 202/203 的 `go-mt5` 不同,本库使用**本地计算**(与 Python `MetaTrader5` 库行为一致):
|
||
|
||
- `order_calc_margin`: `margin = volume × price × margin_initial / 4`
|
||
- `order_calc_profit`: `profit = volume × (price_close - price_open) × trade_contract_size`
|
||
|
||
此方法避免了 MT5 Build 5836+ 使用 IPC 执行这些命令时的"管道已关闭"错误。
|
||
|
||
## 系统要求
|
||
|
||
- Rust 2021 edition
|
||
- Windows 操作系统(命名管道 IPC 仅限 Windows)
|
||
- MT5 终端必须正在运行
|
||
|
||
## 许可证
|
||
|
||
MIT
|