All indicators

Christiano-Fitzgerald Band-Pass Filter (CFITZ)

An asymmetric band-pass filter on the close that weights past bars so the weights sum to zero, giving a cycle line that swings around zero.

BTCUSD1h
Fixed data to Oct 6, 2026, UTC
Loading the chart

The Christiano-Fitzgerald Band-Pass Filter extracts the part of the close whose cycles fall between Min Period and Max Period. Unlike a centred filter it looks only backwards from the current bar, so it gives a value on every bar.

The newest close gets half the centre weight B0 = (wh - wl) / pi, where wl and wh are the angular frequencies of the longest and shortest periods. Each earlier close j bars back gets the ideal band-pass weight Bj = (sin(j wh) - sin(j wl)) / (pi j), going back as far as the Max Lookback or the start of the chart. The oldest close used then takes whatever weight makes the total exactly zero. That endpoint correction removes any constant level, so the output oscillates around zero. On the first bar the value is zero, and on the second it is half of B0 times the change in the close.

How to read Christiano-Fitzgerald Band-Pass Filter (CFITZ)

Above zero, the close sits in the upper half of a cycle within the band; below zero, in the lower half. Peaks and troughs of the line mark the turns of those cycles, and the size of the swings shows how strong the cycle is.

Because it uses only past bars, the latest value is available on the current bar, unlike a centred filter, but it rests on a one-sided window and can be noisier than a centred filter. A longer lookback sharpens the band at the cost of more calculation per bar.

Settings

Min Period (pLow)
The shortest cycle, in bars, that passes through. Faster swings are filtered out.
Max Period (pHigh)
The longest cycle, in bars, that passes through. Slower swings and the trend are filtered out. It is kept at least one bar above the minimum.
Max Lookback
The most bars of history used for each value. Larger gives a sharper band but costs more work per bar.

Frequently asked questions

How is it different from the Baxter-King filter?

Baxter-King uses a symmetric window centred K bars back, so its newest value is K bars old. This filter uses only past bars with an endpoint correction, so it has a value on the current bar.

Why does it oscillate around zero?

The weight on the oldest bar is set so all the weights add up to zero. A constant price level then contributes nothing, leaving only the cycles.

Does a longer lookback change early bars?

No. Early in the chart the filter can only reach back to the first bar, so the lookback only matters once there is more history than it allows.

Write your own in OpenScript

Every study here is plain OpenScript. Change a setting, combine two, or turn one into a strategy, then backtest it in /trading and run it in sandbox trading (analyzer mode in OpenAlgo) before going further.