Bollinger Band ZigZag Indicator

IMPORTANT: Do not use the indicator in a real trading system; it looks ahead in time and will make you lose money. It is meant for research only: to show potential profits and display arrows at highly profitable positions to facilitate formulating better trading rules.

The indicator presented here is very similar to the ZigZag Indicator except that the turning points for this indicator are where the opposite Bollinger Bands are last breached before the next signal.

The formula is written as a trading system. It can be Backtested, and the BB period and width can be optimized. Since this is just an experimental formula no attempt has been made to optimize the code.

function ParamOptimizedescriptiondefaultValminvmaxvstep )
    return Optimize(descriptionParam(description,defaultValminvmaxvstep ), minvmaxvstep ); 

BlankBars 10// Set to the number set in preferences

Buy Sell Short Cover Pos 0;
Periods ParamOptimize"Periods"3330);
Width ParamOptimize"Width"1050.1 );
BBTOp BBandTopHPeriodsWidth ); // Note H is used instead of the tradional C
BBBot BBandBotLPeriodsWidth ); // Note L is used instead of the tradional C

PlotBBTop"BBTop"colorBluestyleLine );
PlotBBBOt"BBBot"colorBluestyleLine );
PlotC""1128 );

BI BarIndex();
start Status"firstvisiblebarindex" ) - BI[0] - BlankBars;
end     Status"lastvisiblebarindex" ) - BI[0] - BlankBars;
LBI LastValueBarIndex() );

for ( LBIPeriodsb-- )
    if ( L[b] <= BBBot[b] AND pos <= )
        pos 1;
        Buy[b] = True;
        BuyPrice[b] = BBBot[b];
        if ( H[b] >= BBTop[b] AND Pos >= )
            Pos = -1;
            Sell[b] = True;
            SellPrice[b] = BBTop[b];

Short Sell;
ShortPrice SellPrice;

Cover Buy;
CoverPrice BuyPrice;

Eq Equity);

if ( ParamToggle"Equity""HIDE|SHOW") )
    PlotEq""colorYellowstyleOwnScale );

ShowTriangles ParamToggle"Arrows""HIDE|SHOW");

if ( showTriangles )
    PlotShapesIIfBuy,     shapeSmallUpTriangleshapeNone ), 50BuyPrice);
    PlotShapesIIfSell,    shapeHollowDownTriangleshapeNone ), 40SellPrice);
    PlotShapesIIfCovershapeHollowUpTriangleshapeNone ), 50CoverPrice);
    PlotShapesIIfShortshapeSmallDownTriangleshapeNone ), 40ShortPrice);

if ( ParamToggle"Trade Lines""HIDE|SHOW") )
    Sig Buy OR Short;
    signum CumSig );
    y0 0;
    y1 C[0];
    TPrice C;
    Shortcolor LongColor colorWhite;

    for ( start ;end ;b++ )
        if ( Sig[b] )
            x0 y0;
            x1 y1;
            y0 b;

            if ( Buy[b] )
                y1 BuyPrice[b];
                Color Shortcolor;
                if ( Short[b] )
                    y1 ShortPrice[b];
                    Color Longcolor;

            if( SigNum[b] > PlotLineArrayx0x1y0y1 ), ""ColorstyleThick );

Reducing Indicator-Lag

The usual way to reduce Indicator lag in averaging formulas, such as the MA(), EMA, and Tilson T3(), is to try and dream up a completely new formula. This isn’t easy. It is often easier to remove lag from an already smoothed plot, than to improve the basic smoothing formula.

Indicator Delay is often an essential Indicator quality and (imo) is not the same as Indicator Lag. The ideal smoothing function is one with zero delay, i.e., one that tracks the price with a perfectly smooth-looking plot. Delay can be added later as an independent quality using the ref() function. Some smoothing formulas already have a sensitivity adjustment, these will not necessarily behave in the same manner as the LagReducing factor used below. Optimizing all parameters for best results is recommended.

The Lag-Reducing formula presented here can be applied to most averaging formulas and to indicators that are based on averages (like Bands). The lag reducing parameter (RLFactor) of the Reducelag() function can also be used to make formulas adaptive with respect to another price or Indicator quality. The image below shows how lag has been reduced for the Tilson T3 formula.

To see how this formula works Apply the code show below to a new indicator pane, open the Parameter window, and try  different settings.

function T3PriceT3Periods)
    e1    AMAPrice/ ( T3Periods ) );
    e2    AMAe1/ ( T3Periods ) );
    e3    AMAe2/ ( T3Periods ) );
    e4    AMAe3/ ( T3Periods ) );
    e5    AMAe4/ ( T3Periods ) );
    e6    AMAe5/ ( T3Periods ) );
    C1 = -3;
    C2 * ( );
    C3 = -* ( ) ^ 2;
    C4 = ( ) ^ 3;
    T3Result c1 e6 c2 e5 c3 e4 c4 e3;
    return NzT3Result );

function ReduceLagIndicatorRLFactor )
    return ( Indicator RefIndicator, -) ) ^ RLFactor*Indicator;

LRFactor         Param"Lag-Reducing Factor"1.70100.1 );
Periods         Param"T3 Periods"5110);
Sensitivity        Param"T3 Sensitivity 1"0.7030.03 );

I1 T3OPeriodsSensitivity );
I2 ReducelagI1LRFactor );

PlotC"Close"1128 );
PlotI1"\nBasic T3"2);
PlotI2"\nLag-Reduced T3"4styleNoRescale );

MACD Histograms (v1)

Plotting Gap Prices

This indicator program was developed for the trader who wishes to plot opening gaps to aid his identification of where gaps occur in a price chart. The gaps are drawn as horizontal lines (green upper, red lower) extending a variable number of bars to the right of the gap.


The code hasn’t been optimized so that you can use the variables in subsequent code. While AFL has GapUp() and GapDown() functions the code below uses custom definitions to allow substitution of other criteria.