Monitor every major and minor pair from one screen. Never miss a setup.
Room-based cycle tracking with Peak Formation detection β fully automated.
Type 1, Type 2, Safety & ID50 signals with SL/TP β the moment they fire.
H4 & D1 trend and EMA alignment at a glance β confirm confluence instantly.
[H4:Bullish D1:Bearish] for confluenceThe foreign exchange market is not random. Behind every spike, every stop hunt, every reversal lies a single force: the market maker. These institutional participants are contractually obligated to provide liquidity on both sides of the market. To do so profitably, they follow a repeating, mechanical cycle β and once you can see it, you can trade alongside it.
The Beat The Market Maker (BTMM) methodology, developed by Steve Mauro, teaches retail traders to recognise this cycle and position themselves on the right side of the institutional order flow. Instead of fighting the market maker, you trade with them β entering after the manipulation phase and riding the distribution move.
This is the pattern you will see playing out on your charts every single day. The indicator draws and labels all of this automatically β but understanding the shape of the cycle is essential.
Read it left to right like a chart. During Asia, price chops sideways inside a tight box. At the London open, the market maker spikes price below the range to trigger retail stop losses and fill their buy orders cheaply. Once filled, price reverses sharply β the 5 EMA crosses above the 13 β and the genuine bullish move begins. This is the distribution phase, and it's where the indicator fires your entry signal.
The bearish cycle is the exact mirror: price spikes above the Asian Range to hunt buy stops, fills the market maker's sell orders, then reverses sharply downward. The 5 EMA crosses below the 13, and the distribution sell-off begins.
The beauty of BTMM is that this cycle doesn't just play out once. It plays out on multiple timeframes simultaneously β each daily cycle is one "level" inside a larger multi-day swing. Stack enough levels in one direction, and you get a Peak Formation β the high-probability reversal point where the big swing turns.
This is the concept that makes BTMM unique. Every multi-day swing is built like a staircase β each step is a "level," and each level is contained inside a "room."
A room is a price range defined by Asian Range boxes at the same level. Think of it as a floor in a building β price enters the room, bounces around inside it across one or more sessions, and eventually breaks out to start a new level.
The rule is simple: if the next Asian Range overlaps the current room, it stays at the same level. If it breaks cleanly above or below, a new level begins and a new room opens.
A typical market maker swing runs 3 levels in one direction, then reverses. Here's what the full cycle looks like β this is exactly what the indicator tracks automatically:
BTMM uses a specific set of Exponential Moving Averages, each serving a distinct purpose. Together they create a layered view of institutional momentum β from the fastest scalp-level pulse to the longest-term trend anchor.
The 5/13 EMA crossover is the primary entry trigger. When the Fast (5) crosses above the Slow (13), it signals bullish momentum. When it crosses below, bearish. But a raw crossover alone produces noise β which is why the indicator adds multiple confirmation layers:
| EMA | Period | Colour | Toggle | Role in BTMM |
|---|---|---|---|---|
| Fast | 5 | β Goldenrod | [MA] | Entry trigger β the aggressive line. Reacts first to momentum shifts. |
| Slow | 13 | β Red | [MA] | Entry confirmation β when Fast crosses Slow, the setup is active. |
| Water | 50 | β Aqua | [MA] | The "Water level." Pullbacks to here are Safety / ID50 entries. |
| Mayo | 200 | β White | [M] | Macro bias. Above Mayo = bullish, below = bearish. The "tide." |
| Blueberry | 800 | β Slate Blue | [MA] | Long-term anchor. Confluence here amplifies any signal's quality. |
Traditional BTMM analysis uses two timeframes working together. The State Engine combines both into one chart β but understanding the logic helps you read the indicator with confidence.
The 15-minute chart is the sweet spot for BTMM entries because:
Enough resolution to see EMA crossovers clearly and place tight stop losses β without the noise of M1 or M5.
32 candles per Asian session (8 hours Γ 4 per hour). This gives a clean, well-defined range box β not too few candles, not too many.
The London KZ (3 hours) = 12 candles. Enough time to see manipulation, wait for the crossover, and enter during distribution.
Without the State Engine, a BTMM trader must do all of this manually β every day, across every pair they want to trade:
In MT5: File β Open Data Folder.
Go to MQL5 β Indicators.
Copy BTMM_State_Engine_Pro.ex5 into this folder.
Right-click Indicators in the Navigator panel and select Refresh.
Drag the indicator onto any M15 chart.
In MT4: File β Open Data Folder.
Go to MQL4 β Indicators.
Copy BTMM_State_Engine_Pro.ex4 into this folder.
Right-click Indicators in the Navigator panel and select Refresh.
Drag the indicator onto any M15 chart.
.ex5 file is for MetaTrader 5, and the .ex4 file is for MetaTrader 4.
During the Asian session, the market is quiet. The market maker uses this period to build their position inside a tight range. The indicator automatically draws this range as a filled box.
This is the heart of the indicator. Every new Asian session box is compared to the current room's bounds. Core level detection (Asian Range levels, rooms, peaks) always uses H1 data regardless of chart timeframe, while entry signals are generated from M15.
Rooms visually connect like stairs β the right edge of each room ends where the left edge of the next room begins, with no overlap between them.
| Direction | Colour | Meaning |
|---|---|---|
| β² UP | β Dodger Blue | Bullish accumulation |
| βΌ DOWN | β Crimson | Bearish accumulation |
| β Neutral | β Gray | First L1, no direction |
| STALE | β Grey + label | Too many boxes β forced reset |
At Level 2+, the market maker may have accumulated enough. The cycle reverses. Peak Formations are the exact moment this happens.
Four distinct entry types, each based on the 5/13 EMA crossover with multi-layer confirmation filters.
Price broke the Asian Range extreme (stop hunt), then the 5/13 EMA cross fires in the opposite direction. The classic BTMM setup β strongest signal type because the market maker has just filled their orders against trapped retail traders.
Standard 5/13 EMA crossover without a preceding stop hunt. Price breaks from within the Asian Range on pure momentum. Reliable but lacks the stop-hunt confirmation of T1.
EMA cross fires near the 50 EMA (the Identity/Water level) β the key institutional decision point. High probability because this is where the market maker's average position sits. Exceptional risk-to-reward.
AR already broken, price pulls back to the 50 EMA, then the EMA crossover catches the re-entry. A safe re-entry after the initial break has proven direction. The highest-quality signal.
| Button | Full Name | What It Toggles |
|---|---|---|
| MA | Moving Averages | Fast (5), Slow (13), Water (50), Mayo (200), Blueberry (800) EMAs |
| M | Mayo Line | 200 EMA horizontal reference β the institutional "mayo level" |
| Y | Yesterday | Yesterday's High and Low as dashed reference lines |
| P | Psychological | Round-number levels (00, 25, 50, 75 pip increments) |
| Z | Killzones | Coloured strips marking London (green) and NY (orange) windows |
| ZN | Level Zones | Cycles: Off β ZN1 (AR union) β ZN2 (true candle range) |
| E | Entry Signals | Current session entry arrows + SL/TP projection lines |
| EH | Entry History | Historical entry signals across all visible sessions |
| ADR | Daily Range | ADR-based TP projection + DR/ADR in status bar |
| LVL | Level Filter | Filter scanner: ALL β L1-2 β L2-3 β L1-3 |
| ? | Help | In-chart quick reference overlay |
The single most valuable feature for active traders. One screen. 28 pairs. Zero missed setups.
Click any symbol to instantly switch the main chart to that pair on M15.
Signals survive chart switches. They only clear when direction reverses.
Drag the title bar to reposition the scanner anywhere on the chart.
Font size, row height, column width, position β all adjustable in Inputs.
Every column tells you something specific about the cycle state for that pair. Here's exactly what each one means:
| Column | What It Shows | How to Read It |
|---|---|---|
| PAIR / SYM | Symbol name | Click to switch the main chart to this pair. |
| LVL | Current cycle level | L1 = starting level, L2 = trend confirmed, L3+ = deep in cycle, peak zone. |
| PEAK | Peak Formation status | PFH?/PFL? = pending (watch closely), PFH β/PFL β = confirmed (act now), β = no peak detected. |
| DIR | Cycle direction | β² = bullish, βΌ = bearish, β = neutral (L1 with no direction yet). |
| SIGNAL / SIG | Current entry signal | Shows the active signal type (BUY T1, SELL Safety, etc.) if a crossover is firing. Blank when no signal. |
| KZ | Kill Zone status | Active = London or NY session is open. Wait = outside Kill Zone hours. |
| L3! | EMA shift warning | Flags when price is at Level 3+ β the EMAs may be lagging due to the extended move. Extra caution warranted. |
| PHASE | Cycle phase | Init = first level, Trend = directional, Peak = reversal forming, Rev = post-peak reversal, STALE = range-bound reset. |
| ADR | Average Daily Range | The pair's normal daily pip range (e.g. 120 pips for EURUSD). Used as the TP reference. |
| RNG | Today's range | How many pips price has moved so far today. Compare against ADR to gauge remaining potential. |
| ADR% | Range exhaustion | Today's range as a percentage of ADR. <60% = fresh, 60β80% = normal, 80β99% = caution, 100%+ = exhausted. |
The scanner dashboard is designed to fit any screen size and layout preference. Everything can be adjusted β here's how.
The scanner panel is drag-and-drop. Click and hold the title bar at the top of the scanner, then drag it anywhere on your chart. The position is saved and persists when you switch symbols or timeframes.
You can also set a precise starting position using the Inputs tab:
| Input | Default | What It Controls |
|---|---|---|
InpDashboardX | 10 | Horizontal position in pixels from the left edge of the chart. Increase to move right. |
InpDashboardY | 150 | Vertical position in pixels from the top edge. Increase to move down. |
If symbol names are clipped, signals are overlapping, or you want a more compact or spacious layout, adjust these in the Inputs tab:
| Input | Default | What It Controls |
|---|---|---|
InpScannerSymWidth | 55 px | Symbol column width. Increase if your broker uses long names with suffixes (e.g. EURUSD.raw needs ~75px). Decrease if you want a narrower panel. |
InpScannerColWidth | 100 px | Signal column width. Controls the width of the SIG column where entry signals display (e.g. "BUY Safety"). Increase if text is cut off. |
InpScannerRowH | 18 px | Row height. The vertical spacing for each symbol row. Increase for readability on high-DPI screens, decrease for a compact look. |
| Input | Default | What It Controls |
|---|---|---|
InpFontSize | 8 | Status bar & label font size. Controls the text size for the status bar, room labels, and level annotations on the chart. |
InpScannerFontSize | 9 | Scanner font size. Controls the text size inside the scanner panel. Increase to 10β11 for high-DPI or if you sit far from your monitor. |
InpTextColor | White | Dashboard text colour. Default white works on the dark background. Change if using a light chart theme. |
New in v1.53. A compact panel that sits below the scanner, showing H4 and D1 trend direction and EMA alignment β so you can instantly see if higher timeframes support your H1 BTMM setup.
| Row | Data | How to Read It |
|---|---|---|
| H1 | Current BTMM level + direction | Your main indicator state β e.g. L3 β² means Level 3 Bullish. |
| H4 | H4 trend + EMA alignment | Bullish/Bearish based on EMA 5 vs 13. β = EMAs 5>13>50 (or 5<13<50) are stacked. |
| D1 | D1 trend + EMA alignment | Same logic as H4 but on Daily timeframe. |
| Summary | All-TF alignment check | β ALL BULLISH / β ALL BEARISH = high confidence. β MIXED TFs = conflicting β use extra caution. |
| Colour | Meaning |
|---|---|
| Green | Bullish trend with aligned EMAs (5>13>50) |
| Red | Bearish trend with aligned EMAs (5<13<50) |
| Yellow | Trend present but EMAs not fully stacked β transitioning |
H1 bullish + H4 bullish + D1 bullish = highest confidence. Trade with full size.
H1 and higher TFs disagree. Reduce size, tighten stops, or wait for alignment.
All signal alerts now include HTF status: [H4:Bullish D1:Bullish]
InpShowHTFPanel to toggle. InpHTFPanelOffsetY to adjust spacing below scanner.
Press [ZN] to cycle through three modes. Each reveals a different layer of supply and demand.
Only the hollow room rectangle. Height = first AR box only.
+ Dashed box covering ALL AR highs/lows at this level.
+ Dotted box covering true candle extremes across the full visual width of the room β including London and NY sessions between Asian boxes, not just candles within the Asian session itself.
| DR vs ADR | Status | Action |
|---|---|---|
| < 60% | Fresh | Trade with confidence β plenty of range |
| 60β80% | Normal | Good range remaining β normal management |
| 80β99% | β Orange | Nearing full range β tighten stops |
| 100%+ | β Red | Daily range complete β take profit |
Level, direction, phase, active layers, ADR, and both local + server time β all in one line with a dark background for readability.
Alerts fire across three channels simultaneously: MT popup, phone push notification, and on-chart toast.
| Alert | Trigger | Toggle |
|---|---|---|
| PFH/PFL Confirmed | Peak Formation confirmed | InpAlertPFConfirmed |
| London KZ Start | London Killzone opens | InpAlertLondonKZStart |
| NY KZ Start | NY Killzone opens | InpAlertNYKZStart |
| Scanner Signal | Any pair fires a crossover | InpAlertScannerSignal |
| Scanner PF | Any pair confirms PFH/PFL | InpAlertScannerPF |
| Rule | Why |
|---|---|
| Trade during Killzones | 80%+ of profitable moves happen during London/NY |
| Respect the level count | L1 = trend trades, L2+ = reversal watch (PFH/PFL zone) |
| Wait for confirmation | PFH? is pending β PFHβ is confirmed |
| Check ADR before entry | If 80%+ used, the daily move may be done |
| Align with cycle direction | Never trade against the market maker |
| Use the scanner | Trade the best setup across 28 pairs β not just one |
Whether you're on MT4 or MT5 β the workflow is the same. Follow these nine steps from setup to trade management.
Open an M15 chart on MT4 or MT5. EURUSD is a good starting point.
Attach the indicator to the chart by dragging it from the Navigator. Accept the default settings and click OK.
The Asian Range box draws automatically during the Asian session (00:00β08:00 GMT). Wait for the box to complete β this is the accumulation phase. Once it closes, the day's reference levels (AR High, AR Low, ID50) are locked in.
Read the status bar and scanner panel: Level (L1/L2/L3), Direction (β²/βΌ), Phase (Init/Trend/Peak/Rev), and Kill Zone status (Active/Wait). This tells you where the cycle is and whether to look for trades.
During the London Kill Zone (08:00β11:00 GMT) or NY Kill Zone (13:00β16:00 GMT), watch for a 5/13 EMA crossover signal. 80%+ of profitable moves happen during these windows.
Before entering, confirm: Vector candle present (above-average range candle), TDI/RSI aligned with the signal direction, and cycle direction matches the trade. All three filters must agree.
Enter at the signal with SL placed below/above the Asian Range + buffer (drawn automatically), and TP = Asian Range height. The indicator draws SL/TP projection lines directly on the chart.
At Level 2 and above, the market maker may be fully loaded. Watch for PFH?/PFL? (pending peak) in the dashboard. These signal that the big reversal is forming β the cycle may be about to flip.
When PFH β or PFL β confirms, the cycle flips. Rooms repaint. The opposite staircase begins. Trade in the NEW direction β this is the highest-conviction setup in BTMM.
Most settings work perfectly out of the box. Below are the ones you may want to adjust.
| Input | Default | What It Does |
|---|---|---|
InpAsianStartHour | 0 (Auto) | Asian session start in broker time. 0 = auto-detect from GMT. Only change if auto-detect is wrong. |
InpAsianEndHour | 8 (Auto) | Asian session end in broker time. Auto-calculated as start + 8 hours. |
InpLondonStartHour | 0 (Auto) | London Killzone start. 0 = auto-calculate from GMT offset. Override for unusual brokers. |
InpNYStartHour | 0 (Auto) | New York Killzone start. Same auto-detect logic as London. |
TimeGMT() with broker server time to calculate the GMT offset. It then shifts all session boundaries accordingly. For example, if your broker is GMT+2, the Asian session (normally 00:00 GMT) starts at 02:00 broker time. This happens automatically every time you attach the indicator.
| Input | What It Does |
|---|---|
InpSymbols | Comma-separated list of all 28 symbols the scanner monitors. You must match your broker's exact symbol names β see suffix guide below. |
InpScannerHistDays | How many days of history to scan per symbol (default: 20). |
InpHistoryDays | History depth for the main chart's level counting (default: 60). |
| Input | Default | Effect |
|---|---|---|
InpUseTDIFilter | true | Requires TDI/RSI confirmation before firing a signal. Reduces false entries. |
InpUseVectorCandle | true | Requires the crossover candle to be a Vector candle (above-average range). |
InpUseCycleFilter | true | Only fires signals aligned with the current cycle direction. |
InpShowID50 | true | Enable/disable ID50 entry signals. |
InpShowSafety | true | Enable/disable Safety entry signals. |
InpSLBuffer | 150 | Stop loss buffer in points (150 points = 15 pips on 5-digit brokers). |
| Input | Default | What It Controls |
|---|---|---|
InpAlertPFConfirmed | true | Alert when PFH/PFL is confirmed on the main chart. |
InpAlertEntrySignal | true | Alert when an entry signal fires on the main chart. |
InpAlertScannerSignal | true | Alert when any scanner pair fires a crossover signal. |
InpAlertScannerPF | true | Alert when any scanner pair confirms a Peak Formation. |
InpAlertScannerKZOnly | true | Scanner signal alerts only during active Killzones β kills noise outside session hours. |
InpAlertLondonKZStart | true | "London Killzone is open" reminder. |
InpAlertNYKZStart | true | "NY Killzone is open" reminder. |
InpAlertCooldownMins | 15 | Minimum minutes between repeated alerts for the same symbol. |
InpAlertPopup | true | Show the on-chart popup toast. |
InpAlertPopupSeconds | 10 | How long the popup toast stays visible. |
| Input | Default | What It Controls |
|---|---|---|
InpShowHTFPanel | true | Show or hide the Higher Timeframe Context Panel below the scanner. |
InpHTFPanelOffsetY | 5 | Vertical pixel gap between the bottom of the scanner and the top of the HTF panel. |
InpShowHTFInAlerts | true | Append HTF trend status (e.g. [H4:Bullish D1:Bearish]) to all signal alerts. |
This is the #1 setup issue. Many brokers add a suffix to symbol names:
| Broker Style | Example | What You See in Market Watch |
|---|---|---|
| Standard | EURUSD | EURUSD |
| Micro suffix | EURUSDm | EURUSDm, GBPUSDm, etc. |
| Dot suffix | EURUSD.r | EURUSD.r, GBPUSD.r, etc. |
| ECN suffix | EURUSD-ECN | EURUSD-ECN, GBPUSD-ECN, etc. |
| Hash suffix | EURUSD# | EURUSD#, GBPUSD#, etc. |
| Prefix | rEURUSD | rEURUSD, rGBPUSD, etc. |
How to fix:
Open View β Market Watch (Ctrl+M). Look at the exact symbol names your broker uses. Note the suffix or prefix.
Double-click the indicator in the Navigator β Inputs tab β find InpSymbols. Add your broker's suffix to every symbol. For example, if your broker uses .r:
The scanner will reload. All 28 rows should populate with coloured data within a few seconds.
GOLD, XAUUSD, XAUUSDm, or Gold.r. Check your Market Watch and update the last entry in InpSymbols to match. If your broker doesn't offer a symbol, simply remove it from the list.
The indicator auto-detects your broker's GMT offset by comparing TimeGMT() with server time. This works on 99% of brokers. If the boxes look wrong:
| Possible Cause | Fix |
|---|---|
| Weekend / market closed | TimeGMT() needs a live connection. Restart MT5 during market hours (Sunday evening onwards). |
| Broker uses unusual offset | Manually set InpAsianStartHour and InpAsianEndHour in broker time. Check your broker's server clock against time.is/GMT. |
| DST changeover | During Daylight Saving transitions, the offset may be off by 1 hour for a session. The indicator recalculates on every load, so restarting MT5 after the transition fixes it. |
The indicator uses MetaTrader's built-in SendNotification() function. For it to reach your phone:
Download MetaTrader 4 or 5 (matching your desktop version) from the App Store or Google Play. Log in to your account.
In the mobile app: Settings β Messages β MetaQuotes ID. Copy this code (it looks like A1B2C3D4).
On your PC: Tools β Options β Notifications. Tick "Enable Push Notifications" and paste your MetaQuotes ID. Click Test to verify.
Push notifications only work while the desktop terminal is running and connected. Consider running it on a VPS for 24/5 alerts.
| Symptom | Cause | Fix |
|---|---|---|
| No boxes, no levels, no data | Wrong timeframe | Switch to M15. The indicator requires the 15-minute chart. |
| Very few boxes visible | Not enough history loaded | Scroll left on the chart to load more history bars. Increase InpHistoryDays if needed. |
| Chart colours didn't change | Permissions not ticked | When attaching, ensure "Allow DLL imports" (if prompted) and "Allow modification of indicator's signals" are enabled. On MT5 also check Tools β Options β Charts β "Maximum bars in chart" is at least 50,000. |
| Indicator not in Navigator | Wrong folder | Ensure the .ex5 file is in MQL5\Indicators\ or .ex4 is in MQL4\Indicators\. Right-click Indicators β Refresh. |
| Scanner loads some pairs but not all | Pairs not in Market Watch | The indicator auto-adds symbols via SymbolSelect(), but some brokers block this. Manually add missing pairs to your Market Watch first. |
If too many consecutive Asian Range boxes fall within the same room without triggering a new level, the room is marked STALE. This means the market is ranging sideways with no clear direction.
The threshold is controlled by InpMaxBoxesPerLevel (default: 5). When reached, the level resets. This is normal β it prevents the indicator from sitting in a dead zone forever. Wait for a fresh breakout to re-establish directional levels.
| Tip | Details |
|---|---|
| One instance only | Only attach the indicator to one chart. The scanner monitors all 28 pairs from that single chart β no need for multiple instances. |
| Reduce history if slow | Lower InpHistoryDays from 60 to 30 if your terminal feels sluggish on older hardware. |
| Remove unused pairs | If you only trade majors, trim the InpSymbols list to reduce CPU usage. |
| Close other indicators | Heavy indicators on the same chart can slow down rendering. The State Engine draws many objects β give it space. |
| Optimised Code | v1.53 includes full Strategy Tester optimisation. The indicator automatically detects tester mode and skips all graphical operations. |
Print this page and keep it next to your screen.
Whether you have a setup question, a feature request, or need help configuring the indicator for your broker β we're here to help.