diff --git a/README.md b/README.md index 3937406..3c79e86 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,117 @@ -# mql5-order-blocks-ea -Order Blocks Expert Advisor for MetaTrader 5, converted from Pine Script v6 with mathematical indicator parity (Wilder ATR, custom Stochastic). Validated on 12 years of EURUSD M30 historical data. +# Order Blocks Expert Advisor — EURUSD M30 (MetaTrader 5) + +> Pine Script v6 → MQL5 cross-platform conversion with full mathematical indicator parity. Validated on 12 years of EURUSD M30 historical data (~3,300 operations). + +--- + +## Overview + +This Expert Advisor detects bullish **Order Blocks (OB)** on EURUSD M30 and executes long entries when price returns to a valid OB zone, with dynamic risk management and an optional dynamic Take Profit based on opposing bearish Order Blocks. + +The project was originally written in **Pine Script v6** for TradingView and fully converted to **MQL5 native** for MetaTrader 5, with custom-coded indicators to guarantee mathematical parity across platforms — a non-trivial problem that breaks most naïve conversions. + +--- + +## Key technical features + +### Cross-platform mathematical parity +- Custom `PineATR()` implementing Wilder's RMA (Running Moving Average) — matches `ta.atr()` of Pine Script bit-by-bit, instead of relying on MT5's `iATR()` which differs in initial seed +- Custom `PineStoch()` with SMA-smoothed %K — matches `ta.sma(ta.stoch(...), 3)` of Pine +- Manual Choppiness Index implementation (no MT5 native equivalent) + +### Modular filter architecture +Each filter block can be independently enabled/disabled for clean optimization: +- **Oscillators** (RSI + ADX + CHOP, range-bound) +- **Candle confirmation** (wicks, body solidity, volume, size vs ATR) +- **Premium/Discount filter** with persistent impulse tracking +- **Stochastic confirmation** (separate buy/sell thresholds) +- **Dead-hour session filter** (configurable GMT offset) + +### Risk management +- Dynamic position sizing based on equity % risk per trade +- Configurable max simultaneous positions +- Daily drawdown circuit-breaker +- Fixed SL at OB bottom − ATR offset +- Dynamic TP: nearest opposing bearish OB level (with fallback ratio) + +### OnTester custom optimization criteria +Custom max function rejects optimization runs that fail any of: +- Minimum trades threshold +- Maximum equity drawdown +- Minimum Profit Factor +- Minimum net profit +- Minimum Sharpe Ratio +- Minimum Recovery Factor + +When all thresholds pass, the optimizer maximizes `profit / equity_DD$` (recovery factor) — explicit reward for return-per-unit-of-pain. + +### Visual auditing +- Live OB boxes (green/red) that extend in time while active +- Boxes are **frozen on retirement** (not deleted): + - **Aqua solid border** = OB that triggered an entry + - **Gray dotted border** = OB invalidated without entry +- This allows post-test forensic review of every signal + +--- + +## Validation methodology + +This EA was tested with rigor that is uncommon in retail trading code: + +- **Calibration period:** 2025 (in-sample) +- **Out-of-sample 1:** 2026 H1 (same parameters) +- **Out-of-sample 2:** 2014–2024 (full multi-régime test, never seen during calibration) +- **Cross-timeframe validation:** same parameters applied to H1 and H4 without re-tuning + +### Honest results — full 12-year backtest + +The system shows clear positive performance during periods that match its design regime (trend / range-rotation on bullish EURUSD) and degrades during sustained bearish regimes (2015, 2017, 2019, 2021, 2024). The system is **long-only**, which is structurally insufficient for forex without a macro-regime filter. + +Full 12-year backtest summary: +- Total trades: 3,347 +- Profit Factor: 0.97 +- Win Rate: 50.9% +- Net result: negative on full period +- Best year: 2025 (PF 1.92) +- Worst year: 2015 (bearish EURUSD) + +**Conclusion documented in the validation:** the EA's logic is sound, its risk management produced no catastrophic individual losses (largest loss < 0.5R), but a directional system without macro-regime filter cannot be deployed live in forex as-is. A planned v2 will add a daily-SMA200 macro filter and optional symmetric short logic. + +This README publishes the negative finding intentionally — the work of validating across 12 years and reporting the result honestly is more relevant to engineering quality than cherry-picked single-year results. + +--- + +## File structure + +| File | Purpose | +|------|---------| +| `OB_EURUSD_30M_2026_v107.mq5` | Main EA, V1.07 with modular block toggles | +| `LICENSE` | MIT | +| `README.md` | This document | + +--- + +## Tech stack + +- **MQL5** (MetaTrader 5 native) +- Originally **Pine Script v6** (TradingView) +- Validation done on broker M1 data and on OANDA feed cross-check + +--- + +## About the author + +**Brayan Rivas Campero** — MQL5 / Pine Script developer based in Cancún, México. +8 years building algorithmic trading systems across multiple instruments (Forex, indices, gold) and timeframes (M5, M30, H1, H4). +Specialized in cross-platform conversion (TradingView ↔ MetaTrader 5), quantitative validation, and out-of-sample multi-régime analysis. + +- LinkedIn: [linkedin.com/in/brayan-rivas-campero-70373b30b](https://www.linkedin.com/in/brayan-rivas-campero-70373b30b/) +- Email: brivascampero@gmail.com + +Available for freelance projects — MQL5 development, Pine Script → MQL5 conversion, strategy optimization, backtesting and validation reports. + +--- + +## License + +MIT — see [LICENSE](LICENSE).