// Downloaded From https://www.WiseStockTrader.com
/*                     HARMONIC PATTERN DETECTION

Automatic Detection of Harmonic Patterns - Gartley, Bat, Butterfly and Crab.

Zig Zag is not used in this AFL. It is based on fractals

Contact - joy.edakad@gmail.com

Modernized by E.M.Pottasch (Dec 2016).
- All calculations by the original author left as they were.
- Improved visualisation of the patterns.

The code I used is the original code from:
http://www.inditraders.com/amibroker/1934-afl-harmonic-patterns.html
file: Harmonic1.1.afl (2009)
*/
Version( 6.0 );

x = BarIndex();
fvb = FirstVisibleValue( x );
lvb = LastVisibleValue( x );
GfxSetCoordsMode( 1 );
GfxSetOverlayMode( 1 );

_SECTION_BEGIN( "Price" );
SetChartOptions( 0, chartShowArrows | chartShowDates );
SetChartBkColor( colorBlack );
_N( Title = StrFormat( "{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ) );
Plot( C, "Close", ParamColor( "Color", colorBlack ), styleNoTitle | ParamStyle( "Style" ) | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN( "Patterns" );
strength = Param( "Strength", 5, 2, 15, 1 );
plotFractals = ParamToggle( "Plot Fractals", "Off|On", 0 );
bu = ParamToggle( "Bullish Pattern", "Off|On", 1 );
be = ParamToggle( "Bearish Pattern", "Off|On", 1 );
dBat = ParamToggle( "Draw Bat", "Off|On", 1 );
dBut = ParamToggle( "Draw Buterfly", "Off|On", 1 );
dCrab = ParamToggle( "Draw Crab", "Off|On", 1 );
dGart = ParamToggle( "Draw Gartley", "Off|On", 1 );
_SECTION_END();

_SECTION_BEGIN( "Gartley" );
GBmin = Param( "Swing B Min.", 0.55, 0.3, 1, 0.01 );
GBmax = Param( "Swing B Max.", 0.72, 0.4, 1, 0.01 );
GCmin = Param( "Swing C Min.", 0.38, 0.3, 1.27, 0.01 );
GCmax = Param( "Swing C Max.", 1.0, 0.4, 1.27, 0.01 );
GDmin = Param( "Swing D Min.(XA)", 0.55, 0.3, 1, 0.01 );
GDmax = Param( "Swing D Max.(XA)", 1.0, 0.4, 1.0, 0.01 );
_SECTION_END();

_SECTION_BEGIN( "Bat" );
BatBmin = Param( "Swing B Min.", 0.38, 0.3, 1, 0.01 );
BatBmax = Param( "Swing B Max.", 0.55, 0.4, 1, 0.01 );
BatCmin = Param( "Swing C Min.", 0.38, 0.3, 1.62, 0.01 );
BatCmax = Param( "Swing C Max.", 1.27, 0.4, 1.62, 0.01 );
BatDmin = Param( "Swing D Min.(XA)", 0.5, 0.3, 1, 0.01 );
BatDmax = Param( "Swing D Max.(XA)", 1.0, 0.4, 1.0, 0.01 );
_SECTION_END();

_SECTION_BEGIN( "Butterfly" );
BtBmin = Param( "Swing B Min.", 0.55, 0.3, 1, 0.01 );
BtBmax = Param( "Swing B Max.", 0.9, 0.4, 1, 0.01 );
BtCmin = Param( "Swing C Min.", 0.38, 0.3, 1.62, 0.01 );
BtCmax = Param( "Swing C Max.", 1.27, 0.4, 1.62, 0.01 );
BtDmin = Param( "Swing D Min.(XA)", 1, 1, 1.8, 0.01 );
BtDmax = Param( "Swing D Max.(XA)", 1.38, 1, 1.8, 0.01 );
_SECTION_END();

_SECTION_BEGIN( "Crab" );
CBmin = Param( "Swing B Min.", 0.38, 0.3, 1, 0.01 );
CBmax = Param( "Swing B Max.", 0.65, 0.4, 1, 0.01 );
CCmin = Param( "Swing C Min.", 0.38, 0.3, 1.62, 0.01 );
CCmax = Param( "Swing C Max.", 1.270, 0.4, 1.62, 0.01 );
CDmin = Param( "Swing D Min.(XA)", 1.25, 1, 1.8, 0.01 );
CDmax = Param( "Swing D Max.(XA)", 1.8, 1, 2, 0.01 );
_SECTION_END();


bi = Cum( 1 ) - 1;

function GetTop( bars )
{
    Top = H == HHV( H, 2 * bars ) AND Ref( HHV( H, bars ), bars ) < H;
    Top = Top AND LastValue( bi ) - ValueWhen( Top, bi ) > bars;
    return Top;
}

function GetValley( bars )
{
    Valley = L == LLV( L, 2 * bars ) AND Ref( LLV( L, bars ), bars ) > L;
    Valley = Valley AND LastValue( bi ) - ValueWhen( Valley, bi ) > bars;
    return Valley;
}

// Build fractals array
P1 = GetTop( strength );
V1 = GetValley( Strength );

P1 = IIf( P1, IIf( ValueWhen( P1, bi, 2 ) < ValueWhen( V1, bi ), P1, IIf( ValueWhen( P1, H, 2 ) > H, False, P1 ) ), P1 );
P1 = IIf( P1 AND ValueWhen( P1, bi, 0 ) > bi, IIf( ValueWhen( P1, bi, 0 ) < ValueWhen( V1, bi, 0 ), IIf( ValueWhen( P1, H, 0 ) >= H, False, P1 ), P1 ), P1 );
V1 = IIf( V1, IIf( ValueWhen( V1, bi, 2 ) < ValueWhen( P1, bi ), V1, IIf( ValueWhen( V1, L, 2 ) < L, False, V1 ) ), V1 );
V1 = IIf( V1 AND ValueWhen( V1, bi, 0 ) > bi , IIf( ValueWhen( V1, bi, 0 ) < ValueWhen( P1, bi, 0 ), IIf( ValueWhen( V1, L, 0 ) <= L, False, V1 ), V1 ), V1 );

P1H1 = ValueWhen( P1, H );
P1Bar1 = ValueWhen( P1, bi );
P1H2 = ValueWhen( P1, H, 2 );
P1Bar2 = ValueWhen( P1, bi, 2 );
V1L1 = ValueWhen( V1, L );
V1Bar1 = ValueWhen( V1, bi );
V1L2 = ValueWhen( V1, L, 2 );
V1Bar2 = ValueWhen( V1, bi, 2 );

//Bullish Patterns
PTvalid = ( P1Bar1 > V1Bar1 AND V1Bar1 > P1Bar2 AND P1bar2 > V1Bar2 ) AND P1; // Peaks and troughs are in order

// 4 swings of developing Gartley/Bat etc.
BullGartley4 = PTvalid AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) > GBmin AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) < GBmax
               AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) > GCMin AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) < GCMax;

BullBat4 = PTvalid AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) > BatBmin AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) < BatBmax
           AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) > BatCMin AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) < BatCMax;

BullButterfly4 = PTvalid AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) > BtBmin AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) < BtBMax
                 AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) > BtCmin AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) < BtCmax;

BullCrab4 = PTvalid AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) > CBmin AND( P1H2 - V1L1 ) / ( P1H2 - V1L2 ) < CBmax
            AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) > CCmin AND( P1H1 - V1L1 ) / ( P1H2 - V1L1 ) < CCmax;


// Bullish Gartley/Bat found. D retacement level is not evaluated
BullGartley = IIf( LowestSince( BullGartley4, L ) < ValueWhen( BullGartley4, P1H2 ) - ( ValueWhen( BullGartley4, P1H2 ) - ValueWhen( BullGartley4, V1L2 ) ) * GDmin AND
                   LowestSince( bullGartley4, L ) > ValueWhen( BullGartley4, P1H2 ) - ( ValueWhen( BullGartley4, P1H2 ) - ValueWhen( BullGartley4, V1L2 ) ) * GDmax AND
                   HighestSince( BullGartley4, H ) <= ValueWhen( BullGartley4, P1H1 ) AND
                   LowestSince( bullGartley4, L ) == L, True, False );
BullGartley = BullGartley AND LowestSince( BullGartley4, L ) < ValueWhen( BullGartley4, V1L1 );

BullBat = IIf( LowestSince( BullBat4, L ) < ValueWhen( BullBat4, P1H2 ) - ( ValueWhen( BullBat4, P1H2 ) - ValueWhen( BullBat4, V1L2 ) ) * BatDmin AND
               LowestSince( BullBat4, L ) > ValueWhen( BullBat4, P1H2 ) - ( ValueWhen( BullBat4, P1H2 ) - ValueWhen( BullBat4, V1L2 ) ) * BatDmax AND
               HighestSince( BullBat4, H ) <= ValueWhen( BullBat4, P1H1 ) AND
               LowestSince( BullBat4, L ) == L, True, False );
BullBat = BullBat AND LowestSince( BullCrab4, L ) < ValueWhen( BullCrab4, V1L1 );


BullCrab = IIf( LowestSince( BullCrab4, L ) < ValueWhen( BullCrab4, P1H2 ) - ( ValueWhen( BullCrab4, P1H2 ) - ValueWhen( BullCrab4, V1L2 ) ) * CDmin AND
                LowestSince( BullCrab4, L ) > ValueWhen( BullCrab4, P1H2 ) - ( ValueWhen( BullCrab4, P1H2 ) - ValueWhen( BullCrab4, V1L2 ) ) * CDmax AND
                HighestSince( BullCrab4, H ) <= ValueWhen( BullCrab4, P1H1 ) AND
                LowestSince( bullGartley4, L ) == L, True, False );
BullCrab = BullCrab AND LowestSince( BullCrab4, L ) < ValueWhen( BullCrab4, V1L2 );


BullButterfly = IIf( LowestSince( BullButterfly4, L ) < ValueWhen( BullButterfly4, P1H2 ) - ( ValueWhen( BullButterfly4, P1H2 ) - ValueWhen( BullButterfly4, V1L2 ) ) * BtDMin AND
                     LowestSince( BullButterfly4, L ) > ValueWhen( BullButterfly4, P1H2 ) - ( ValueWhen( BullButterfly4, P1H2 ) - ValueWhen( BullButterfly4, V1L2 ) ) * BtDmax AND
                     HighestSince( BullButterfly4, H ) <= ValueWhen( BullButterfly4, P1H1 ) AND
                     LowestSince( bullButterfly4, L ) == L, True, False );
BullButterfly = BullButterfly AND LowestSince( BullButterfly4, L ) < ValueWhen( BullButterfly4, V1L2 );

// to remove redumbdent lines
BullHar4 = BullGartley4 OR BullButterfly4 OR BullBat4 OR BullCrab4 ;
BullHar = BullGartley OR BullButterfly OR BullBat OR BullCrab ;

//Point4 = IIf(BullHar,ValueWhen(BullHar4,bi),Null);
//BullHar = IIf(BullHar, IIf(Point4 == ValueWhen(BullHar,point4,0) AND ValueWhen(BullHar,bi,0) > bi ,False,BullHar),BullHar);

X = ValueWhen( BullHar4, V1L2 );
Xbar = ValueWhen( BullHar4, V1Bar2 );
A = ValueWhen( BullHar4, P1H2 );
Abar = ValueWhen( BullHar4, P1bar2 );
B = ValueWhen( BullHar4, V1L1 );
Bbar = ValueWhen( BullHar4, V1bar1 );
C1 = ValueWhen( BullHar4, P1H1 );
C1bar = ValueWhen( BullHar4, P1bar1 );
D = ValueWhen( BullHar, L );
Dbar = ValueWhen( BullHar, bi );

ABdXA = ( A - B ) / ( A - X );
BCdAB = ( C1 - B ) / ( A - B );
ADdXA = ( A - D ) / ( A - X );
BCdCD = ( C1 - D ) / ( C1 - B );
//PlotPattern = Dbar > C1bar;

function drawBullishPattern( i, patternName )
{
    GfxSelectSolidBrush( ColorRGB( 0, 0, 50 ) );
    GfxSetBkColor( colorBlack );
    GfxSelectPen( ColorRGB( 0, 0, 255 ), 2, 0 );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Abar[i], A[i] );
    GfxMoveTo( Abar[i], A[i] );
    GfxLineTo( Bbar[i], B[i] );
    GfxMoveTo( Bbar[i], B[i] );
    GfxLineTo( C1bar[i], C1[i] );
    GfxMoveTo( C1bar[i], C1[i] );
    GfxLineTo( Dbar[i], D[i] );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Abar[i], A[i] );

    GfxSelectPen( ColorRGB( 0, 0, 255 ), 1, 2 );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Bbar[i], B[i] );
    GfxMoveTo( Abar[i], A[i] );
    GfxLineTo( C1bar[i], C1[i] );
    GfxMoveTo( Bbar[i], B[i] );
    GfxLineTo( Dbar[i], D[i] );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Dbar[i], D[i] );

    GfxPolygon( Xbar[i], X[i], Abar[i], A[i], Bbar[i], B[i], C1bar[i], C1[i], Dbar[i], D[i], Bbar[i], B[i], Xbar[i], X[i] );

    GfxSetTextColor( ColorRGB( 0, 0, 255 ) );
    GfxSelectFont( "Helvetica", 10, 700 );
    GfxTextOut( patternName, C1bar[i] + 3, C1[i] );

    GfxSelectFont( "Helvetica", 8, 700 );
    GfxTextOut( "" + Prec( ABdXA[i], 2 ), ( Bbar[i] + Xbar[i] ) / 2, ( B[i] + X[i] ) / 2 );
    GfxTextOut( "" + Prec( BCdAB[i], 2 ), ( C1bar[i] + Abar[i] ) / 2, ( C1[i] + A[i] ) / 2 );
    GfxTextOut( "" + Prec( ADdXA[i], 2 ), ( Dbar[i] + Xbar[i] ) / 2, ( D[i] + X[i] ) / 2 );
    GfxTextOut( "" + Prec( BCdCD[i], 2 ), ( Bbar[i] + Dbar[i] ) / 2, ( B[i] + D[i] ) / 2 );
}
function drawBullishPatterns()
{
    flag1 = 1;
    flag2 = 0;

    for( i = lvb; i > fvb; i-- )
    {
        if( BullHar[i] AND flag1 )
        {
            flag1 = 0;
            flag2 = 1;

            if( BullButterfly[i] AND bu AND dBut )
            {
                drawBullishPattern( i, "Bullish Butterfly" );
            }
            else
                if( BullCrab[i] AND bu AND dCrab )
                {
                    drawBullishPattern( i, "Bullish Crab" );
                }
                else
                    if( BullBat[i] AND bu AND dBat )
                    {
                        drawBullishPattern( i, "Bullish Bat" );
                    }
                    else
                        if( BullGartley[i] AND bu AND dGart )
                        {
                            drawBullishPattern( i, "Bullish Gartley" );
                        }
        }

        if( BullHar4[i] AND flag2 )
        {
            flag1 = 1;
            flag2 = 0;
        }
    }
}
drawBullishPatterns();
//PlotShapes( shapeHollowSmallDownTriangle*BullHar4, colorBlue, O, H, -15 );
//PlotShapes( shapeSmallCircle*BullHar, colorYellow, O, L, -10 );

// Bearish Patterns
PTvalid = ( V1Bar1 > P1Bar1 AND P1Bar1 > V1Bar2 AND V1Bar2 > P1Bar2 ) AND V1;

// Swing 4
BearGartley4 = PTvalid AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) > GBmin AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) < GBmax AND
               ( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) > GCmin AND( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) < GCmax;

BearBat4 = PTvalid AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) > BatBmin AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) < BatBmax AND
           ( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) > BatCmin AND( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) < BatCmax;

BearButterfly4 = PTvalid AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) > BtBmin AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) < BtBmax AND
                 ( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) > BtCmin AND( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) < BtCmax;

BearCrab4 = PTvalid AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) > CBmin AND( P1H1 - V1L2 ) / ( P1H2 - V1L2 ) < CBmax AND
            ( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) > CCmin AND( P1H1 - V1L1 ) / ( P1H1 - V1L2 ) < CCmax;

// Poin D
BearGartley = IIf( HighestSince( bearGartley4, H ) > ValueWhen( BearGartley4, V1L2 ) + ( ValueWhen( BearGartley4, P1H2 ) - ValueWhen( BearGartley4, V1L2 ) ) * GDmin AND
                   HighestSince( bearGartley4, H ) < ValueWhen( BearGartley4, V1L2 ) + ( ValueWhen( BearGartley4, P1H2 ) - ValueWhen( BearGartley4, V1L2 ) ) * GDMax AND
                   LowestSince( BearGartley4, L ) >= ValueWhen( BearGartley4, V1L1 ) AND
                   HighestSince( BearGartley4, H ) == H, True, False );
BearGartley = BearGartley AND HighestSince( BearGartley4, H ) > ValueWhen( BearGartley4, P1H1 );

BearBat = IIf( ( HighestSince( BearBat4, H ) > ValueWhen( BearBat4, V1L2 ) + ( ValueWhen( BearBat4, P1H2 ) - ValueWhen( BearBat4, V1L2 ) ) * BatDmin AND
                 HighestSince( BearBat4, H ) < ValueWhen( BearBat4, V1L2 ) + ( ValueWhen( BearBat4, P1H2 ) - ValueWhen( BearBat4, V1L2 ) ) * BatDMax AND
                 LowestSince( BearBat4, L ) >= ValueWhen( BearBat4, V1L1 ) AND
                 HighestSince( BearBat4, H ) == H ), True, False );
BearBat = BearBat AND HighestSince( BearBat4, H ) > ValueWhen( BearBat4, P1H1 );

BearButterfly = IIf( HighestSince( BearButterfly4, H ) > ValueWhen( BearButterfly4, V1L2 ) + ( ValueWhen( BearButterfly4, P1H2 ) - ValueWhen( BearButterfly4, V1L2 ) ) * BtDmin AND
                     HighestSince( BearButterfly4, H ) < ValueWhen( BearButterfly4, V1L2 ) + ( ValueWhen( BearButterfly4, P1H2 ) - ValueWhen( BearButterfly4, V1L2 ) ) * BtDMax AND
                     LowestSince( BearButterfly4, L ) >= ValueWhen( BearButterfly4, V1L1 ) AND
                     HighestSince( BearButterfly4, H ) == H, True, False );
BearButterfly = BearButterfly AND HighestSince( BearButterfly4, H ) > ValueWhen( BearButterfly4, P1H2 );

BearCrab = IIf( HighestSince( BearCrab4, H ) > ValueWhen( BearCrab4, V1L2 ) + ( ValueWhen( BearCrab4, P1H2 ) - ValueWhen( BearCrab4, V1L2 ) ) * CDmin AND
                HighestSince( BearCrab4, H ) < ValueWhen( BearCrab4, V1L2 ) + ( ValueWhen( BearCrab4, P1H2 ) - ValueWhen( BearCrab4, V1L2 ) ) * CDMax AND
                LowestSince( BearCrab4, L ) >= ValueWhen( BearCrab4, V1L1 ) AND
                HighestSince( BearCrab4, H ) == H, True, False );
BearCrab = BearCrab AND HighestSince( BearCrab4, H ) > ValueWhen( BearCrab4, P1H2 );


BearHar4 = BearGartley4 OR BearButterfly4 OR BearBat4 OR BearCrab4 ;
BearHar = BearGartley OR BearButterfly OR BearBat OR BearCrab ;

//Point4 = IIf( BearHar, ValueWhen( BearHar4, bi ), Null );
//BearHar = IIf( BearHar, IIf( Point4 == ValueWhen( BearHar, point4, 0 ) AND ValueWhen( BearHar, bi, 0 ) > bi , False, BearHar ), BearHar );

X = ValueWhen( BearHar4, P1H2 );
Xbar = ValueWhen( BearHar4, P1Bar2 );
A = ValueWhen( BearHar4, V1L2 );
Abar = ValueWhen( BearHar4, V1bar2 );
B = ValueWhen( BearHar4, P1H1 );
Bbar = ValueWhen( BearHar4, P1bar1 );
C1 = ValueWhen( BearHar4, V1L1 );
C1bar = ValueWhen( BearHar4, V1bar1 );
D = ValueWhen( BearHar, H );
Dbar = ValueWhen( BearHar, bi );

ABdXA = ( B - A ) / ( X - A );
BCdAB = ( B - C1 ) / ( B - A );
ADdXA = ( D - A ) / ( X - A );
BCdCD = ( D - C1 ) / ( B - C1 );
//PlotPattern = Dbar > C1bar;

function drawBearishPattern( i, patternName )
{
    GfxSelectSolidBrush( ColorRGB( 50, 0, 0 ) );
    GfxSetBkColor( colorBlack );
    GfxSelectPen( ColorRGB( 255, 0, 0 ), 2, 0 );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Abar[i], A[i] );
    GfxMoveTo( Abar[i], A[i] );
    GfxLineTo( Bbar[i], B[i] );
    GfxMoveTo( Bbar[i], B[i] );
    GfxLineTo( C1bar[i], C1[i] );
    GfxMoveTo( C1bar[i], C1[i] );
    GfxLineTo( Dbar[i], D[i] );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Abar[i], A[i] );

    GfxSelectPen( ColorRGB( 255, 0, 0 ), 1, 2 );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Bbar[i], B[i] );
    GfxMoveTo( Abar[i], A[i] );
    GfxLineTo( C1bar[i], C1[i] );
    GfxMoveTo( Bbar[i], B[i] );
    GfxLineTo( Dbar[i], D[i] );
    GfxMoveTo( Xbar[i], X[i] );
    GfxLineTo( Dbar[i], D[i] );

    GfxPolygon( Xbar[i], X[i], Abar[i], A[i], Bbar[i], B[i], C1bar[i], C1[i], Dbar[i], D[i], Bbar[i], B[i], Xbar[i], X[i] );

    GfxSetTextColor( ColorRGB( 255, 0, 0 ) );
    GfxSelectFont( "Helvetica", 10, 700 );
    GfxTextOut( patternName, C1bar[i] + 3, C1[i] );

    GfxSelectFont( "Helvetica", 8, 700 );
    GfxTextOut( "" + Prec( ABdXA[i], 2 ), ( Bbar[i] + Xbar[i] ) / 2, ( B[i] + X[i] ) / 2 );
    GfxTextOut( "" + Prec( BCdAB[i], 2 ), ( C1bar[i] + Abar[i] ) / 2, ( C1[i] + A[i] ) / 2 );
    GfxTextOut( "" + Prec( ADdXA[i], 2 ), ( Dbar[i] + Xbar[i] ) / 2, ( D[i] + X[i] ) / 2 );
    GfxTextOut( "" + Prec( BCdCD[i], 2 ), ( Bbar[i] + Dbar[i] ) / 2, ( B[i] + D[i] ) / 2 );
}
function drawBearishPatterns()
{
    flag1 = 1;
    flag2 = 0;

    for( i = lvb; i > fvb; i-- )
    {
        if( BearHar[i] AND flag1 )
        {
            flag1 = 0;
            flag2 = 1;

            if( BearButterfly[i] AND be AND dBut )
            {
                drawBearishPattern( i, "Bearish Butterfly" );
            }
            else
                if( BearCrab[i] AND be AND dCrab )
                {
                    drawBearishPattern( i, "Bearish Crab" );
                }
                else
                    if( BearBat[i] AND be AND dBat )
                    {
                        drawBearishPattern( i, "Bearish Bat" );
                    }
                    else
                        if( BearGartley[i] AND be AND dGart )
                        {
                            drawBearishPattern( i, "Bearish Gartley" );
                        }
        }

        if( BearHar4[i] AND flag2 )
        {
            flag1 = 1;
            flag2 = 0;
        }
    }
}
drawBearishPatterns();

if( PlotFractals )
{
    PlotShapes( shapeSmallCircle * P1, colorRed, 0, H, 10 );
    PlotShapes( shapeSmallCircle * V1, colorBlue, O, L, -10 );
}

//PlotShapes( shapeHollowSmallUpTriangle*BearHar4, colorRed, O, L, -15 );
//PlotShapes( shapeSmallCircle*BearHar, colorYellow, O, H, 10 );