Fisher Transform Indicator: Ehlers Price Normalisation

Written by Dominic Walsh · Published · Last updated

The fisher transform indicator squeezes price into a fixed range, then stretches the extremes back out. Ehlers built it so a mostly bell shaped price series turns into one with much sharper peaks. Fisher and Trigger run in their own pane, with reference levels at 1.5 and -1.5.

This build ships as a compiled .ex4 for MT4 and .ex5 for MT5; the screenshots below come from EURUSD H1.

Platforms MT4 (.ex4) + MT5 (.ex5)
Chart window Separate window (levels 0 / 1.5 / -1.5)
Plots 2: Fisher, Trigger
Alerts popup, push notification, email, sound
Inputs 8

What each plot looks like

Fisher (blue) carries the transformed value after both smoothing steps.

Trigger (orange red) repeats the Fisher value from the previous bar, so it lags by exactly one.

Three levels cross the pane at 0, 1.5 and -1.5, matching the SignalLevel default and its mirror.

  • Fisher: plot, dodger blue, width 2
  • Trigger: plot, orange red, width 1
EURUSD H1 pane: the fisher transform indicator with Fisher crossing Trigger above 1.5.
EURUSD H1 pane: the fisher transform indicator with Fisher crossing Trigger above 1.5.

How the source computes it

Normalising the price channel

The code scans FisherLength bars for the highest high and the lowest low. It then measures where the current bar midpoint sits inside that channel and shifts the result to run from minus a half to plus a half.

That step alone turns price into a bounded series. Everything after it works on that bounded number rather than on price.

The transform itself

A smoothing pass comes first. The new normalised value gets weighted at 0.66 of double the reading, with 0.67 of the previous smoothed value carried forward.

Then comes the logarithm: half the natural log of one plus the value over one minus it, with half the previous output added back. A value near the edge of the channel pushes that logarithm towards its extremes, which produces the sharp peaks.

Where Trigger comes from

Trigger needs no separate calculation. The code copies the Fisher value from one bar earlier straight into the second buffer.

So a crossing between the two lines means the reading has turned rather than continued. No averaging happens on that side at all.

What the output means

Fisher crossing Trigger is the turn this family is known for.

A reading past 1.5 or under -1.5 means price sat near the edge of its FisherLength channel.

Those peaks are deliberately sharp. That is the transform working, not the market behaving unusually.

The zero line marks the middle of the recent channel rather than any absolute price level.

Alert channels in this build: popup, push notification, email and sound, one message per closed bar.

Alerts cover popup, push, email and sound. A bar time check runs first, so a crossing produces one alert per closed bar.

Every Fisher Transform Indicator input

Core settings

Setting What it does Default
FisherLength Fisher length (price channel). FisherLength sets the channel the normalisation measures against. It defaults to 10. A longer window makes extremes rarer. 10
SignalLevel Signal threshold. SignalLevel is the reference threshold, 1.5 by default, drawn in the pane along with its negative. 1.5

Alert settings

Setting What it does Default
EnableAlerts EnableAlerts gates the message block and defaults to true. on
EnablePopup (see inputs panel) on
EnablePushNotify EnablePushNotify sends each signal to the MT4 mobile app. It defaults to false. off
EnableEmail (see inputs panel) off
EnableSound (see inputs panel) off
SoundFile (see inputs panel) alert.wav
Inputs panel for the fisher transform indicator showing FisherLength and SignalLevel.
Inputs panel for the fisher transform indicator showing FisherLength and SignalLevel.

Where the settings fit

The screenshot uses EURUSD H1. A ten bar channel on H1 turns over several times a day, which suits intraday work. On H4 and daily the readings hold at an extreme for longer stretches. Lengthening FisherLength is the usual answer when the pane spends most of its time pinned past the levels.

Where it falls short

The transform exaggerates by design. An extreme reading only says price sits near the edge of a ten bar channel, which is a very short memory.

In a trend the reading pins past the level and the crossings against that trend keep coming.

The recursion carries part of the previous value forward twice, so one bad reading takes several bars to wash out.

When the channel range collapses, the normalised value swings hard on tiny price moves.

Copy the compiled Fisher Transform Indicator file into your MQL4/Indicators folder, and the MT5 build into MQL5/Indicators, then restart the terminal and drag it onto a chart. The step-by-step guide with screenshots is at how to install MT4 and MT5 indicators.

Background reading on the method behind the Fisher Transform Indicator: International Fisher effect on Wikipedia, Prings Bottom Fisher at StockCharts ChartSchool.

Download the Fisher Transform Indicator for MT4 and MT5

The zip holds the compiled Fisher Transform Indicator build for MT4 and MT5, plus a short README. Compiled files only, no source. Enter your email below and the download link arrives in your inbox.

Download this indicator free

Enter your email and the file is yours. You also get the full MT4 and MT5 library.

  • 1,380+ indicators
  • MT4 and MT5 files
  • No spam, unsubscribe any time

FAQ

Why does the Fisher line spike so much harder than price?

The logarithm does it. As the normalised value approaches plus or minus a half, the ratio inside the log runs towards zero or infinity, so the output stretches out fast. That is the entire point of the transform: it makes the edges of the channel obvious at a glance.

Is Trigger an average of the Fisher line?

No. The code copies the Fisher value from one bar earlier into the Trigger buffer, with no smoothing whatsoever. That makes it a one bar lag of the same series. A crossing therefore only means this bar reading turned against the previous one.

What does FisherLength 10 actually measure?

It sets how many bars the highest high and lowest low come from. The current bar midpoint then gets placed inside that channel. Ten bars is a short memory, so what counts as an extreme changes quickly. Raise it for a steadier reading.

Should SignalLevel stay at 1.5 on a fast chart?

It draws a reference line rather than enforcing a rule, so changing it moves what you see and nothing else. On a fast chart the reading passes 1.5 often, and pushing it to 2.0 narrows the marked region down to genuinely rare readings.

Are results guaranteed?

No. Trading involves risk. Results are not guaranteed; past performance is not indicative of future results. Use the Fisher Transform Indicator as one input. Always backtest before trading live.

Category: this is part of our Signal and Forecast collection. Also, truly, browse more Signal and Forecast for MetaTrader, or explore every MT4 indicator and MT5 indicator on the site.

External references

Dominic Walsh - Forex trader and MT4/MT5 developer

About the author

Written by Dominic Walsh, a Forex trader and MT4/MT5 indicator, Expert Advisor and script developer. Every tool on forexmt4systems.com is tested on live charts before release and ships with ready-to-use compiled MT4 (.ex4) and MT5 (.ex5) files. Learn more about the trader and developer behind this site.

How we build, test and correct every tool: Editorial & Testing Policy. Trading carries risk; see the disclaimer.

Leave a Comment