Skip to content

Technical indicators

Fisher Transform

The price’s place in its recent range, stretched so that turns show as sharp peaks.

The Fisher Transform, from John Ehlers, takes the bar’s midpoint, (high + low) / 2, scales its place in the recent range to between −1 and +1, smooths it, and applies the Fisher transform, which pulls values near the edges far out. The signal line is the previous bar’s value.

Traders read a sharp peak and a cross of the signal line as a likely turn. Extreme values are common, so the turn matters more than the level.

midpoint = (high + low) / 2
raw = 2 × (midpoint − lowest midpoint) / (highest midpoint − lowest midpoint) − 1 over periods bars
smoothed = EMA(raw, 5), held between −0.999 and +0.999
Fisher = EMA(ln((1 + smoothed) / (1 − smoothed)), 3)
signal = Fisher one bar ago

The smoothing lengths, 5 and 3, are fixed: they are Ehlers’ 0.33 and 0.5 weights. Holding the smoothed value inside ±0.999, as Ehlers’ own code does, keeps the logarithm finite when the price sits at the edge of its range. A window where the price does not move gives a raw value of 0.

Call: fisherTransform(periods)

Setting Chart default
periods: Periods 14

What you get: a list of 2, in this order: 1. a number (“Fisher Transform”); 2. a number (“Fisher Transform Signal”).

Warm-up: with fisherTransform(14), it asks for 0 bars of history and a run-up of 23, and its first value came on bar 21 of the example data.

Fisher Transform drawn by its own code on example prices

The prices are made up, hourly, and the same on every page, so the chart shows how the indicator behaves, not how a market behaved.

function onIntervalClose() {
const lines = fisherTransform(14);
const fisher = lines[0];
const signal = lines[1];
if (OPEN_POSITIONS_COUNT === 0 && fisher > signal && signal < -1.5) {
openPosition("BUY", { quantity: 10000, stopLossPips: 25, takeProfitPips: 40 });
}
}