MQL5 Algo Trading
555K subscribers
4.07K photos
6 videos
4.08K links
The best publications of the largest community of algotraders.

Subscribe to stay up-to-date with modern technologies and trading programs development.
Download Telegram
Prop Firm Rule Checker is a read-only diagnostic script that evaluates closed-trade history from a live/demo account or Strategy Tester runs against common prop-firm evaluation constraints. Results are printed as a PASS/FAIL report in the Experts/Journal log, reducing manual post-backtest calculations.

Checks include profit target versus starting balance, max daily loss by calendar day, peak-to-valley overall drawdown, a consistency limit to flag single-day profit concentration, and minimum distinct trading days.

Usage involves attaching the script to any chart or running it after a tester pass, then configuring inputs for balance, thresholds, and date range. It uses HistorySelect() only and does not open, modify, or close trades. Rules differ by firm and must be set from the official rule sheet.

πŸ‘‰ Read | VPS | @mql5dev
❀21πŸ‘15πŸ”₯8🀩6🀣2
Most position size calculators evaluate only the next trade and ignore existing exposure. That approach can overstate available risk when multiple symbols are correlated, such as stacking EURUSD and GBPUSD in the same direction and effectively increasing USD exposure.

This script estimates a standard risk-based lot size, then reviews all open positions across the account. It computes recent correlation between each open symbol and the target symbol using the last N bars on a selected timeframe, evaluates whether directions amplify or offset, and aggregates risk already allocated to correlated positions. If combined exposure approaches or exceeds a configurable basket limit, the recommended lot size is reduced.

Output is written to the Experts/Journal log with the positions flagged, correlation values, direction impact, and the adjusted lot size. If any ...

πŸ‘‰ Read | Signals | @mql5dev
❀20πŸ‘12πŸ”₯11🀩8πŸ€”3
Risk-Based Lot Size Calculator is a lightweight MQL5 script designed to standardize position sizing using fixed account risk.

Inputs are limited to InpRiskPercent (risk as a percent of balance, default 1.0) and InpStopLossPips (stop distance in pips, default 20). The script reads the current account balance and symbol trading properties including tick value, tick size, and volume limits (min, max, step).

Lot size is calculated so that a stop-out at the specified pip distance equals the configured risk amount. Output volume is rounded down to the nearest valid step and constrained to broker limits. The calculated lot size and a full breakdown are displayed on-chart and written to the Experts log. Live broker parameters are used, avoiding hard-coded pip assumptions across symbols and account types.

πŸ‘‰ Read | Docs | @mql5dev
πŸ‘18❀15πŸ”₯13🀩9✍2🀯1πŸ‘¨β€πŸ’»1
MQL5 datetime is an integer epoch (seconds since 1970), but broker server timestamps are the broker’s wall clock stored as if it were UTC. When exported as a raw epoch and parsed as β€œ1970 UTC” in Python or spreadsheets, timestamps shift by the server’s UTC offset. On a UTC-3 server, a daily bar at 00:00 becomes 21:00 of the prior day, and session boundaries move without any parsing errors.

A diagnostic script prints the available clocks and deltas: TimeTradeServer() (server wall clock, works without ticks), TimeCurrent() (last tick time, freezes when ticks stop), TimeGMT() (UTC from the PC), and TimeLocal() (PC local time). It reports server-GMT, local-GMT, server-local, tick lag, plus optional last bar time in server time and real UTC (InpShowLastBar=true).

Guidance: export server timestamps as wall-clock text, or export epoch together with the measured...

πŸ‘‰ Read | Calendar | @mql5dev
❀20πŸ‘11πŸ”₯10🀩7
An account statement reports realised results, but omits what each trade offered intrabar. This indicator reads closed trades from account history and measures Maximum Favourable Excursion (MFE) and Maximum Adverse Excursion (MAE) using the bar high/low across the trade’s lifespan on the active timeframe.

Each position is rendered with a vertical span from worst to best excursion, an entry marker, and an exit line. A summary panel aggregates medians for winners (MFE, MAE, capture ratio), losers (MAE), trade count, and median bars per trade.

The key metric is capture ratio: realised profit versus the best unrealised profit seen on winning trades. Low medians often indicate exits that consistently give back gains, while tight stops can appear noisy when MAE barely exceeds the stop despite eventual direction being correct.

Limits are stated: intra-bar ...

πŸ‘‰ Read | AlgoBook | @mql5dev
❀16πŸ‘3πŸ”₯2🀩1
A utility script generates a CSV report with one row per closed position, grouped by DEAL_POSITION_ID, supporting hedging and netting accounts. Output columns include ticket, symbol, direction, entry/exit timestamps, entry/exit prices, profit in points, MFE/MAE in points, capture ratio, bars spanned, and holding time.

Key inputs: InpDias (history days, default 365), InpSoEsteAtivo (restrict to chart symbol or read all symbols), InpTF (timeframe used for excursion measurement, default current), and InpArquivo (CSV name under MQL5\Files).

A summary is printed to the Experts log: trade count, winners/losers, net result, median MFE/MAE for winners, median MAE for losers, median capture ratio, median bars per trade, single-bar trade count, and a count of trades not measurable due to missing historical bars (reported explicitly).

Excursions are computed from bar...

πŸ‘‰ Read | Docs | @mql5dev
❀16πŸ‘9πŸ”₯2🀩1
CME gold has a daily maintenance break. Across an 11-year hourly sample, the first hour after the reopen shows a repeatable upward drift, while other hours are near flat.

An EA was built around a single rule: buy at the reopen, hold a fixed time, use a server-side stop sized by volatility, then stand down. One trade per session. No averaging, grid, martingale, or recovery logic.

Initial research assumed ~19 points round-trip cost and measured +3.34 bps with t=7.40 (59.3% wins, PF 1.63, 11/11 positive years). Real-tick testing showed the reopen cost is closer to ~60 points because bar-level spread summaries understate the reopen spread. After correction: +1.60 bps, t=3.42, ~50.8% wins, PF 1.30, 10/11 positive years.

Sizing for ~20% drawdown gives ~3.3%/yr with ~4.6% max drawdown, Sharpe ~1.23, ~200 trades/yr, implying non-trivial negative-year risk. Validat...

πŸ‘‰ Read | Docs | @mql5dev
πŸ‘9❀7πŸ”₯2
Reusable MQL5 trade-management blocks were added to the Bootstrap library to standardize trailing-stop and break-even handling across EAs. The helpers focus on safe stop updates: validating broker stop levels, preventing β€œreverse” stop loosening when indicator values change, converting money targets into price distances correctly, and applying consistent symbol/magic and BUY/SELL filtering.

Trailing is covered in multiple styles: fixed points with step control, moving-average, ATR (volatility-adaptive with anti-reverse protection), Parabolic SAR, monetary trailing based on account currency, and periodic trailing that tightens stops over time rather than by price movement.

Break-even is implemented as a one-time stop move after an activation threshold, with optional offsets, available in both point-based and money-based forms. The result is less duplicated c...

πŸ‘‰ Read | Freelance | @mql5dev
❀15πŸ‘6πŸ”₯4✍1
M1 OHLC backtests rely on an implicit intra-bar path model. Since OHLC does not record the sequence of prints, the assumed order only becomes material when the bar that closes a trade touches both stop and target, leaving the outcome dependent on the model rather than the market.

A script quantifies this error rate by opening a virtual bracket each minute around the bar open, then advancing until one level is reached. If the closing minute touches both levels, the assumed OHLC path is checked against real tick history. Multiple bracket sizes are swept to produce an error curve.

XAUUSD results over 30 days (27,844 virtual trades): 20pt 62.6% contested, 23.84% wrong; 50pt 30.1%, 8.25%; 100pt 8.9%, 1.66%; 200pt 1.5%, 0.18%; 500pt 0.1%, 0.00%; 1000pt none.

Inputs include symbol, days, bracket list, horizon, sampling step, and optional CSV of mis-resolved cases...

πŸ‘‰ Read | Freelance | @mql5dev
πŸ‘5❀3✍1πŸ”₯1🀩1
This article turns Jesse Livermore’s β€œMarket Key” into a rule-driven MT5 Expert Advisor using a state machine: uptrend, natural reaction, natural rally, and downtrend. Signals come from a frozen consolidation β€œpivot” that must break by an ATR-based clearance on expanding volume, with a strict one-bar reversal filter.

Position building is explicit pyramiding across four tranches, sized from a single stored full-lot calculation to keep risk consistent. Adds occur only after follow-through and a low-volume reaction, then a high-volume resumption; exits trigger immediately on β€œabnormal” against-trend ATR moves with elevated volume, not just stop hits.

Correctness is enforced in OnInit(): tranche percents must total 100, parameters must be sane, and the account must support hedging so each tranche remains a separate ticket. Known gap: no state recovery after ter...

πŸ‘‰ Read | AlgoBook | @mql5dev
❀21πŸ‘3⚑2🀩2πŸ”₯1
Gold trading automation often fails due to broker-side inconsistencies in symbol naming, contract size, and pricing format. Symbols may be XAUUSD, GOLD, XAUUSD.m, XAUUSDpro, or variants, while contracts can represent 100, 10, or 1 ounce, and quotes may use two or three digits.

A robust approach queries the terminal instead of relying on hardcoded constants. Symbol detection ranks available instruments by name match, avoids false positives such as XAGUSD, and optionally accepts an explicit override for non-standard broker symbols. Full specification is read from the terminal: contract size, digits, point, tick size, tick value loss, volume limits/steps, and stops/freeze levels.

Risk functions convert distance into account-currency loss and compute volume from money-at-risk via tick value loss, rounding down to volume steps and returning zero if even the minimu...

πŸ‘‰ Read | Forum | @mql5dev
❀17πŸ‘4🀩1
This EA update removes two hidden assumptions that break real trading workflows: risk is not always β€œ% of account,” and trades do not always enter at the current price. The code now exposes these as explicit choices and builds a cleaner interface for testing and reuse.

Risk per trade supports three models: percent (from balance or equity), fixed cash, or fixed lot. Percent and cash converge into one monetary pipeline; fixed lot treats risk as an outcome, with an optional drawdown override.

Position sizing is corrected for broker volume steps by always rounding down, with normalization to avoid floating-point truncation errors. When minimum lot exceeds the intended risk, the EA can either warn and trade the minimum or skip the trade.

Entry handling adds market, limit, and stop modes. Pending orders size stops/targets/volume from the intended entry price, no...

πŸ‘‰ Read | CodeBase | @mql5dev
❀17πŸ‘6πŸ‘€3πŸ”₯2πŸ‘¨β€πŸ’»2
Certain trading hours are measurably better than others, but generic session rules miss broker-specific behavior. This script quantifies hourly conditions using the broker’s own M1 history over the last N days.

For each hour it calculates average movement (M1 high-low range summed into points per hour) and average spread (from the M1 spread field). The key metric is movement-to-spread ratio: how many spreads of movement an hour provides, allowing direct comparison between high-volatility/high-cost hours and lower-volatility/low-cost hours.

Designed around XAUUSD but supports a comma-separated symbol list and prints results side by side. Inputs include symbols, lookback days (default 90), hour shift for timezone alignment, and optional per-symbol CSV output.

Example findings on one broker: XAUUSD spread stayed near 18.1–19.8 points; best hour 16:00 at 1...

πŸ‘‰ Read | Docs | @mql5dev
❀16πŸ‘6🀯1
ClockDiagnostic.mq5 samples TimeCurrent() and TimeLocal() every few seconds over a fixed observation window to detect server clock failure modes relevant to MT5 scripts and EAs.

Two cases are reported: TimeCurrent() freezing when no ticks arrive, and TimeCurrent() stepping backwards after symbol changes, reconnections, or cross-instrument ticks. Inputs include InpSeconds=60 for observation length and InpStep=2 for the sampling interval.

Output includes both clocks, the initial offset in seconds and hours, a β€œ>>> STEP BACK” line on each backward move, and a window summary: number of readings, seconds advanced by each clock, longest freeze, and step-back count, followed by a verdict. Documented rule: use TimeLocal() for timestamps, date/day transitions, and expiry; use TimeCurrent() for session hours and alignment with market data. The measurement is lim...

πŸ‘‰ Read | Forum | @mql5dev
πŸ‘13❀7πŸ‘Œ3
SafeLogger.mqh provides serialized CSV logging for multiple concurrent EAs without missing lines. It appends a single record per call by opening the file with exclusive access (no FILE_SHARE_WRITE) and retrying up to 8 times with 40 ms backoff, for 320 ms total wait while another writer holds the handle. If all attempts fail, it emits an explicit error and prints the dropped line content.

SafeLogWrite(file, fields) prefixes TimeLocal() and the current symbol and writes time;symbol;fields. SafeLogHeader(file, header) writes the header once when the file does not yet exist.

A demo script supports InpFile, InpLines, and InpSafeMode. It reports mode, successful writes, line counts before/after, elapsed time, and flags >>> N LINE(S) LOST when contention causes missing records. Data loss is only reproducible with concurrent writers; running on four charts with InpS...

πŸ‘‰ Read | VPS | @mql5dev
❀16πŸ‘3πŸ”₯1
ContractSizer.mqh provides balance-based contract sizing with three independent protections: a ladder, a floor, and a breaker. The ladder assigns one contract per balance factor with a hard cap. The floor blocks trading below a minimum capital threshold. The breaker halts sizing after drawdown exceeds a defined fraction of the balance peak and does not rearm automatically.

Deposits and withdrawals are taken from deal history via DEAL_TYPE_BALANCE and applied to the stored peak by the same delta. This prevents deposits during drawdown from masking the drawdown state. Peak is persisted under MQL5\Files and survives terminal restarts.

Usage calls ContractsToday(TimeLocal()) on each tick, recalculating only on day change. CapByBalance() enforces limits even with manual lots; Rearm() remains a manual action. Demo inputs simulate a 12-day path including a deposit...

πŸ‘‰ Read | AppStore | @mql5dev
❀1πŸ‘1🀩1😐1