- Update `docker-compose.yml` to use `mouyleng/mql5-trading-automation:main` pinned to SHA256 digest `3d8a19989bb281c070cc8b478317f904741a52e9ac18a4c3e9d15965715c9372`.
- Comment out local build instruction to prioritize the pinned image.
- Ensure deployment uses the stable version published ~6 months ago.
Added functionality to send trading signals to the ZOLO/Soloist bridge.
- Introduced `EnableWebRequest` and `WebRequestURL` inputs.
- Implemented `SendSignalToBridge` function using `WebRequest`.
- Integrated bridge call in `OnTick` to report signals.
Optimize `scripts/merge_best_prs.py` by using `concurrent.futures.ThreadPoolExecutor` to close duplicate PRs in parallel. This significantly reduces execution time by masking network latency for independent API calls.
Benchmarks show a reduction from ~1.31s to ~0.25s for closing 13 PRs with simulated 0.1s latency.
💡 What: Separated the /health endpoint from the main dashboard rendering logic. It now returns a lightweight JSON response.
🎯 Why: The previous implementation rendered the full Markdown dashboard for every health check, consuming unnecessary CPU and I/O resources during frequent polling.
📊 Impact: Reduces health check processing time from file reading + markdown parsing (~milliseconds) to a simple JSON return (~microseconds).
🔬 Measurement: Verified with new test script scripts/test_web_dashboard.py and updated render.yaml/app.yaml to use the new endpoint.
- Create `app.yaml` for Google App Engine Flexible environment.
- Update `scripts/deploy_cloud.py` to support `gcp` argument with specific instructions for project `infra-outrider-snqdt`.
- Update `mt5/MQL5/Experts/SMC_TrendBreakout_MTF_EA.mq5` default `GeminiModel` to `gemini-1.5-pro` and update comments.
- Consolidate file validation logic into a single loop
- Check file size before reading content to prevent loading large files into memory
- Add error handling for file reading
- Reduce I/O operations and loop iterations
This improves the efficiency of the CI validation script, especially for repositories with many files or when large files are accidentally introduced.
- Implemented a Flask-based web dashboard in `scripts/web_dashboard.py` to serve project status and documentation.
- Integrated the web dashboard into `config/startup_config.json` as a managed component.
- Updated `requirements.txt` with `flask` and `markdown` dependencies.
- Added `/health` endpoint for cloud platform health checks.
- Verified system integrity with existing validation and testing scripts.
Explicitly state that custom MQL5 programs and automation scripts are not supported on the Exness Web Terminal and require the Desktop application.
Updated:
- docs/Cloud_Deployment_Guide.md
- QUICK_REFERENCE.md
- docs/Quick_Start_Automation.md
- docs/ZOLO_Plugin_Integration.md
Clarify in README.md and Exness_Deployment_Guide.md that custom EAs and Indicators are not supported on the Exness Web Terminal and require the Desktop application.
Refactored `scripts/test_automation.py` to run independent integration tests in parallel using `concurrent.futures.ProcessPoolExecutor`.
* 💡 **What:** Used `ProcessPoolExecutor` to run tests concurrently.
* 🎯 **Why:** To improve test suite performance.
* 📊 **Measured Improvement:** ~30% faster (3.3s -> 2.25s).
* **Details:** Used processes instead of threads to ensure `contextlib.redirect_stdout` works correctly for each test without interference.
Refactors the get_branch_info function to use a single, more efficient 'git log' command to fetch commit details. This change reduces the number of subprocess calls from two to one per branch, significantly improving performance, especially in repositories with many branches.
A fallback mechanism is included to handle branches with no new commits, ensuring that the last commit date is still captured correctly and preventing any functional regression.
**What:** The `MqlRates rates[400]` array declaration is moved from the top of the `OnTick` function into the conditional `if` block where it is actually used.
**Why:** The `OnTick` function is a performance-critical "hot path." The previous implementation allocated a large array on the stack on every single tick, even if the function exited early and the array was never used. This created unnecessary memory overhead on the most common, lightweight execution path.
**Impact:** This change reduces stack memory allocation for the majority of `OnTick` calls. While the impact per call is small, it accumulates significantly over time in a high-frequency trading context, leading to a more efficient EA.
**Measurement:** The improvement can be observed by profiling the EA's execution time per tick, particularly in scenarios where the `UseSMC` and `SLMode == SL_SWING` inputs are disabled. The optimized code will show a small but consistent reduction in execution time on the lighter path.
Moves the signal timeframe calculation from the performance-critical `OnTick` function to the `OnInit` function.
The signal timeframe is determined by user input (`SignalTF`) and the chart's period, neither of which change during the EA's runtime. Calculating this on every tick is a small but unnecessary overhead.
This commit caches the calculated timeframe in a new global variable `gSignalTf` during initialization, ensuring the logic runs only once. The `OnTick` function now uses this cached value, removing the redundant computation from the EA's hot path.
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: GenX FX Trading System <199350297+Mouy-leng@users.noreply.github.com>
💡 What: Replaced an expensive `CopyRates()` call with the lightweight, native `iClose()` function in the `OnTick` "light" execution path.
🎯 Why: The previous implementation used `CopyRates()` to fetch an array of bar data, even when only a single closing price was needed. This created unnecessary overhead (memory allocation, data copying) on every tick where complex analysis was disabled.
📊 Impact: This change significantly reduces the computational overhead of the EA in its most common operational mode. Using `iClose` is orders of magnitude faster than `CopyRates` for fetching a single value, leading to lower CPU usage and faster tick processing.
🔬 Measurement: The improvement can be verified by profiling the EA in the MetaTrader 5 Strategy Tester. Executing the EA with `UseSMC=false` and `SLMode != SL_SWING` will show a measurable decrease in the average `OnTick` execution time compared to the previous version.
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
💡 What: This optimization refactors the `OnTick` function to conditionally load expensive historical data (`CopyRates` and `CopyBuffer` for fractals) only when required by the enabled features (SMC or Swing SL).
🎯 Why: The previous implementation loaded up to 400 bars of price data and 300 bars of fractal data on every new bar, regardless of the EA's configuration. This caused unnecessary processing overhead for users who were not using the features that required this deep historical analysis.
📊 Impact: Reduces the execution time of the `OnTick` function significantly for common configurations (e.g., Donchian Breakout only). This leads to lower CPU usage and potentially faster reaction to trading signals, as the EA spends less time on unnecessary data processing.
🔬 Measurement: The performance improvement can be measured by using the MetaTrader 5 Strategy Tester and profiling the EA's execution time with and without the `UseSMC` and `SLMode == SL_SWING` options enabled. The execution time per tick will be substantially lower when these features are disabled.
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>