# 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
| `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
| `account_info()` | Get account information |
| `terminal_info()` | Get terminal information |
| `version()` | Get MT5 version |
| `last_error()` | Get last error code and message |
### Symbols
| `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
| `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
| `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
| `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
| `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
| `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
| `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