Monday, 21 October 2019

Pin Bar Candlestick Pattern Detector for Amibroker (AFL)

A pin bar pattern consists of one price bar, typically a candlestick price bar, which represents a sharp reversal and rejection of price. The pin bar reversal as it is sometimes called, is defined by a long tail, the tail is also referred to as a “shadow” or “wick”. The area between the open and close of the pin bar is called its “real body”, and pin bars generally have small real bodies in comparison to their long tails.
The tail of the pin bar shows the area of price that was rejected, and the implication is that price will continue to move opposite to the direction the tail points. Thus, a bearish pin bar signal is one that has a long upper tail, showing rejection of higher prices with the implication that price will fall in the near-term. A bullish pin bar signal has a long lower tail, showing rejection of lower prices with the implication that price will rise in the near-term.


_SECTION_BEGIN( "Pin Bar AFL" );

SetBarsRequired( 100000, 0 );

GraphXSpace = 15;

SetChartOptions( 0, chartShowArrows | chartShowDates );

SetChartBkColor( ParamColor( "bkcolor", ColorRGB( 0, 0, 0 ) ) );

GfxSetBkMode( 0 );

GfxSetOverlayMode( 1 );

SetBarFillColor( IIf( C > O, ParamColor( "Candle UP Color", colorGreen ), IIf( C <= O, ParamColor( "Candle Down Color", colorRed ), colorLightGrey ) ) );

Plot( C, "\nPrice", IIf( C > O, ParamColor( "Wick UP Color", colorDarkGreen ), IIf( C <= O, ParamColor( "Wick Down Color", colorDarkRed ), colorLightGrey ) ), 64, 0, 0, 0, 0 );

dec = ( Param( "Decimals", 2, 0, 7, 1 ) / 10 ) + 1;
Title = EncodeColor( 55 ) +  Title = Name() + "     " + EncodeColor( 32 ) + Date() +
                                     "      " + EncodeColor( 5 ) + "{{INTERVAL}}  " +
                                     EncodeColor( 55 ) + "     Open = " + EncodeColor( 52 ) + WriteVal( O, dec ) +
                                     EncodeColor( 55 ) + "     High = " + EncodeColor( 5 ) + WriteVal( H, dec ) +
                                     EncodeColor( 55 ) + "      Low = " + EncodeColor( 32 ) + WriteVal( L, dec ) +
                                     EncodeColor( 55 ) + "    Close = " + EncodeColor( 52 ) + WriteVal( C, dec ) +
                                     EncodeColor( 55 ) + "    Volume = " + EncodeColor( 52 ) + WriteVal( V, 1 );


MaxNoseBodySize = 0.33; // Max. Body / Candle length ratio of the Nose Bar
NoseBodyPosition = 0.4; // Body position in Nose Bar (e.g. top/bottom 40%)
LeftEyeOppositeDirection = True; // true = Direction of Left Eye Bar should be opposite to pattern (bearish bar for bullish Pinbar pattern and vice versa)
NoseSameDirection = False; // true = Direction of Nose Bar should be the same as of pattern (bullish bar for bullish Pinbar pattern and vice versa)
NoseBodyInsideLeftEyeBody = False; // true = Nose Body should be contained inside Left Eye Body
LeftEyeMinBodySize = 0.1; // Min. Body / Candle length ratio of the Left Eye Bar
NoseProtruding = 0.5; // Minmum protrusion of Nose Bar compared to Nose Bar length
NoseBodyToLeftEyeBody = 1; // Maximum relative size of the Nose Bar Body to Left Eye Bar Body
NoseLengthToLeftEyeLength = 0; // Minimum relative size of the Nose Bar Length to Left Eye Bar Length
LeftEyeDepth = 0.2; // Minimum relative depth of the Left Eye to its length; depth is difference with Nose's back

up = down = 0;
point = 0.1;
blpin = brpin = False;

for( i = 1; i < BarCount; i++ )
{

    NoseLength = High[i] - Low[i];

    if( NoseLength == 0 ) NoseLength = Point;

    LeftEyeLength = High[i - 1] - Low[i - 1];

    if( LeftEyeLength == 0 ) LeftEyeLength = Point;

    NoseBody = abs( Open[i] - Close[i] );

    if( NoseBody == 0 ) NoseBody = point;

    LeftEyeBody = abs( Open[i - 1] - Close[i - 1] );

    if( LeftEyeBody == 0 ) LeftEyeBody = point;

    // Bearish Pinbar
    if( High[i] - High[i - 1] >= NoseLength * NoseProtruding ) // Nose protrusion
    {
        if( NoseBody / NoseLength <= MaxNoseBodySize ) // Nose body to candle length ratio
        {
            if( 1 - ( High[i] - Max( Open[i], Close[i] ) ) / NoseLength < NoseBodyPosition ) // Nose body position in bottom part of the bar
            {
                if( ( !LeftEyeOppositeDirection ) || ( Close[i - 1] > Open[i - 1] ) ) // Left Eye bullish if required
                {
                    if( ( !NoseSameDirection ) || ( Close[i] < Open[i] ) ) // Nose bearish if required
                    {
                        if( LeftEyeBody / LeftEyeLength  >= LeftEyeMinBodySize ) // Left eye body to candle length ratio
                        {
                            if( ( Max( Open[i], Close[i] ) <= High[i - 1] ) && ( Min( Open[i], Close[i] ) >= Low[i - 1] ) ) // Nose body inside Left Eye bar
                            {
                                if( NoseBody / LeftEyeBody <= NoseBodyToLeftEyeBody ) // Nose body to Left Eye body ratio
                                {
                                    if( NoseLength / LeftEyeLength >= NoseLengthToLeftEyeLength ) // Nose length to Left Eye length ratio
                                    {
                                        if( Low[i] - Low[i - 1] >= LeftEyeLength * LeftEyeDepth ) // Left Eye low is low enough
                                        {
                                            if( ( !NoseBodyInsideLeftEyeBody ) || ( ( Max( Open[i], Close[i] ) <= Max( Open[i - 1], Close[i - 1] ) ) && ( Min( Open[i], Close[i] ) >= Min( Open[i - 1], Close[i - 1] ) ) ) ) // Nose body inside Left Eye body if required
                                            {
                                                Down[i] = High[i] + 5 * Point + NoseLength / 5;
                                                brpin[i] = True;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    // Bullish Pinbar
    if( Low[i - 1] - Low[i] >= NoseLength * NoseProtruding ) // Nose protrusion
    {
        if( NoseBody / NoseLength <= MaxNoseBodySize ) // Nose body to candle length ratio
        {
            if( 1 - ( Min( Open[i], Close[i] ) - Low[i] ) / NoseLength < NoseBodyPosition ) // Nose body position in top part of the bar
            {
                if( ( !LeftEyeOppositeDirection ) || ( Close[i - 1] < Open[i - 1] ) ) // Left Eye bearish if required
                {
                    if( ( !NoseSameDirection ) || ( Close[i] > Open[i] ) ) // Nose bullish if required
                    {
                        if( LeftEyeBody / LeftEyeLength >= LeftEyeMinBodySize ) // Left eye body to candle length ratio
                        {
                            if( ( Max( Open[i], Close[i] ) <= High[i - 1] ) && ( Min( Open[i], Close[i] ) >= Low[i - 1] ) ) // Nose body inside Left Eye bar
                            {
                                if( NoseBody / LeftEyeBody <= NoseBodyToLeftEyeBody ) // Nose body to Left Eye body ratio
                                {
                                    if( NoseLength / LeftEyeLength >= NoseLengthToLeftEyeLength ) // Nose length to Left Eye length ratio
                                    {
                                        if( High[i - 1] - High[i] >= LeftEyeLength * LeftEyeDepth ) // Left Eye high is high enough
                                        {
                                            if( ( !NoseBodyInsideLeftEyeBody ) || ( ( Max( Open[i], Close[i] ) <= Max( Open[i - 1], Close[i - 1] ) ) && ( Min( Open[i], Close[i] ) >= Min( Open[i - 1], Close[i - 1] ) ) ) ) // Nose body inside Left Eye body if required
                                            {
                                                Up[i] = Low[i] - 5 * Point - NoseLength / 5;
                                                blpin[i] = True;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

for( i = 1; i < BarCount; i++ )
{
    if( blpin[i] ) PlotText( "bull.pin " , i, L[ i ] - 2.5, colorLime );

    if( brpin[i] ) PlotText( " bear pin" , i, H[ i ] + 2.5, colorOrange );
}

PlotShapes( shapeHollowSmallSquare*brpin, 4, 0, H , 5 );
PlotShapes( shapeHollowSmallSquare*blpin, 5, 0, L , -5 );

Filter = brpin OR blpin;
AddColumn( brpin, "Bearish Pin", 1.2 );
AddColumn( blpin, "Bullish Pin", 1.2 );

_SECTION_END();

No comments:

Post a Comment

Thanks