Files
2026-05-17 11:26:45 +08:00

136 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# mt5-rs
A pure Rust library for MetaTrader 5 IPC communication. No Python dependency.
Compatible with Python `MetaTrader5` library API.
## Features
- Pure Rust implementation, no Python or C++ dependency
- Windows named pipe IPC communication with MT5 terminal
- Full compatibility with Python `MetaTrader5` library (30/32 functions)
- Support MT5 Build 5836+
## Quick Start
```rust
use mt5_rs::{Mt5Client, discover_mt5_pipe};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Auto-discover MT5 pipe
let pipe_name = discover_mt5_pipe();
// Initialize client
let mut client = Mt5Client::new();
client.initialize(Some(&pipe_name))?;
// Get account info
let account = client.account_info()?;
println!("Balance: {}", account.balance);
println!("Equity: {}", account.equity);
println!("Margin Free: {}", account.margin_free);
Ok(())
}
```
## API Reference
### Initialization
| Function | Description |
|----------|-------------|
| `Mt5Client::new()` | Create a new client |
| `initialize(pipe_name)` | Initialize connection to MT5 |
| `shutdown()` | Close connection |
| `login(login, password, server)` | Login to MT5 account |
### Account & Terminal
| Function | Description |
|----------|-------------|
| `account_info()` | Get account information |
| `terminal_info()` | Get terminal information |
| `version()` | Get MT5 version |
| `last_error()` | Get last error code and message |
### Symbols
| Function | Description |
|----------|-------------|
| `symbol_info(symbol)` | Get symbol information |
| `symbol_info_tick(symbol)` | Get current tick for symbol |
| `symbols_get()` | Get all available symbols |
| `symbol_select(symbol, enable)` | Select/deselect symbol in Market Watch |
### Market Data
| Function | Description |
|----------|-------------|
| `copy_rates_from_pos(symbol, timeframe, start_pos, count)` | Copy bars from position |
| `copy_rates_from(symbol, timeframe, date_from, count)` | Copy bars from date |
| `copy_rates_range(symbol, timeframe, date_from, date_to)` | Copy bars in range |
| `copy_ticks_from(symbol, from, count, flags)` | Copy ticks from time |
| `copy_ticks_range(symbol, from, to, flags)` | Copy ticks in range |
### Positions & Orders
| Function | Description |
|----------|-------------|
| `positions_total()` | Get total number of open positions |
| `positions_get(symbol)` | Get open positions |
| `orders_total()` | Get total number of pending orders |
| `orders_get(symbol)` | Get pending orders |
### History
| Function | Description |
|----------|-------------|
| `history_deals_total(from, to)` | Get total number of deals in range |
| `history_deals_get(from, to)` | Get deals in range |
| `history_orders_total(from, to)` | Get total number of orders in range |
| `history_orders_get(from, to)` | Get orders in range |
### Market Depth
| Function | Description |
|----------|-------------|
| `market_book_add(symbol)` | Subscribe to market depth |
| `market_book_get(symbol)` | Get market depth data |
| `market_book_release(symbol)` | Unsubscribe from market depth |
### Trading Calculations
| Function | Description |
|----------|-------------|
| `order_calc_margin(action, symbol, volume, price)` | Calculate required margin (local calculation) |
| `order_calc_profit(action, symbol, volume, price_open, price_close)` | Calculate expected profit (local calculation) |
### Not Implemented
| Function | Status |
|----------|--------|
| `order_check(request)` | TODO - Check trade request validity |
| `order_send(request)` | TODO - Send trade request to MT5 |
## Implementation Notes
### Local Calculation for `order_calc_margin` and `order_calc_profit`
Unlike `go-mt5` which sends commands 202/203 via named pipe, this library uses **local calculation** (same as Python `MetaTrader5` library):
- `order_calc_margin`: `margin = volume × price × margin_initial / 4`
- `order_calc_profit`: `profit = volume × (price_close - price_open) × trade_contract_size`
This approach avoids the "pipe closed" error that occurs with MT5 Build 5836+ when using IPC for these commands.
## Requirements
- Rust 2021 edition
- Windows OS (named pipe IPC is Windows-specific)
- MT5 terminal must be running
## License
MIT