Price action · exact MT5 rule set
PO3 London Sweep Strategy: the Exact UTC EA Variant
This is a narrow, reproducible interpretation of a Power of Three-style liquidity sweep. It turns a discretionary idea into completed-bar rules, executable Bid/Ask decisions, and one intraday risk budget. It is not a claim that ICT prescribes one universal PO3 algorithm or that this rule is profitable.
- Default market
- EURUSD
- Execution chart
- M5
- Context
- H1 EMA(50)
- Risk per trade
- 0.25% equity
PO3 as a concept versus this exact UTC variant
“Power of Three” is commonly used to describe a dealing-range narrative: accumulation, a manipulation beyond a range, and a subsequent move toward liquidity on the other side. It is a vocabulary for reading context, not a single indicator formula. The ICT 2022 Mentorship, Episode 10 is background material for that broader teaching. The original ICT Origins — Power Of 3 Concept video provides further background from the creator. Neither source defines this EA, its hours, stop, target, or position size.
Version 1.00 deliberately makes choices a discretionary chart reader may vary. The day is UTC. The reference range is 00:00–05:55 UTC. The setup window is 06:00 inclusive to 11:00 exclusive UTC. The trade is closed at 16:00 UTC. Those fixed UTC times are reproducible, but they are not an invariant London-local session when daylight-saving time changes. The rule is therefore named the PO3 London Sweep for its market context, while its clock is explicitly UTC.
The EA observes a complete M5 sweep of the frozen early range, requires a defined M5 break of structure, then waits for a live retest. It does not infer fair-value gaps, order blocks, or a discretionary news narrative; adding them creates a different version.
Step 1: build and freeze the reference range
On EURUSD, use completed five-minute bars beginning at 00:00 UTC and ending with the 05:55 UTC bar. At 06:00 UTC, freeze the highest high and lowest low from that six-hour interval. A usable range needs positive width, at least 68 of the expected 72 M5 bars, and observations from both the first and second three-hour halves. Small missing intervals are tolerated; an essentially incomplete session is not silently filled with fabricated prices.
There is no trade before the range exists. Weekend dates are ignored. The frozen high and low remain unchanged for every later decision that day.


Step 2: follow the state machine
The setup moves through five states: waiting for range → sweep observed → confirmation observed → virtual retest armed → filled or cancelled. Each transition is based on a completed M5 bar except the final retest, which is a live executable-quote event. One filled trade is allowed per UTC day. A setup that never fills is cancelled at 11:00 UTC; a filled position has no overnight intention and is flattened at the first available quote at or after 16:00 UTC.
Before accepting a sweep, the EA reads the last fully completed H1 close and H1 EMA(50), both based on Close. A long requires that H1 close to be strictly above EMA(50); a short requires it to be strictly below. Equality means no setup. At least 200 H1 bars must be available. The directional bias is frozen when the sweep occurs, so it does not flip just because a later H1 candle changes.
Step 3: sweep, confirmation and virtual retest entry
A long begins with a completed M5 bar whose low trades below the frozen range low but whose close returns above that low. A short is the mirror: high above the frozen range high and close back below it. If one candle breaches both range extremes, the EA skips it. The bar has made the range ambiguous for this version.
At the sweep close, record two facts that will not be recalculated later: the sweep extreme and M5 ATR(14). For a long, structure is the highest high of the three completed M5 candles immediately before the sweep; for a short, it is the lowest low of those three candles. This uses no forward pivot or future candle.
Confirmation occurs on the sweep candle or within the next six completed M5 bars. A long confirmation must close strictly above the frozen long structure and close above its own open; a short must close strictly below structure and below its open. If a later completed candle both breaks the sweep extreme and appears to confirm, invalidation wins. If no confirmation arrives in six bars, discard the setup.
Confirmation is not an entry. After confirmation, the EA waits for up to six M5 bars for executable ask to return to or below structure for a long, or executable bid to return to or above structure for a short. It then sends a market order at the current quote. This is a virtual retest, not a limit fill assumed from Bid OHLC. If price never retests or reaches the planned stop first, there is no trade.
Initial stop, target and position size
For a long, the initial stop is the sweep low minus the larger of two broker points and 10% of frozen M5 ATR(14). For a short, it is the sweep high plus the same buffer. Prices are rounded outward to the trade tick. The target is the opposite extreme of the frozen reference range: range high for a long and range low for a short.
The reward/risk ratio is checked at the real entry quote, not at a candle close. It must be at least 1.5 after using the correct executable exit side: Bid for long exits and Ask for short exits. Commission is a separate cost; it is not hidden inside the displayed ratio. If the target has already been crossed, the stop is invalid, the broker stop level cannot be met, or the current spread exceeds 2.0 pips, the trade is skipped.
The position-sizing budget is 0.25% of current equity before commission and slippage; lot-step rounding can reduce it and a gap through the stop can increase the realised loss. The implementation uses MT5’s OrderCalcProfit to estimate the loss of one lot from entry to stop in the deposit currency. Volume is cash risk divided by that one-lot loss, floored to the broker’s volume step. It is never rounded up merely to satisfy a minimum lot. A below-minimum size or failed margin check means no order. There is no martingale, averaging, pyramiding, trailing stop, or partial exit in v1.00.
How the MT5 implementation keeps the rule causal
MT5 series access distinguishes the current forming bar from completed bars. The implementation reads completed M5 and H1 data before creating a signal; it does not use a future pivot. MetaQuotes documents that CopyRates returns bar history and treats position zero as the current bar, which is why the EA must explicitly use completed-bar shifts for its decisions. ATR comes from the platform’s iATR indicator handle with period 14; this rule specifies MT5’s native simple true-range average rather than silently replacing it with a different ATR convention.
Only positions identified by this symbol and strategy magic are managed. A position from any other magic on the same symbol blocks a new PO3 entry rather than being netted into. The daily one-trade lock is reconstructed from deal history after restart. A restart may miss an unfilled intraday setup; that is safer than inventing a fill. Stop and target are recovered from the broker position, and unrelated positions are not changed.
Automatic account trading is disabled by default. Strategy Tester operation is permitted; demo execution requires an explicit setting, and real-account operation is blocked in this release. The matching EA package is available here: download the PO3 London Sweep EA.
Failure cases and what a zero-trade result means
- No valid range: fewer than 68 qualifying M5 bars, no data in one half, or zero range width blocks the day.
- No directional sweep: price may trend without first closing back inside the range, or a bar may breach both extremes and be rejected.
- Bias or structure fails: H1 EMA50 context can reject the sweep; a second breach of the sweep extreme invalidates it before confirmation.
- No executable retest: a confirmation can run directly to target. This rule does not chase it.
- Execution gates fail: excess spread, insufficient reward/risk, stop-level constraints, minimum volume, margin, or an existing same-symbol position can all prevent a trade.
- News and gaps: v1.00 has no economic-news filter. That makes the variant reproducible, but it can encounter unusually poor fills or slippage around releases. A later news-filtered edition must be a separately tested rule.
The diagnostic funnel records bars, valid ranges, sweeps, bias rejections, confirmations, retests, spread/RR/volume/stop/margin rejections, requests, accepted entries, server retcodes, and time exits. A zero-trade report must be explained with those counts. It is not evidence of zero risk, and it is not enough evidence to call the strategy inactive.
Research protocol and results
The fixed reference settings were tested on EURUSD and GBPUSD with MT5’s native real-tick model. The approved QDM/Dukascopy source contains genuine Bid/Ask quotes from September 2016 to September 2026. Performance windows run from 10 October 2016 to 21 September 2026 exclusive, with larger data gaps and subsequent warm-up omitted. Every segment starts after at least 200 observed H1 bars following the latest excluded date. Raw prices were preserved; small documented gaps remain.
The campaign contains 12 usable segments per pair and two execution scenarios, giving 48 runs. Each starts flat with a separate USD10,000 balance. Rules, presets, data release and case dates were frozen before the campaign; there was no parameter optimization. Dates from 2025 onward were reserved as a holdout. These are separate segment accounts: summed cash results are not the return of a continuous, compounded ten-year portfolio. Drawdown is the largest observed value inside a segment, not a whole-period portfolio drawdown.
The baseline charges USD3.50 per executed lot per side, a constant scenario based on the current IC Markets EU Raw Spread schedule. It does not reconstruct every historical tariff. The stress scenario doubles this fee to USD7 and uses a native 200 ms execution delay. Both use the source’s variable Dukascopy spreads; these are not historical IC Markets spreads. All positions closed intraday, so no historical overnight-financing claim is made.
The research wrapper applies fees through the documented TesterWithdrawal function. These simulated cash charges reduce equity before subsequent risk sizing. MT5’s standard profit totals exclude withdrawals, so the table below is independently recalculated from all deals and cash movements. It must not be replaced with the unadjusted MT5 profit factor.
Swipe the table sideways to see every result column.
| Pair | Scenario | Period | Trades | Net sum (USD) | Net PF | Largest segment drawdown |
|---|---|---|---|---|---|---|
| EURUSD | baseline | 2016–2024 development | 476 | -4,896.17 | 0.60 | 14.11% |
| EURUSD | baseline | 2025–2026 holdout | 79 | -1,558.73 | 0.29 | 10.06% |
| EURUSD | stress | 2016–2024 development | 475 | -7,353.74 | 0.48 | 17.29% |
| EURUSD | stress | 2025–2026 holdout | 79 | -2,012.53 | 0.23 | 12.00% |
| GBPUSD | baseline | 2016–2024 development | 470 | -6,850.04 | 0.42 | 14.31% |
| GBPUSD | baseline | 2025–2026 holdout | 80 | -610.17 | 0.71 | 9.07% |
| GBPUSD | stress | 2016–2024 development | 467 | -8,353.08 | 0.36 | 16.70% |
| GBPUSD | stress | 2025–2026 holdout | 79 | -870.47 | 0.62 | 9.47% |
Why this version lost money
Its large planned reward/risk ratios did not compensate for the low target-hit frequency. In the baseline holdout, EURUSD won 9 of 79 trades (11.4%), with an average net winner of USD69.30 and average net loser of USD31.18. At those observed payoffs, a roughly 31.0% win rate would be needed merely to break even. GBPUSD won 14 of 80 trades (17.5%), versus a roughly 23.1% break-even rate at its observed average payoffs. These are sample descriptions, not stable forecasts.
The baseline holdout’s net profit factor was 0.29 on EURUSD and 0.71 on GBPUSD; below 1 means total net losses exceeded total net wins. Fees made an already negative gross result worse. Tight stops also create larger volumes for the same price-risk budget, making per-lot fees a material addition to the planned loss. A 0.25% price-risk setting is therefore not a guarantee of a 0.25% maximum all-in loss. There is no evidence here to justify increasing risk, averaging losses or presenting a selected winning chart as an edge.
Download every test period, cost assumption and validation checksum. Native checks cover model, actual delay, warm-up, entry and exit times, one entry per UTC day, stops and targets, closed positions and complete fee/cash reconciliation. These checks do not exhaust every runtime or broker failure. The scheduled time-exit branch was not exercised by this historical sample because every trade reached SL or TP earlier. No account trades were placed.
Frequently asked questions
Is this the ICT Power of Three model?
It is one precise, newly specified interpretation inspired by a PO3-style range sweep. It does not claim to encode all ICT teaching or to be the only valid reading of that material.
Why use UTC instead of London local time?
UTC makes the six-hour range and cancellation times unambiguous in historical data. The trade-off is that the fixed clock does not follow London daylight-saving changes.
Why wait for a retest after confirmation?
The retest creates a defined live entry condition and avoids assuming that a candle-close breakout could have been entered at a prior price. It also means many valid confirmations will never become trades.
Does a 1.5 reward/risk target guarantee a profitable method?
No. Reward/risk says nothing about the frequency, fill quality, losses, costs, or dependence between trades. It is an entry gate, not a performance result.
Can I adapt the EA settings?
Yes. The reference settings use 0.25% equity risk, a maximum spread of 2.0 pips and minimum reward/risk of 1.5. Changing these inputs creates a different parameter variant. Results for the reference settings do not validate your changes; keep the exact settings with each test report and test the adjusted version separately. Account trading is disabled by default.
