136 lines
4.2 KiB
Markdown
136 lines
4.2 KiB
Markdown
# 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
|