Displacement
Free MT5 Displacement indicator: arrows and boxes on oversized, strong-bodied candles. Lab repaint test: 0 of 142 signals changed.

- Repainted
- 0 / 142
- Signals / week
- ≈ 11.2
- Tested on
- EURUSD M15
- Tested
- 2026-10-04
Overview
Displacement is a free MT5 indicator. It marks unusually large candles with strong bodies right on your price chart, for traders who trade impulsive moves. Each one gets an arrow and a shaded box over its range; one on-chart panel sums up the last signal. In the Lab's repaint test on EURUSD M15, 0 of 142 signals changed after their bar closed, and no arrow appeared late (maximum delay: 0 bars).
It helps when you want a fixed rule to define "big candle", so you don't judge it by eye.
What it draws on your chart
A displacement is a candle much larger than recent bars, with most of its range in the body. It shows that one side pushed price hard in a single bar. The indicator turns that idea into fixed numbers. A closed bar counts only when it passes all three of these tests:
- Its true range is at least
InpATRMult× the ATR of the previous bar. - Its true range is at least
InpAvgRangeMult× the average true range of the previousInpAvgRangeLookbackbars. - Its body is at least
InpMinBodyRatioof its high-low range.
When a bar qualifies, you get a Bullish Displacement or Bearish Displacement arrow on that bar. You also get a Displacement Box over its high-low, which fades as it ages. Everything draws on the main chart, not in a subwindow. Version 1.00 is a 93.8 KB file and was tested on MT5 build 6230.
How the Lab tested it
The Lab ran the indicator on EURUSD M15 from 2026-07-06 to 2026-10-02 (about 13 weeks), using Raw Trading Ltd real ticks, and logged 142 signals. Every signal was logged when it fired and checked again later for changes. To measure signal quality, the Lab asked one question for each arrow: did price move 1 ATR in the arrow's direction before it moved 1 ATR against it?
The chart below shows the result for all signals and for each arrow type.
Scale zoomed in to show the difference (bars do not start at zero).
What these numbers mean for you:
- 51.4% overall is close to a coin flip. A displacement bar on its own does not tell you where price goes next. Treat the arrow as a reason to look closer, not as an entry.
- Bullish arrows did better than bearish ones. Bullish arrows hit 55.1%. Bearish arrows hit 45.3%, below 50% on only 53 signals. That is too few to call it an edge against you, but enough to filter them harder.
- Expect about 11.2 signals per week on EURUSD M15: about 7 bullish and 4.2 bearish. That is enough to work with, but too many to take every one blindly.
Who it is for
It fits traders who already have a plan built around impulsive candles, such as breaks of structure or zones left behind by strong moves. It gives you a clear, repeatable trigger for that plan. It does not replace the plan.
How it works
- 1Computes true range of every bar and the ATR on the chart timeframe.
TR = max(High - Low, abs(High - prev Close), abs(Low - prev Close))Inputs: InpATRPeriod - 2A closed bar qualifies only if its true range is a large multiple of ATR and of its recent average.
TR >= InpATRMult x ATR and TR >= InpAvgRangeMult x average TR of prior barsInputs: InpATRMult, InpAvgRangeMult, InpAvgRangeLookback - 3The candle body must fill enough of the bar range. Direction follows the candle colour.
Body ratio = abs(Close - Open) / (High - Low) >= InpMinBodyRatioInputs: InpMinBodyRatio - 4Optionally requires a close beyond the last swing high or low, and agreement with the higher timeframe 50 EMA slope.Inputs: InpRequireSwingBreak, InpSwingLookback, InpMTFAlignEnable, InpMTFTimeframe
- 5Marks passing bars with an arrow and a shaded zone over the bar range. Strength is TR divided by ATR.
Strength = TR / ATRInputs: InpShowZoneBox, InpShowArrow, InpFadeBars
Specifications
- Platform
- MetaTrader 5
- Version
- 1.00
- Type
- Indicator
- Window
- Main chart
- Draws
- 2 arrows, 1 zone, 1 panel
- Alerts
- popup, push, sound
- Repaints
- No (0 of 142 signals changed)
- Inputs
- 21
- Tested on
- MT5 build 6230 · 2026-10-04
Repaint test
No repaint detected. In a 6 Jul 2026 – 2 Oct 2026 test on EURUSD M15 (Raw Trading Ltd real ticks), 142 signals were logged at bar close and re-read at the end of the test: 0 changed. Arrows print on the bar that closes the signal, with no delay.
IndicatorFree — tested 2026-10-04 · MT5 build 6230 · Raw Trading Ltd real ticks. Results come from historical data, not live trading, and do not guarantee future results.
Signal statistics
Over 6 Jul 2026 – 2 Oct 2026 on EURUSD M15, the indicator printed 142 arrows. After 51.4% of them, price moved 1×ATR(14) in the arrow's direction before moving 1×ATR against it (median 2 bars). 0% reached neither level within 20 bars.
This measures price movement after the arrow, not a trading result. It includes no spread, commission, stop loss or position sizing.
What it draws
- Arrows (Bullish Displacement) from buffer 0, drawn on the closed bar.
- Arrows (Bearish Displacement) from buffer 1, drawn on the closed bar.
- Rectangles (Displacement Box) drawn as chart objects, not buffers — they are not readable by iCustom() in an EA.
- An on-chart panel (Signal); values shown in the panel are not exposed as buffers.
Inputs
| Input | Default | What it does |
|---|---|---|
| InpATRPeriod | 14 | ATR period of the base volatility (ATR of the previous bar is used) |
| InpATRMult | 2 | Bar true range must be at least this x ATR |
| InpAvgRangeLookback | 5 | Number of previous bars averaged for the range comparison |
| InpAvgRangeMult | 2 | Bar true range must be at least this x the previous bars average true range |
| InpMinBodyRatio | 0.6 | Minimum body / (high - low) ratio of the bar |
| InpRequireSwingBreak | false | Only accept when the close breaks the latest confirmed swing high/low |
| InpSwingLookback | 10 | Bars on each side to confirm a swing (swing is known this many bars late) |
| InpMTFAlignEnable | false | Only accept in the direction of the higher-timeframe EMA50 slope |
| InpMTFTimeframe | H1 | Timeframe of the EMA50 trend filter (last closed bar) |
| InpShowZoneBox | true | Shade a box over the high-low of each displacement bar |
| InpShowArrow | true | Draw an arrow at each displacement bar |
| InpFadeBars | 20 | Bars over which a box fades out; older boxes are hidden |
| InpHistoryBars | 500 | Closed bars scanned for signals when the indicator is attached |
| InpAlertPopup | true | Popup alert on a new displacement bar |
| InpAlertPush | false | Push notification on a new displacement bar |
| InpAlertSound | false | Play a sound on a new displacement bar |
| InpSoundFile | alert.wav | Sound file played when sound alerts are on |
| InpShowDashboard | true | Show the on-chart status panel |
| PanelScale | 1 | Panel size multiplier (DPI is applied automatically) |
| Theme | Dark | Chart color theme |
| RestoreTheme | true | Restore the original chart colors when removed |
How to read it
Install
Copy the downloaded .ex5 file into your MQL5/Indicators folder, refresh the Navigator and drag Displacement onto a chart.
How to read the arrow, the box and the panel
The arrow sits on the displacement bar itself and appears only after that bar closes. While a bar is still forming, nothing is drawn on it. The box covers that bar's high and low. It fades over InpFadeBars bars (default 20) and is hidden after that. It is not deleted.
The example below shows what a typical bullish signal looks like.
The Signal panel shows:
- the direction of the last displacement and how many bars ago it fired
- its range as a multiple of ATR, and its body as a percent of the bar
- the last closed bar's range compared with ATR
- the bull and bear counts over the last 100 bars
- the current ATR
- the higher-timeframe trend and swing levels, when those filters are on
The "last bar range vs ATR" line is useful for checking near-misses. When a big bar gets no arrow, this line tells you how close it came to the ATR test. The average-range and body tests can still reject it.
The inputs to change first
InpATRMultandInpAvgRangeMult(both default 2): these set how big a bar must be. Higher values give fewer, more extreme bars. Lower values give more arrows and more noise.InpMinBodyRatio(default 0.6): raise it to drop bars with long wicks, which are often rejections rather than one-sided pushes.InpRequireSwingBreak(default off): when on, a signal counts only if the bar's close breaks the latest confirmed swing high or low.InpSwingLookback(default 10) sets how many bars confirm a swing. A swing is confirmed that many bars late, so a very recent high is not used yet.InpMTFAlignEnablewithInpMTFTimeframe(default off, H1): when on, signals count only in the direction of the EMA50 slope on the last closed bar of the higher timeframe.InpHistoryBars(default 500): the number of closed bars scanned for past signals when you attach the indicator.
Where alerts appear
All alerts fire when a new displacement bar closes.
InpAlertPopup(on by default) opens the MT5 alert window.InpAlertPush(off by default) sends a notification to the MT5 mobile app linked to your terminal.InpAlertSound(off by default) playsInpSoundFile.
A decision rule for each arrow (our suggestion, not tested by the Lab)
- Bullish arrow: act on it only if the close broke a swing high (turn on
InpRequireSwingBreakor check by eye) and the higher-timeframe EMA50 slopes up. If either check fails, note the box and wait. - Bearish arrow: require both filters, or skip it. Bearish arrows were the weaker side in the Lab sample.
- After either arrow: if price closes back beyond the far side of the box, treat the displacement as failed.
A common misread
The arrow marks a bar whose range is already at least 2× ATR at default settings, so entering at its close often means buying the top of a spike. Check how far price already is from the box. If the move is too stretched for your stop, the signal is real, but the trade is not for you.
Installation
- 1Download DisplacementIndicator.ex5 from the button above (Google Drive).
- 2In MetaTrader 5: File → Open Data Folder → MQL5 → Indicators. Copy DisplacementIndicator.ex5 there.
- 3Restart MT5 or right-click Indicators in Navigator → Refresh.
- 4Drag Displacement onto a chart. For push alerts, enable "Allow push notifications" under Tools → Options → Notifications.
- Tested on MT5 build 6230.
Key terms and guides
- Swing high
- A swing high is a candle whose high is above the highs of the candles on both sides of it. It marks a peak where buyers stopped pushing and price turned lower, at least for a while.
- Higher Timeframe
- A higher timeframe is any chart period longer than the one you trade on, such as the daily chart for someone trading the 1-hour chart. Traders use it to see the bigger trend and the main price levels around their smaller-chart trades.
- Displacement
- Displacement is a sudden, one-sided price move. It is made of one to three large-bodied candles that close beyond a recent swing level and often leave a fair value gap behind, which shows that large orders pushed the market.
- Candlestick
- A candlestick is one bar on a price chart that shows four prices for a set period: the open, high, low and close. A thick body spans the open and close, and thin wicks reach the high and low.
- Trend
- A trend is the main direction price keeps moving in over a period. In an uptrend price makes higher highs and higher lows. In a downtrend it makes lower highs and lower lows.
- Market Noise
- Market noise is the small, random back-and-forth price movement that has no lasting direction. It comes from routine buying and selling, not from a real change in what traders think an asset is worth.
- Guide: What Is a Fair Value Gap in Forex? How to Spot and Trade One
- Guide: How to Read Candlestick Charts: Bodies, Wicks and Shapes Explained
More on this subject: Price action & SMC guide, terms and tools
User reviews
No reviews yet. Members who download the tool can review it here.
Sign in and download the tool to review it.
Build a checklist with it
Displacement does one job on the chart: entry signal. Put it on the same chart as the tools below and the IndicatorFree panels merge into one checklist card, ordered trend, zone, signal, risk.
- Trend / contextEMA Trend WallDisplacement tells you when; this tells you which way the market leans, so you can skip signals against it.
- Zone / levelEnvelope BandsShows the zones and levels, so you can see whether a signal from Displacement fires at a level worth trading.
The Lab has not tested these combinations. Each tool is tested on its own; the card only lines up what each one says. Free members get 2 new tools a day. If one has to wait until tomorrow, install BlackBox to raise the limit to 5 a day (20 on a live account).
FAQ
Does Displacement repaint?
No repaint detected. In a 6 Jul 2026 – 2 Oct 2026 test on EURUSD M15 (Raw Trading Ltd real ticks), 142 signals were logged at bar close and re-read at the end of the test: 0 changed. Arrows print on the bar that closes the signal, with no delay.
Can I use Displacement in an EA?
Yes. Read buffer 0 (Bullish Displacement) with iCustom() on bar 1 — the last closed bar.
Why can’t my EA read the zones?
Zones and the panel are chart objects, not indicator buffers, so iCustom() does not return them.
How do I get alerts on my phone?
Enter your MetaQuotes ID under Tools → Options → Notifications, tick "Enable push notifications", and keep the push alert input on.
Does it work on other pairs?
Tested on EURUSD only; other symbols not tested.
Is a displacement the same as a break of structure?
No, it measures one candle's size; turn on `InpRequireSwingBreak` to also require a close beyond the last confirmed swing.
Can I use it on M1 for scalping?
It runs on any timeframe. On M1, ATR is tiny, so spread and small spikes can produce many arrows. Test higher `InpATRMult` and `InpAvgRangeMult` values on your own pair before relying on it.
Why did older boxes disappear from my chart?
That is `InpFadeBars` at work (see How it works). Raise it if you want past displacement zones to stay visible longer.
Can I get alerts on my phone?
Yes. Set `InpAlertPush` to true and link the MT5 mobile app to your terminal for push notifications. The alert fires once the displacement bar has closed.
Does it work on gold or indices?
It runs on any symbol because it measures range against that symbol's own ATR. The Lab did not test gold or indices, so check its signals on your own chart first.
Changelog
- 1.00Initial release: dual-threshold displacement detection (ATR multiple + average range of prior bars + minimum body ratio), confirmed only on closed candles with no repaint. · 2026-10-05
Final verdict
Where it does its job well
It turns a vague idea, "a big, strong candle", into a rule you can check and set. Signals are final once the bar closes, so what you see in history is what you would have seen live.
Signals also resolve quickly. On the Lab test, the median time to reach 1 ATR on one side was 2 bars (about 30 minutes on M15). In 0% of signals did price fail to reach either side within 20 bars. You will know fast whether a displacement followed through.
Its limits
- It finds strong bars. It does not predict direction. As the Lab results above show, the arrow needs context from your own structure or trend read.
- The Lab measured one pair (EURUSD) on one timeframe (M15). Other pairs, timeframes and settings were not tested.
- News spikes can pass every threshold. The indicator cannot tell a data release from real order flow.
- It has no stop, target or position-size logic.
The comparison below shows when it fits and when to leave it off.
- –Your plan already uses breaks of structure or impulse zones
- –You want closed-bar alerts instead of watching the chart
- –You add the swing-break or higher-timeframe filter
- –You want a standalone buy/sell system
- –You trade around scheduled news releases
- –Your stop cannot fit a bar that is already 2x ATR long
Settings to start with
Start with the defaults so your results compare with the Lab's. Then try these changes one at a time. None of them were tested by the Lab, so compare each against the default:
- Turn on
InpRequireSwingBreakto keep only displacements that break structure. - On M15 or H1 charts, turn on
InpMTFAlignEnablewithInpMTFTimeframeset to H4. - On M1 or M5, raise
InpATRMultto 2.5 to cut noise from small spikes.



















