File size: 3,810 Bytes
cbe113f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | # Project Summary
## Techstack
- **Rust**: The core language for the client application (`mt5-chart`).
- **MQL5 (MetaQuotes Language 5)**: Used for the Expert Advisor on the MetaTrader 5 platform.
- **ZeroMQ (ZMQ)**: High-performance asynchronous messaging library used for communication between MT5 and Rust.
- **Bat/Shell**: Used for running build commands via PowerShell.
## Dependencies
### Rust (Client)
Defined in `mt5-chart/Cargo.toml`:
- **eframe** (0.27.1): Framework for writing GUI apps using `egui`.
- **egui** (0.27.1): Immediate mode GUI library.
- **egui_plot** (0.27.1): Plotting library for `egui`.
- **zeromq** (0.5.0-pre): Rust bindings for ZeroMQ.
- **serde** (1.0.197): Serialization/deserialization framework.
- **serde_json** (1.0.114): JSON support for Serde.
- **tokio** (1.36.0): Asynchronous runtime for Rust.
- **futures** (0.3.30): Utilities for asynchronous programming.
### MQL5 (Server)
- **Zmq.mqh**: Custom ZeroMQ wrapper library for MQL5.
- **libzmq.dll**: 64-bit ZeroMQ dynamic link library.
- **libsodium.dll**: Cryptography library required by `libzmq`.
## Applications
- **Visual Studio Code**: Code editor used for Rust development.
- **MetaTrader 5 (MT5)**: Trading platform running the MQL5 Expert Advisor.
- **MetaEditor 5**: IDE for compiling MQL5 scripts.
- **Visual Studio C++ Build Tools**: Required for compiling Rust on Windows (Linker).
- **Windows PowerShell**: Used for executing Cargo commands.
- **Google Gemini**: AI assistant used for project development aid.
## Project Structure & Files
- **MQL5/**: Contains the Publisher logic.
- `Experts/ZmqPublisher.mq5`: The main EA publishing tick data.
- `Include/Zmq/Zmq.mqh`: Helper library for ZMQ binding.
- `Libraries/*.dll`: Required DLLs for ZMQ execution in MT5.
- **mt5-chart/**: Contains the Subscriber logic (Rust).
- `src/main.rs`: Main entry point for the GUI and ZMQ subscriber.
- `Cargo.toml`: Rust package configuration.
- **Documentation**:
- `README.md`: Project documentation.
## Mechanics & Workflow
The system operates on a Publisher-Subscriber model using ZeroMQ (ZMQ) to bridge MetaTrader 5 (MQL5) and the external Rust application.
### Data Flow
1. **Publisher (MQL5)**:
- The `ZmqPublisher.mq5` Expert Advisor initializes a ZMQ **PUB** socket and binds it to `tcp://*:5555`.
- On every market tick (`OnTick()`), it retrieves the current Bid/Ask prices.
- It constructs a JSON object (e.g., `{"symbol": "XAUUSD", "bid": 2025.50, ...}`) and publishes it as a message.
2. **Subscriber (Rust)**:
- The `mt5-chart` application initializes a ZMQ **SUB** socket and connects to `tcp://127.0.0.1:5555`.
- It runs an asynchronous Tokio task that listens for incoming ZMQ messages.
- Upon receiving a message, it deserializes the JSON data into a Rust struct (`TickData`).
- The data is sent via an internal channel (`mpsc`) to the GUI thread.
- The `eframe`/`egui` interface updates the chart and labels in real-time.
### Workflow Algorithm
```mermaid
sequenceDiagram
participant MT5 as MetaTrader 5 (MQL5)
participant ZMQ as ZeroMQ (PUB/SUB)
participant Rust as Rust Client (mt5-chart)
participant GUI as GUI (egui)
Note over MT5, Rust: Initialization
Rust->>ZMQ: Connect (SUB) to tcp://127.0.0.1:5555
MT5->>ZMQ: Bind (PUB) to tcp://0.0.0.0:5555
Note over MT5, GUI: Real-time Tick Loop
loop Every Tick
MT5->>MT5: Get SymbolInfoTick
MT5->>ZMQ: Publish JSON {"symbol":..., "bid":...}
ZMQ->>Rust: Receive Message
Rust->>Rust: Parse JSON to TickData
Rust->>GUI: Send Data via Channel
GUI->>GUI: Update Plot & Request Repaint
end
```
|