Stock Portfolio Organizer

The ultimate porfolio management solution.

Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
For Portfolio Manager Click Here

WiseTrader Toolbox

#1 Selling Amibroker Plugin featuring:

Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
Find Out More Here

edakads improved code for Amibroker (AFL)

Copy & Paste Friendly
/*                     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). 
I left all calculations by the original author as they were. I only improved 
the visualisation of the patterns now not just drawing the last pattern.

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" );
            }

            if( BullCrab[i] AND bu AND dCrab )
            {
                drawBullishPattern( i, "Bullish Crab" );
            }

            if( BullBat[i] AND bu AND dBat )
            {
                drawBullishPattern( i, "Bullish Bat" );
            }

            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" );
            }

            if( BearCrab[i] AND be AND dCrab )
            {
                drawBearishPattern( i, "Bearish Crab" );
            }

            if( BearBat[i] AND be AND dBat )
            {
                drawBearishPattern( i, "Bearish Bat" );
            }

            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 );
Back