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

all-pattern-bullish-and-bearish for Amibroker (AFL)

Copy & Paste Friendly
// asfatul.alam@yahoo.com

nBars = Param("Number of bars", 12, 5, 40);
bTrace = Param("Include trace output", 1, 0, 1);
nNoPivsInSetup = Param("No. Pivs in Setup", 4, 3, 4, 1);
bShowTCZ = Param("Show TCZ", 1, 0, 1); 
nMinBarsBtwPivs = Param("Min. number of bars btw. pivots", 1, 1, 10, 1);
nMinPctBtwPivs = Param("Min. percent diff. btw. pivots", .05, .04, .2, .01);
bLastBarCanBePiv = Param("Last bar can be a pivot", 1, 0, 1); 
retrcTolerance = .01;
tczTolerance = .005;
nNumBarsToScan = 120;


nExploreBarIdx = 0;
nExploreDate = 0;
nCurDateNum = 0;
DN = DateNum();
DT = DateTime();


bTCZLong = False;
bTCZShort = False;
nAnchorPivIdx = 0;

ADX8 = ADX(8);



if(Status("action")==1) {
    bDraw = True;
    bUseLastVis = Param("Use last visible bar", 1, 0, 1);
} else {
    bDraw = False;
    bUseLastVis = False;
    bTrace = False;
    nExploreDate = Status("rangetodate");
    for (i=LastValue(BarIndex());i>=0;i--) {
        nCurDateNum = DN[i];
        if (nCurDateNum == nExploreDate) {
            nExploreBarIdx = i;
        }
    }

}

GraphXSpace=7;


PlotOHLC(Open, High, Low, Close, 
    "BIdx = " + BarIndex() + 
    "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L  = " + L
    + "\n"+"C ",
    colorBlack, styleCandle); 

if (bDraw) {
    Plot(MA(C, 21), "21 bar MA", colorAqua, 
        styleLine+styleNoRescale+styleNoLabel);
    Plot(MA(C, 55), "55 bar MA", colorGreen, 
        styleLine+styleNoRescale+styleNoLabel);
    Plot(MA(C, 233), "233 bar MA", colorDarkRed,  styleLine+styleNoRescale+styleNoLabel);
   
}


aHPivs = H - H;
aLPivs = L - L;
aHPivHighs = H - H;
aLPivLows = L - L;
aHPivIdxs = H - H;
aLPivIdxs = L - L;
aAddedHPivs = H - H;
aAddedLPivs = L - L;
aLegVol = H - H;
aRetrcVol = H - H;

nHPivs = 0;
nLPivs = 0;

lastHPIdx = 0;
lastLPIdx = 0;
lastHPH = 0;
lastLPL = 0;
curPivBarIdx = 0;

aHHVBars = HHVBars(H, nBars);
aLLVBars = LLVBars(L, nBars);
aHHV = HHV(H, nBars);
aLLV = LLV(L, nBars);


nLastVisBar = LastValue(
    Highest(IIf(Status("barvisible"), BarIndex(), 0)));

curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar, 
    IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
    LastValue(BarIndex())));

curTrend = "";
if (aLLVBars[curBar] < aHHVBars[curBar]) 
    curTrend = "D";
else
    curTrend = "U";




if (curBar >= nNumBarsToScan) {
    for (i=0; i<nNumBarsToScan; i++) {
     
        
        curBar = IIf(nlastVisBar > 0 AND bUseLastVis, 
            nlastVisBar-i, 
            IIf(Status("action")==4 AND nExploreBarIdx > 0, 
            nExploreBarIdx-i,
            LastValue(BarIndex())-i));


        if (aLLVBars[curBar] < aHHVBars[curBar]) {
     
        
            if (curTrend == "U") {
                curTrend = "D";
             
                curPivBarIdx = curBar - aLLVBars[curBar];
                aLPivs[curPivBarIdx] = 1;
                aLPivLows[nLPivs] = L[curPivBarIdx];
                aLPivIdxs[nLPivs] = curPivBarIdx;
                nLPivs++;
            }

        } else {
            if (curTrend == "D") {
                curTrend = "U";
                curPivBarIdx = curBar - aHHVBars[curBar];
                aHPivs[curPivBarIdx] = 1;
                aHPivHighs[nHPivs] = H[curPivBarIdx];
                aHPivIdxs[nHPivs] = curPivBarIdx;
                nHPivs++;
            }

        }       
     
    } 
}




curBar = 
    IIf(nlastVisBar > 0 AND bUseLastVis, 
    nlastVisBar, 
    IIf(Status("action")==4 AND nExploreBarIdx > 0, 
    nExploreBarIdx,
    LastValue(BarIndex()))
    );


if (nHPivs >= 2 AND nLPivs >= 2) {

    lastLPIdx = aLPivIdxs[0];
    lastLPL = aLPivLows[0];
     
    lastHPIdx = aHPivIdxs[0];
    lastHPH = aHPivHighs[0];
     
    nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
     
    nAddPivsRng = curBar - nLastHOrLPivIdx;
    aLLVAfterLastPiv = LLV(L, nAddPivsRng);  
    nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
    aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);  
    nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
    aHHVAfterLastPiv = HHV(H, nAddPivsRng); 
    nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
    aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng); 
    nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
     

    if (lastHPIdx > lastLPIdx) {
     

        if (aHPivHighs[0] < aHPivHighs[1]) {
     
            if (nLLVAfterLastPiv < aLPivLows[0] AND
                (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
                AND nLLVIdxAfterLastPiv != curBar   ) {
     

                aLPivs[nLLVIdxAfterLastPiv] = 1;
                aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
         
            
                for (j=0; j<nLPivs; j++) {
                    aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
                    aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
                }
                aLPivLows[0] = nLLVAfterLastPiv;
                aLPivIdxs[0] = nLLVIdxAfterLastPiv;
                nLPivs++;
     
          
            }
     

        } else {
     
            if (nLLVAfterLastPiv > aLPivLows[0] AND
                (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
                AND nLLVIdxAfterLastPiv != curBar   ) {
     
         
                aLPivs[nLLVIdxAfterLastPiv] = 1;
                aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
         
          
                for (j=0; j<nLPivs; j++) {
                    aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
                    aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
                }
                aLPivLows[0] = nLLVAfterLastPiv;
                aLPivIdxs[0] = nLLVIdxAfterLastPiv;
                nLPivs++;
     
   
            }   

        }
     
    
    } else {
     
    
        if (aHPivHighs[0] < aHPivHighs[1]) {
     
            if (nHHVAfterLastPiv < aHPivHighs[0] AND
                (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
                AND nHHVIdxAfterLastPiv != curBar   ) {
     
        
                aHPivs[nHHVIdxAfterLastPiv] = 1;
                aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
     
           
                for (j=0; j<nHPivs; j++) {
                    aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
                    aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
                }
                aHPivHighs[0] = nHHVAfterLastPiv;
                aHPivIdxs[0] = nHHVIdxAfterLastPiv;
                nHPivs++;
     
     
            }
     
     
        } else {
     
  
            if (nHHVAfterLastPiv > aHPivHighs[0] AND
                (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
                AND nHHVIdxAfterLastPiv != curBar   ) {
     
                // -- OK, we'll add this as a pivot. 
                //    Mark it for plotting...
                aHPivs[nHHVIdxAfterLastPiv] = 1;
                aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
     
           
                for (j=0; j<nHPivs; j++) {
                    aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
                    aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
                }
                aHPivHighs[0] = nHHVAfterLastPiv;
                aHPivIdxs[0] = nHHVIdxAfterLastPiv;
                nHPivs++;
     
           
            }
     
        }
             
    } 

// -- If there are at least two of each
}

/* ****************************************
// -- Done with finding pivots
***************************************** */

if (bDraw) {

    // -- OK, let's plot the pivots using arrows
    PlotShapes(
        IIf(aHPivs==1, shapeDownArrow, shapeNone), 
            colorRed, 0,    High, Offset=-15);
    PlotShapes(
        IIf(aAddedHPivs==1, shapeDownArrow, shapeNone),
            colorDarkRed, 0, High, Offset=-15);
    PlotShapes(
        IIf(aLPivs==1, shapeUpArrow , shapeNone),       
            colorGreen, 0, Low, Offset=-15);
    PlotShapes(
        IIf(aAddedLPivs==1, shapeUpArrow , shapeNone), 
            colorDarkGreen, 0, Low, Offset=-15);
}

/* ****************************************
// -- Done with discovering and plotting pivots 
***************************************** */

// -- I'm going to want to look for possible retracement
risk = 0;
profInc = 0;
nLeg0Pts = 0;
nLeg0Bars = 0;
nLeg0Vol = 0;
nLeg1Pts = 0;
nLeg1Bars = 0;
nLeg1Vol = 0;
nLegBarsDiff = 0;
nRtrc0Pts = 0;
nRtrc0Bars = 0;
nRtrc0Vol = 0;
nRtrc1Pts = 0;
nRtrc1Bars = 0;
nRtrc1Vol = 0;

minRtrc = 0;
maxRtrc = 0;
minLine = 0;
maxLine = 0;
triggerLine = 0;
firstProfitLine = 0;
triggerInc = 0;
triggerPrc = 0;
firstProfitPrc = 0;
retrcPrc = 0;
retrcBar = 0;
retrcBarIdx = 0;
retrcRng = 0;
aRetrcPrc = H-H;
aRetrcPrcBars = H-H;
aRetrcClose = C;
retrcClose = 0;

// -- Do TCZ calcs. Arrangement of pivs very specific
//    for this setup.
if (nHPivs >= 2 AND
    nLPivs >=2 AND 
    aHPivHighs[0] > aHPivHighs[1] AND
    aLPivLows[0] > aLPivLows[1]) {

    tcz500 = 
    (aHPivHighs[0] -
    (.5 * (aHPivHighs[0] - aLPivLows[1])));

    tcz618 = 
    (aHPivHighs[0] -
    (.618 * (aHPivHighs[0] - aLPivLows[1])));

    tcz786 = 
    (aHPivHighs[0] -
    (.786 * (aHPivHighs[0] - aLPivLows[0])));

    retrcRng = curBar  - aHPivIdxs[0];
    aRetrcPrc = LLV(L, retrcRng);
    retrcPrc = aRetrcPrc[curBar];
    aRetrcPrcBars  = LLVBars(L, retrcRng);
    retrcBarIdx = curBar - aRetrcPrcBars[curBar];
    retrcClose = aRetrcClose[retrcBarIdx];

    // -- bTCZLong setup?
    bTCZLong = (

        // -- Are retracement levels arranged in
        //    tcz order?
        tcz500 >= (tcz786 * (1 - tczTolerance))
        AND
        // .681 is below .786 for long setups
        tcz618 <= (tcz786 * (1 + tczTolerance))
        AND

        // -- Is the low in the tcz range
        // -- Is the close >= low of tcz range
        //    and low <= high of tcz range
        retrcClose >= ((1 - retrcTolerance) *  tcz618)
        AND
        retrcPrc <= ((1 + retrcTolerance) *  tcz500)
        ); 
         
        // -- risk would be high of signal bar minus low of zone
        //risk = 0;

// -- lower highs and lower lows
} else if (nHPivs >= 2 AND nLPivs >=2 
    AND aHPivHighs[0] < aHPivHighs[1] 
    AND aLPivLows[0] < aLPivLows[1]) {

    tcz500 = 
    (aHPivHighs[1] -
    (.5 * (aHPivHighs[1] - aLPivLows[0])));

    tcz618 = 
    (aHPivHighs[0] -
    (.618 * (aHPivHighs[1] - aLPivLows[0])));

    tcz786 = 
    (aHPivHighs[0] -
    (.786 * (aHPivHighs[0] - aLPivLows[0])));

    retrcRng = curBar  - aLPivIdxs[0];
    aRetrcPrc = HHV(H, retrcRng);
    retrcPrc = aRetrcPrc[curBar];
    aRetrcPrcBars  = HHVBars(H, retrcRng);
    retrcBarIdx = curBar - aRetrcPrcBars[curBar];
    retrcClose = aRetrcClose[retrcBarIdx];

    bTCZShort = (
        // -- Are retracement levels arranged in
        //    tcz order?

        // .500 is below .786 for short setups
        tcz500 <= (tcz786 * (1 + tczTolerance))
        AND
        // .681 is above .786 for short setups
        tcz618 >= (tcz786 * (1 - tczTolerance)) 
        AND

        // -- Is the close <= high of tcz range
        //    and high >= low of tcz range
        retrcClose <= ((1 + retrcTolerance) *  tcz618)
        AND
        retrcPrc >= ((1 - retrcTolerance) *  tcz500)
        ); 
         
        // -- Risk would be top of zone - low of signal bar 
        //risk = 0;
}

Filter = (bTCZShort OR bTCZLong);
AddColumn(C, "Close");
AddColumn(IIf(bTCZLong, 76, 83), "L/S", formatChar);




nBars = Param("Number of bars", 12, 5, 40);
bTrace = Param("Include trace output", 1, 0, 1);
nNoPivsInSetup = Param("No. Pivs in Setup", 4, 3, 4, 1);
bShowTCZ = Param("Show TCZ", 1, 0, 1); 
nMinBarsBtwPivs = Param("Min. number of bars btw. pivots", 1, 1, 10, 1);
nMinPctBtwPivs = Param("Min. percent diff. btw. pivots", .05, .04, .2, .01);
bLastBarCanBePiv = Param("Last bar can be a pivot", 1, 0, 1); 
retrcTolerance = .01;
tczTolerance = .005;
nNumBarsToScan = 120;

// -- added from exploration version 20040204
nExploreBarIdx = 0;
nExploreDate = 0;
nCurDateNum = 0;
DN = DateNum();
DT = DateTime();

// -- key exploration variables
bTCZLong = False;
bTCZShort = False;
nAnchorPivIdx = 0;

ADX8 = ADX(8);

// 1 - INDICATOR, 2 - COMMENTARY, 3 - SCAN, 
// 4 - EXPLORATION, 5 - BACKTEST / Optimize 
if(Status("action")==1) {
    bDraw = True;
    bUseLastVis = Param("Use last visible bar", 1, 0, 1);
} else {
    bDraw = False;
    bUseLastVis = False;
    bTrace = False;
    nExploreDate = Status("rangetodate");
    for (i=LastValue(BarIndex());i>=0;i--) {
        nCurDateNum = DN[i];
        if (nCurDateNum == nExploreDate) {
            nExploreBarIdx = i;
        }
    }
// -- if(Status("action")==1...
}

GraphXSpace=7;

// -- basic candle chart
// -- if this appears inside if block, strange
//    drawing results!
PlotOHLC(Open, High, Low, Close, 
    "BIdx = " + BarIndex() + 
    "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L  = " + L
    + "\n"+"C ",
    colorBlack, styleCandle); 

if (bDraw) {
    Plot(MA(C, 21), "21 bar MA", colorAqua, 
        styleLine+styleNoRescale+styleNoLabel);
    Plot(MA(C, 55), "55 bar MA", colorGreen, 
        styleLine+styleNoRescale+styleNoLabel);
    //Plot(MA(C, 233), "233 bar MA", colorDarkRed, 
    //  styleLine+styleNoRescale+styleNoLabel);
}

// -- Create 0-initialized arrays the size of barcount
aHPivs = H - H;
aLPivs = L - L;
aHPivHighs = H - H;
aLPivLows = L - L;
aHPivIdxs = H - H;
aLPivIdxs = L - L;
aAddedHPivs = H - H;
aAddedLPivs = L - L;
aLegVol = H - H;
aRetrcVol = H - H;

nHPivs = 0;
nLPivs = 0;

lastHPIdx = 0;
lastLPIdx = 0;
lastHPH = 0;
lastLPL = 0;
curPivBarIdx = 0;

// -- looking back from the current bar, how many bars 
//    back were the hhv and llv values of the previous 
//    n bars, etc.?
aHHVBars = HHVBars(H, nBars);
aLLVBars = LLVBars(L, nBars);
aHHV = HHV(H, nBars);
aLLV = LLV(L, nBars);

// -- Initialize value of curTrend
nLastVisBar = LastValue(
    Highest(IIf(Status("barvisible"), BarIndex(), 0)));

curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar, 
    IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
    LastValue(BarIndex())));

curTrend = "";
if (aLLVBars[curBar] < aHHVBars[curBar]) 
    curTrend = "D";
else
    curTrend = "U";

// -- Loop through bars. Search for 
//    entirely array-based approach
//    in future version
/* *******************
    Find main pivots
******************* */

// -- Make sure there are enough bars!
if (curBar >= nNumBarsToScan) {
    for (i=0; i<nNumBarsToScan; i++) {
     
        // -- value of curBar dependent on two parameters
        curBar = IIf(nlastVisBar > 0 AND bUseLastVis, 
            nlastVisBar-i, 
            IIf(Status("action")==4 AND nExploreBarIdx > 0, 
            nExploreBarIdx-i,
            LastValue(BarIndex())-i));

        // -- Have we identified a pivot? If trend is down...
        if (aLLVBars[curBar] < aHHVBars[curBar]) {
     
            // ... and had been up, this is a trend change
            if (curTrend == "U") {
                curTrend = "D";
                // -- Capture pivot information
                curPivBarIdx = curBar - aLLVBars[curBar];
                aLPivs[curPivBarIdx] = 1;
                aLPivLows[nLPivs] = L[curPivBarIdx];
                aLPivIdxs[nLPivs] = curPivBarIdx;
                nLPivs++;
            }
        // -- or current trend is up
        } else {
            if (curTrend == "D") {
                curTrend = "U";
                curPivBarIdx = curBar - aHHVBars[curBar];
                aHPivs[curPivBarIdx] = 1;
                aHPivHighs[nHPivs] = H[curPivBarIdx];
                aHPivIdxs[nHPivs] = curPivBarIdx;
                nHPivs++;
            }
        // --   If curTrend is up...else...
        }       
     
    // -- loop through bars
    } 
}
/* *******************
    Found main pivots
******************* */

/* *************************
    Finding missed pivot(s)
************************* */

// -- Start at last bar. Reestablish curBar
curBar = 
    IIf(nlastVisBar > 0 AND bUseLastVis, 
    nlastVisBar, 
    IIf(Status("action")==4 AND nExploreBarIdx > 0, 
    nExploreBarIdx,
    LastValue(BarIndex()))
    );

// -- Make sure I found at least two of each above.
if (nHPivs >= 2 AND nLPivs >= 2) {

    lastLPIdx = aLPivIdxs[0];
    lastLPL = aLPivLows[0];
     
    lastHPIdx = aHPivIdxs[0];
    lastHPH = aHPivHighs[0];
     
    nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
     
    nAddPivsRng = curBar - nLastHOrLPivIdx;
    aLLVAfterLastPiv = LLV(L, nAddPivsRng);  
    nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
    aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);  
    nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
    aHHVAfterLastPiv = HHV(H, nAddPivsRng); 
    nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
    aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng); 
    nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
     
    // -- Later want to add last high pivot only if
    //    not in buy mode from last and still in trade

    /*
        Note - I'm only interested in adding pivots if I'm in 
        a higher-highs or lower-lows scenario
    */

     
    // -- OK, let's start where the last high pivot occurs after the
    //    last Low pivot
    if (lastHPIdx > lastLPIdx) {
     
        /*  There are at least two possibilities here. One is that
            the previous high was higher, indicating that this is a 
            possible short retracement or one in the making.
            The other is that the previous high was lower, indicating 
            that this is a possible long retracement in the working. 
            However, both depend on opposing pivots. E.g., if I find 
            higher highs, what if I have lower lows?  
         
            If the highs are descending, then I can consider:
                - a lower low, and leave it at that
                - a higher high and higher low
                - a lower low and another lower high
        */
        if (aHPivHighs[0] < aHPivHighs[1]) {
     
            if (nLLVAfterLastPiv < aLPivLows[0] AND
                (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
                AND nLLVIdxAfterLastPiv != curBar   ) {
     
                // -- OK, we'll add this as a pivot. 
                //    Mark it for plotting...
                aLPivs[nLLVIdxAfterLastPiv] = 1;
                aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
         
                //    ...and then rearrange elements in the 
                //    pivot information arrays
                for (j=0; j<nLPivs; j++) {
                    aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
                    aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
                }
                aLPivLows[0] = nLLVAfterLastPiv;
                aLPivIdxs[0] = nLLVIdxAfterLastPiv;
                nLPivs++;
     
            // -- Test whether to add piv given last piv is high 
            //    AND we have lower highs   
            }
     
        // -- Here, the last piv is a high piv, and we have 
        //    higher-highs. The most likely addition is a 
        //    Low piv that is a retracement.
        } else {
     
            if (nLLVAfterLastPiv > aLPivLows[0] AND
                (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
                AND nLLVIdxAfterLastPiv != curBar   ) {
     
                // -- OK, we'll add this as a pivot. 
                //    Mark it for plotting...
                aLPivs[nLLVIdxAfterLastPiv] = 1;
                aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
         
                //    ...and then rearrange elements in the 
                //    pivot information arrays
                for (j=0; j<nLPivs; j++) {
                    aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
                    aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
                }
                aLPivLows[0] = nLLVAfterLastPiv;
                aLPivIdxs[0] = nLLVIdxAfterLastPiv;
                nLPivs++;
     
            // -- Test whether to add piv given last piv is high 
            //    AND we have lower highs   
            }   
        // -- The last piv is a high and we have higher highs 
        //    OR lower highs
        }
     
    /* ****************************************************************
        Still finding missed pivot(s). Here, the last piv is a low piv.
    **************************************************************** */
    } else {
     
        // -- First case, lower highs
        if (aHPivHighs[0] < aHPivHighs[1]) {
     
            if (nHHVAfterLastPiv < aHPivHighs[0] AND
                (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
                AND nHHVIdxAfterLastPiv != curBar   ) {
     
                // -- OK, we'll add this as a pivot. 
                //    Mark that for plotting
                aHPivs[nHHVIdxAfterLastPiv] = 1;
                aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
     
                //    ...and then rearrange elements in the 
                //    pivot information arrays
                for (j=0; j<nHPivs; j++) {
                    aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
                    aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
                }
                aHPivHighs[0] = nHHVAfterLastPiv;
                aHPivIdxs[0] = nHHVIdxAfterLastPiv;
                nHPivs++;
     
            // -- Test whether to add piv given last piv is high 
            //    AND we have lower highs   
            }
     
        // -- Second case when last piv is a low piv, higher highs 
        //    Most likely addition is high piv that is a retracement.
        //    Considering adding a high piv as long as it is higher
        } else {
     
            // -- Where I have higher highs,
            if (nHHVAfterLastPiv > aHPivHighs[0] AND
                (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
                AND nHHVIdxAfterLastPiv != curBar   ) {
     
                // -- OK, we'll add this as a pivot. 
                //    Mark it for plotting...
                aHPivs[nHHVIdxAfterLastPiv] = 1;
                aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
     
                //    ...and then rearrange elements in the 
                //    pivot information arrays
                for (j=0; j<nHPivs; j++) {
                    aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
                    aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
                }
                aHPivHighs[0] = nHHVAfterLastPiv;
                aHPivIdxs[0] = nHHVIdxAfterLastPiv;
                nHPivs++;
     
            // -- Test whether to add piv given last piv is high 
            //    AND we have lower highs   
            }
     
        }
             
    } 

// -- If there are at least two of each
}

/* ****************************************
// -- Done with finding pivots
***************************************** */

if (bDraw) {

    // -- OK, let's plot the pivots using arrows
    PlotShapes(
        IIf(aHPivs==1, shapeDownArrow, shapeNone), 
            colorRed, 0,    High, Offset=-15);
    PlotShapes(
        IIf(aAddedHPivs==1, shapeDownArrow, shapeNone),
            colorDarkRed, 0, High, Offset=-15);
    PlotShapes(
        IIf(aLPivs==1, shapeUpArrow , shapeNone),       
            colorGreen, 0, Low, Offset=-15);
    PlotShapes(
        IIf(aAddedLPivs==1, shapeUpArrow , shapeNone), 
            colorDarkGreen, 0, Low, Offset=-15);
}

/* ****************************************
// -- Done with discovering and plotting pivots 
***************************************** */

// -- I'm going to want to look for possible retracement
risk = 0;
profInc = 0;
nLeg0Pts = 0;
nLeg0Bars = 0;
nLeg0Vol = 0;
nLeg1Pts = 0;
nLeg1Bars = 0;
nLeg1Vol = 0;
nLegBarsDiff = 0;
nRtrc0Pts = 0;
nRtrc0Bars = 0;
nRtrc0Vol = 0;
nRtrc1Pts = 0;
nRtrc1Bars = 0;
nRtrc1Vol = 0;

minRtrc = 0;
maxRtrc = 0;
minLine = 0;
maxLine = 0;
triggerLine = 0;
firstProfitLine = 0;
triggerInc = 0;
triggerPrc = 0;
firstProfitPrc = 0;
retrcPrc = 0;
retrcBar = 0;
retrcBarIdx = 0;
retrcRng = 0;
aRetrcPrc = H-H;
aRetrcPrcBars = H-H;
aRetrcClose = C;
retrcClose = 0;

// -- Do TCZ calcs. Arrangement of pivs very specific
//    for this setup.
if (nHPivs >= 2 AND
    nLPivs >=2 AND 
    aHPivHighs[0] > aHPivHighs[1] AND
    aLPivLows[0] > aLPivLows[1]) {

    tcz500 = 
    (aHPivHighs[0] -
    (.5 * (aHPivHighs[0] - aLPivLows[1])));

    tcz618 = 
    (aHPivHighs[0] -
    (.618 * (aHPivHighs[0] - aLPivLows[1])));

    tcz786 = 
    (aHPivHighs[0] -
    (.786 * (aHPivHighs[0] - aLPivLows[0])));

    retrcRng = curBar  - aHPivIdxs[0];
    aRetrcPrc = LLV(L, retrcRng);
    aRetrcPrcBars  = LLVBars(L, retrcRng);
     
    retrcPrc = aRetrcPrc[curBar];
    retrcBarIdx = curBar - aRetrcPrcBars[curBar];
    retrcClose = aRetrcClose[retrcBarIdx];

    // -- bTCZLong setup?
    bTCZLong = (

        // -- Are retracement levels arranged in
        //    tcz order?

        // .500 is above .786 for long setups
        tcz500 >= (tcz786 * (1 - tczTolerance))
        AND
        // .681 is below .786 for long setups
        tcz618 <= (tcz786 * (1 + tczTolerance))
        AND

        // -- Is the low in the tcz range
        // -- Is the close >= low of tcz range
        //    and low <= high of tcz range
        retrcClose >= ((1 - retrcTolerance) *  tcz618)
        AND
        retrcPrc <= ((1 + retrcTolerance) *  tcz500)
        ); 
         
        // -- risk would be high of signal bar minus low of zone
        //risk = 0;

// -- lower highs and lower lows
} else if (nHPivs >= 2 AND nLPivs >=2 
    AND aHPivHighs[0] < aHPivHighs[1] 
    AND aLPivLows[0] < aLPivLows[1]) {

    tcz500 = 
    (aHPivHighs[1] -
    (.5 * (aHPivHighs[1] - aLPivLows[0])));

    tcz618 = 
    (aHPivHighs[0] -
    (.618 * (aHPivHighs[1] - aLPivLows[0])));

    tcz786 = 
    (aHPivHighs[0] -
    (.786 * (aHPivHighs[0] - aLPivLows[0])));

    retrcRng = curBar  - aLPivIdxs[0];
    aRetrcPrc = HHV(H, retrcRng);
    retrcPrc = aRetrcPrc[curBar];
    aRetrcPrcBars  = HHVBars(H, retrcRng);
    retrcBarIdx = curBar - aRetrcPrcBars[curBar];
    retrcClose = aRetrcClose[retrcBarIdx];

    bTCZShort = (
        // -- Are retracement levels arranged in
        //    tcz order?

        // .500 is below .786 for short setups
        tcz500 <= (tcz786 * (1 + tczTolerance))
        AND
        // .681 is above .786 for short setups
        tcz618 >= (tcz786 * (1 - tczTolerance)) 
        AND

        // -- Is the close <= high of tcz range
        //    and high >= low of tcz range
        retrcClose <= ((1 + retrcTolerance) *  tcz618)
        AND
        retrcPrc >= ((1 - retrcTolerance) *  tcz500)
        ); 
         
        // -- Risk would be top of zone - low of signal bar 
        //risk = 0;
}

// -- Show zone if present
if (bTCZShort OR bTCZLong) { 

    // -- Be prepared to see symmetry
    if (bTCZShort) {
        if (aLPivIdxs[0] > aHPivIdxs[0]) {   
            // -- Valuable, useful symmetry information 
            nRtrc0Pts = aHPivHighs[0] - aLPivLows[1];
            nRtrc0Bars = aHPivIdxs[0] - aLPivIdxs[1] + 1;
            nRtrc1Pts = retrcPrc - aLPivLows[0];
            nRtrc1Bars = retrcBarIdx - aLPivIdxs[0] + 1;
        } else {
            nRtrc0Pts = aHPivHighs[1] - aLPivLows[1];
            nRtrc0Bars = aHPivIdxs[1] - aLPivIdxs[1] + 1;
            nRtrc1Pts = aHPivHighs[0] - aLPivLows[0];
            nRtrc1Bars = aHPivIdxs[0] - aLPivIdxs[0] + 1;
        }
    } else { // bLongSetup
        if (aLPivIdxs[0] > aHPivIdxs[0]) {   
            nRtrc0Pts = aHPivHighs[0] - aLPivLows[1];
            nRtrc0Bars = aHPivIdxs[0] - aLPivIdxs[1] + 1;
            nRtrc1Pts = retrcPrc - aLPivLows[0];
            nRtrc1Bars = retrcBarIdx - aLPivIdxs[0] + 1;
        } else {
            nRtrc0Pts = aHPivHighs[1] - aLPivLows[0];
            nRtrc0Bars = aLPivIdxs[0] - aHPivIdxs[1] + 1;
            nRtrc1Pts = aHPivHighs[0] - aLPivLows[0];
            nRtrc1Bars = aLPivIdxs[0] - aHPivIdxs[0] + 1;
        }
    }

    if (bShowTCZ) {
        Plot(
            LineArray(  IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
            tcz500, curBar, tcz500 , 0), 
            "tcz500", colorPaleBlue, styleLine);
        Plot(
            LineArray(  IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
            tcz618, curBar, tcz618, 0), 
            "tcz618", colorPaleBlue, styleLine);
        Plot(
            LineArray(  IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
            tcz786, curBar, tcz786, 0), 
            "tcz786", colorTurquoise, styleLine);
    }

// -- if (bShowTCZ)
}

if (bDraw) {
    Title = Name() + " (" + StrLeft(FullName(), 10) + 
    ")  ATR: " + NumToStr(ATR(1), 4.2) + " ( " + 
    NumToStr((C - Ref(C, -1)), 4.2) + " / " +
    NumToStr((((C - Ref(C, -1)) / Ref(C, -1)) * 100), 2.1) +    "% )  " +
    WriteVal( SelectedValue( DateTime() ), formatDateTime) +
    " \nO: " + Open +   
    ",  \nH: " + High + 
    ",  \nL: " + Low + 
    ", \nC: " + Close +     ",  \n" +
//  "Risk: " + WriteVal(risk, 2.1) + "%  \n" +
    "Rtrc 0/1 Pts: " + WriteVal(nRtrc0Pts, 2.1) + "/" + 
    WriteVal(nRtrc1Pts, 2.1) + "  \n" +
    "Rtrc 0/1 Bars: " + WriteVal(nRtrc0Bars, 2.0) + "/" +
    WriteVal(nRtrc1Bars, 2.0);
}

// **************************
// END INDICATOR CODE
// **************************

_SECTION_BEGIN("SAR");
acc = Param("Acceleration", 0.02, 0, 1, 0.001 );
accm = Param("Max. acceleration", 0.2, 0, 1, 0.001 );
Plot( SAR( acc, accm ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style", styleDots | styleNoLine, maskDefault | styleDots | styleNoLine ) );

if( Status("action") == actionCommentary )
{
printf("The Parabolic SAR provides excellent exit points. You should Close long positions when the price falls below the SAR AND Close Short positions when the price rises above the SAR.");
}
_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.8,1,1.8,0.01);                        // Max XA of Butterfly = (1.0 - 1.618)

_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();

_SECTION_BEGIN("AB=CD");

abcd_Cmin = Param("Swing C Min.",0.3,        0.3    ,    1,        0.01);
abcd_Cmax = Param("Swing C Max.",0.8,        0.8    ,    1,        0.01);
abcd_Dmin = Param("Swing D Min.",1.2,        1,        2.7,    0.01);
abcd_Dmax = Param("Swing D Max.",3.7,        1,        4,        0.01);

_SECTION_END();

_SECTION_BEGIN("Patterns");
    
//strength = Param("Strength",5,2,15,1);                                    // Best use: 3, 4, 5
strength = Param("BARS of each LINE",5,2,15,1);                            // So luong bar cho moi duong XA, AB, BC, 
bu = ParamToggle("Bullish Pattern","Off|On",1);                            // So bar/lines se quyet dinh. mo^ hinh` duoc ve the' nao`
be = ParamToggle("Bearish Pattern","Off|On",1);

bi = Cum(1)-1;

function GetTop(bars)                                                         // Lay' gia' tri cao nhat' = di?nh
    {
        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)                                                    // La'y gia tri thap' nhat' = day'
    {
        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);                                        // so' bar cho 1 duong` XA, AB, BC, CD
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
//============================================
/*
    Mo hinh Bullish:
    A    =    P1H2
    B    =    V1L1
    C    =    P1H1
    X    =    V1L2

*/

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

myAX            =    P1H2-V1L2;
myAB            =    P1H2-V1L1;
myBC            =    P1H1-V1L1;

myAB_AX        =    myAB/ myAX;
myBC_AB        =    myBC/ myAB;    

BullGartley4         = PTvalid     AND     (    myAB_AX > GBmin    )         AND (    myAB_AX < GBmax    )
                                AND      (    myBC_AB > GCMin     )         AND (    myBC_AB < GCMax    ); 

BullBat4             = PTvalid     AND     (    myAB_AX > BatBmin )         AND (    myAB_AX < BatBmax    )
                                AND     (    myBC_AB > BatCMin )         AND (    myBC_AB < BatCMax    ); 

BullButterfly4     = PTvalid     AND     (    myAB_AX > BtBmin )         AND (    myAB_AX < BtBMax    )
                                AND      (    myBC_AB > BtCmin )         AND (    myBC_AB < BtCmin     );

BullCrab4             = PTvalid     AND     (    myAB_AX > CBmin )              AND (    myAB_AX < CBmax     )
                                AND      (    myBC_AB > CCmin )         AND (    myBC_AB < CCmax    );

BullABCD4            = PTvalid AND     (    myBC_AB > abcd_Cmin)     AND (    myBC_AB < abcd_Cmax    );

strPattern = "";

//==================================================
//                 BULLISH ABCD
//     Bullish pattern found. D retracement level is not evaluated
//==================================================
    dHigh        =        HighestSince(BullABCD4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BullABCD4,L);
    
    myC            =        ValueWhen(BullABCD4,P1H1);
    myB            =        ValueWhen(BullABCD4,V1L1);
    myA            =        ValueWhen(BullABCD4,P1H2);
    myX            =        ValueWhen(BullABCD4,V1L2);
    myCB        =        myC - myB;

    my_d_min    =        myCB    *    abcd_DMin ;                    // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myCB    *    abcd_DMax ;
    my_Cd_min    =        myC - my_d_min;                       // Khoang dich chuyen cua duong Ad con.
    my_Cd_max    =        myC - my_d_max;

BullABCD         =         IIf(        ( dLow  <    my_Cd_min    )    AND        ( dLow    > my_Cd_max )    
                                AND    ( dHigh    <=    myC        )    AND        ( dLow    ==    L), 
                                True, False
                            );

BullABCD        =        BullABCD    AND (dLow        <    myB);


//==================================================
//                 BULLISH GARTLEY
//==================================================
    dHigh        =        HighestSince(BullGartley4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BullGartley4,L);

    myC            =        ValueWhen(BullGartley4,P1H1);
    myB            =        ValueWhen(BullGartley4,V1L1);
    myA            =        ValueWhen(BullGartley4,P1H2);
    myX            =        ValueWhen(BullGartley4,V1L2);
    myAX        =        myA - myX;

    my_d_min    =        myAX    *    GDmin;                            // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    GDMax;
    my_Ad_min    =        myA - my_d_min;                            // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA - my_d_max;

BullGartley     =         IIf(        ( dLow  <    my_Ad_min    )    AND        ( dLow    > my_Ad_max )    
                                AND    ( dHigh    <=    myC        )    AND        ( dLow    ==    L), 
                                True, False
                            );
BullGartley     =        BullGartley     AND (dLow        <    myB);                        // diem D thap' hon B
strPattern     =        WriteIf(BullGartley,"BULLISH GARTLEY",strPattern);



//==================================================
//                 BULLISH BAT
//==================================================
    dHigh        =        HighestSince(BullBat4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BullBat4,L);    

    myC            =        ValueWhen(BullBat4,P1H1);
    myB            =        ValueWhen(BullBat4,V1L1);
    myA            =        ValueWhen(BullBat4,P1H2);
    myX            =        ValueWhen(BullBat4,V1L2);
    myAX        =        myA - myX;

    my_d_min    =        myAX    *    BatDmin;                        // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    BatDmax ;
    my_Ad_min    =        myA - my_d_min;                            // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA - my_d_max;

BullBat         =         IIf(        ( dLow  <    my_Ad_min    )    AND        ( dLow    > my_Ad_max )    
                                AND    ( dHigh    <=    myC        )    AND        ( dLow    ==    L), 
                                True, False
                            );
BullBat         =        BullBat     AND (dLow        <    myB);            // diem d thap hon diem B
strPattern     =        WriteIf(BullBat,"BULLISH BAT",strPattern);


//==================================================
//                 BULLISH CRAB - CUA
//==================================================
    dHigh        =        HighestSince(BullCrab4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BullCrab4,L);

    myC            =        ValueWhen(BullCrab4,P1H1);
    myB            =        ValueWhen(BullCrab4,V1L1);
    myA            =        ValueWhen(BullCrab4,P1H2);
    myX            =        ValueWhen(BullCrab4,V1L2);
    myAX        =        myA - myX;

    my_d_min    =        myAX    *    CDmin ;                    // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    CDmax ;
    my_Ad_min    =        myA - my_d_min;                        // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA - my_d_max;

BullCrab         =         IIf(        ( dLow  <    my_Ad_min    )    AND        ( dLow    > my_Ad_max )    
                                AND    ( dHigh    <=    myC        )    AND        ( dLow    ==    L), 
                                True, False
                            );
BullCrab         =        BullCrab     AND (dLow        <    myX);                    // diem D thap' hon X
strPattern     =        WriteIf(BullCrab ,"BULLISH CRAB",strPattern);


//==================================================
//                 BULLISH  BUTTTERFLY
//==================================================
    dHigh        =        HighestSince(BullButterfly4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BullButterfly4,L);

    myC            =        ValueWhen(BullButterfly4,P1H1);
    myB            =        ValueWhen(BullButterfly4,V1L1);
    myA            =        ValueWhen(BullButterfly4,P1H2);
    myX            =        ValueWhen(BullButterfly4,V1L2);
    myAX        =        myA - myX;

    my_d_min    =        myAX    *    BtDmin ;                                // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    BtDmax ;
    my_Ad_min    =        myA - my_d_min;                                    // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA - my_d_max;

BullButterfly     =         IIf(        ( dLow  <    my_Ad_min    )    AND        ( dLow    > my_Ad_max )    
                                    AND    ( dHigh    <=    myC        )    AND        ( dLow    ==    L), 
                                True, False
                                );
BullButterfly     =        BullButterfly     AND (dLow        <    myX);                    // diem D thap' hon X
strPattern         =        WriteIf(BullButterfly ,"BULLISH BUTTERFLY",strPattern);



//==========================================================
//   VE DUONG CHO MO HINH BULLISH ABCB 
//==========================================================
BullHar4     =  BullABCD4;
BullHar     =  BullABCD;

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

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

BCdAB = (C1-B)/(A-B);
BCdCD = (C1-D)/(C1-B);

PlotPattern = Dbar > C1bar;

if(LastValue(PlotPattern) AND bu)
{
        ColorX = colorGreen;
    // Ve cac duong AB, BC, CD
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleDashed);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",ColorX ,styleDashed);

    // Ve cac gia tri Fibo
        PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,ColorX );
        PlotText(NumToStr(LastValue(BCdCD),1.2),(LastValue(Bbar)+LastValue(Dbar))/2,(LastValue(B)+LastValue(D))/2,ColorX );

    //---------- Viet cac diem X, A, B, C, D: by binhnd---------------------
        xlech        =    0;
        ylech         =     2;
        PlotText("A",LastValue(Abar)    +     xlech,    LastValue(A)    +    ylech,    ColorX );
        PlotText("B",LastValue(Bbar)    +     xlech,    LastValue(B)    -    ylech,    ColorX );
        PlotText("C",LastValue(C1bar)    +     xlech,    LastValue(C1)    +    ylech,    ColorX );
        PlotText("D",LastValue(Dbar)    +     xlech,    LastValue(D)    -    ylech,    ColorX );

    //--------- Viet thuyet minh mo hinh: by binhnd--------------
        if (strPattern!="")  
        {
            myStr            =    "Pattern: BULLISH AB=CD";
            toadoX            =    LastValue(Abar);
            toadoY            =    LastValue(D);

            PlotText(myStr,toadoX,toadoY,ColorX );
        }

}            //    end of Ve duong` bullish abcd



//==========================================================
//   VE DUONG CHO MO HINH BULLISH BAT, GARTLEY, BUTTERFLY, CRAB
//==========================================================


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;

if(LastValue(PlotPattern) AND bu)
{
            ColorX    = colorBlue;
        // Ve cac duong XA, AB, BC, CD
            Plot( LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",ColorX,styleThick);
            Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",ColorX,styleThick);
            Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"",ColorX,styleThick);
            Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"",ColorX,styleThick);
            Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Bbar),LastValue(B)),"",ColorX,styleDashed);
            Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",ColorX,styleThick);
            Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"",ColorX,styleDashed);
            Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",ColorX,styleDashed);
            Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Dbar),LastValue(D)),"",ColorX,styleDashed);

        // Ve cac gia tri Fibo
            PlotText(NumToStr(LastValue(ABdXA),1.2),(LastValue(Bbar)+LastValue(Xbar))/2,(LastValue(B)+LastValue(X))/2,ColorX);
            PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,ColorX);
            PlotText(NumToStr(LastValue(ADdXA),1.2) ,(LastValue(Dbar)+LastValue(Xbar))/2,(LastValue(D)+LastValue(X))/2,ColorX);
            PlotText(NumToStr(LastValue(BCdCD),1.2),(LastValue(Bbar)+LastValue(Dbar))/2,(LastValue(B)+LastValue(D))/2,ColorX);

        //---------- Viet cac diem X, A, B, C, D: by binhnd---------------------
            xlech        =    0;
            ylech         =     2;
            PlotText("X",LastValue(Xbar)    +     xlech,    LastValue(X)    -    ylech,    ColorX);
            PlotText("A",LastValue(Abar)    +     xlech,    LastValue(A)    +    ylech,    ColorX);
            PlotText("B",LastValue(Bbar)    +     xlech,    LastValue(B)    -    ylech,    ColorX);
            PlotText("C",LastValue(C1bar)    +     xlech,    LastValue(C1)    +    ylech,    ColorX);
            PlotText("D",LastValue(Dbar)    +     xlech,    LastValue(D)    -    ylech,    ColorX);

        //--------- Viet thuyet minh mo hinh: by binhnd--------------
            if (strPattern!="")  
            {
                strPattern     =     "Pattern: " + strPattern;
                toadoX            =    (LastValue(Dbar)+LastValue(Xbar))/2;
                toadoY            =    (LastValue(D)+LastValue(X))/2;

                PlotText(strPattern,toadoX,toadoY-2,ColorX);
            }

}            // end of Ve duong cho cac mo hinh Crab, Butterfly, Bat


//=============================================================
//                BEARISH PATTERNS
//=============================================================

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

/*=====================
        X     =     P1H2                     Trong mo hinh` bear: Die^m X cao hon diem A. MyAX = X-> A
        A    =    V1L2
        B    =    P1H1
        C    =    V1L1

=======================*/
myAX            =    P1H2-V1L2;                
myAB            =    P1H1-V1L2;
myBC            =    P1H1-V1L1;

myAB_AX        =    myAB/ myAX;
myBC_AB        =    myBC/ myAB;    

BearGartley4         = PTvalid     AND     (    myAB_AX > GBmin    )         AND (    myAB_AX < GBmax    )
                                AND      (    myBC_AB > GCMin     )         AND (    myBC_AB < GCMax    ); 

BearBat4             = PTvalid     AND     (    myAB_AX > BatBmin )         AND (    myAB_AX < BatBmax    )
                                AND     (    myBC_AB > BatCMin )         AND (    myBC_AB < BatCMax    ); 

BearButterfly4     = PTvalid     AND     (    myAB_AX > BtBmin )         AND (    myAB_AX < BtBMax    )
                                AND      (    myBC_AB > BtCmin )         AND (    myBC_AB < BtCmin     );

BearCrab4             = PTvalid     AND     (    myAB_AX > CBmin )              AND (    myAB_AX < CBmax     )
                                AND      (    myBC_AB > CCmin )         AND (    myBC_AB < CCmax    );

BearABCD4            = PTvalid AND     (    myBC_AB > abcd_Cmin)     AND (    myBC_AB < abcd_Cmax    );

strPattern = "";



//==========================================================
//                 BEARISH ABCD
//     Bearish pattern found. D retracement level is not evaluated
//==========================================================
    dHigh        =        HighestSince(BearABCD4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BearABCD4,L);
    
    myA            =        ValueWhen(BearABCD4,V1L2);
    myB            =        ValueWhen(BearABCD4,P1H1);
    myC            =        ValueWhen(BearABCD4,V1L1);
    myCB        =        myB - myC;

    my_d_min    =        myCB    *    abcd_DMin ;                    // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myCB    *    abcd_DMax ;
    my_Cd_min    =        myC + my_d_min;                       // Khoang dich chuyen cua duong Ad con.
    my_Cd_max    =        myC + my_d_max;

BearABCD         =         IIf(        ( dHigh      >    my_Cd_min    )    AND        ( dHigh    < my_Cd_max )    
                                AND    ( dLow        >=    myC            )    AND        ( dHigh    ==    H), 
                                True, False
                            );

BearABCD        =        BearABCD    AND (dHigh        >    myB);

//=============================================================
//                BEARISH GARTLEY
//=============================================================
    dHigh        =        HighestSince(BearGartley4,H);        // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BearGartley4,L);

    myX            =        ValueWhen(BearGartley4,P1H2);
    myA            =        ValueWhen(BearGartley4,V1L2);
    myAX        =        myX - myA;

    myB            =        ValueWhen(BearGartley4,P1H1);
    myC            =        ValueWhen(BearGartley4,V1L1);


    my_d_min    =        myAX    *    GDmin;                        // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    GDMax;
    my_Ad_min    =        myA     +     my_d_min;                    // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA     +     my_d_max;

BearGartley     =         IIf(        ( dHigh    >    my_Ad_min    )    AND        ( dHigh    < my_Ad_max )    
                                AND    ( dLow        >=    myC            )    AND        ( dHigh    ==    H), 
                                True, False
                            );
BearGartley     =        BearGartley     AND (dHigh        >    myB);                        // diem D cao hon B
strPattern     =        WriteIf(BearGartley ,"BEARISH GARTLEY",strPattern);

//=============================================================
//                BEARISH BAT
//=============================================================
    dHigh        =        HighestSince(BearBat4,H);        // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BearBat4,L);

    myX            =        ValueWhen(BearBat4,P1H2);
    myA            =        ValueWhen(BearBat4,V1L2);
    myAX        =        myX - myA;

    myB            =        ValueWhen(BearBat4,P1H1);
    myC            =        ValueWhen(BearBat4,V1L1);


    my_d_min    =        myAX    *    BatDmin ;                        // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    BatDMax ;
    my_Ad_min    =        myA     +     my_d_min;                    // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA     +     my_d_max;

BearBat         =         IIf(        ( dHigh    >    my_Ad_min    )    AND        ( dHigh    < my_Ad_max )    
                                AND    ( dLow        >=    myC            )    AND        ( dHigh    ==    H), 
                                True, False
                            );
BearBat         =        BearBat     AND (dHigh        >    myB);                        // diem D cao hon B
strPattern     =        WriteIf(BearBat ,"BEARISH BAT",strPattern);


//=============================================================
//                BEARISH BUTTERFLY
//=============================================================
    dHigh        =        HighestSince(BearButterfly4,H);        // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BearButterfly4,L);

    myX            =        ValueWhen(BearButterfly4,P1H2);
    myA            =        ValueWhen(BearButterfly4,V1L2);
    myAX        =        myX - myA;

    myB            =        ValueWhen(BearButterfly4,P1H1);
    myC            =        ValueWhen(BearButterfly4,V1L1);


    my_d_min    =        myAX    *    BtDmin ;                        // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    BtDmax ;
    my_Ad_min    =        myA     +     my_d_min;                        // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA     +     my_d_max;

BearButterfly =         IIf(        ( dHigh    >    my_Ad_min    )    AND        ( dHigh    < my_Ad_max )    
                                AND    ( dLow        >=    myC            )    AND        ( dHigh    ==    H), 
                                True, False
                            );
BearButterfly    =        BearButterfly     AND (dHigh        >    myX);                        // diem D cao hon X
strPattern        =        WriteIf(BearButterfly ,"BEARISH BUTTERFLY",strPattern);



//=============================================================
//                BEARISH CRAB
//=============================================================
    dHigh        =        HighestSince(BearCrab4,H);                // Tinh' gia' tri min, max cua duong Ad. Duong Ad la duong con cua AD
    dLow         =         LowestSince(BearCrab4,L);

    myX            =        ValueWhen(BearCrab4,P1H2);
    myA            =        ValueWhen(BearCrab4,V1L2);
    myAX        =        myX - myA;

    myB            =        ValueWhen(BearCrab4,P1H1);
    myC            =        ValueWhen(BearCrab4,V1L1);


    my_d_min    =        myAX    *    CDmin ;                        // Tinh' gia' tri cua duong Ad con. Khi gia' giam? tu` tre^n xuong' thi` max -> min
    my_d_max    =        myAX    *    CDmax ;
    my_Ad_min    =        myA     +     my_d_min;                        // Khoang dich chuyen cua duong Ad con.
    my_Ad_max    =        myA     +     my_d_max;

BearCrab         =         IIf(        ( dHigh    >    my_Ad_min    )    AND        ( dHigh    < my_Ad_max )    
                                AND    ( dLow        >=    myC            )    AND        ( dHigh    ==    H), 
                                True, False
                            );
BearCrab         =        BearCrab     AND (dHigh        >    myX);                        // diem D cao hon X
strPattern     =        WriteIf(BearCrab ,"BEARISH CRAB",strPattern);



//==========================================================
//   VE DUONG CHO MO HINH BEARISH ABCD
//==========================================================


BearHar4 = BearABCD4;
BearHar = BearABCD;

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

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

BCdAB = (B-C1)/(B-A);
BCdCD = (D-C1)/(B-C1);

PlotPattern = Dbar > C1bar;

//--------- Ve duong ------------------
if(LastValue(Plotpattern) AND be)
{
        ColorX = colorYellow;
    // Ve duong AB, BC
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleDashed);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",ColorX ,styleDashed);

    // Viet cac gia tri Fibo tren duong AB, BC
        PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,ColorX );
        PlotText(NumToStr(LastValue(BCdCD),1.2) ,(LastValue(Dbar)+LastValue(Bbar))/2,(LastValue(D)+LastValue(B))/2,ColorX );

    //---------- Viet cac diem A, B, C, D: by binhnd---------------------
        xlech        =    -1;
        ylech         =     1;
        PlotText("A",LastValue(Abar)    +     xlech,    LastValue(A)    -    ylech,    ColorX );
        PlotText("B",LastValue(Bbar)    +     xlech,    LastValue(B)    +    ylech,    ColorX );
        PlotText("C",LastValue(C1bar)    +     xlech,    LastValue(C1)    -    ylech,    ColorX );
        PlotText("D",LastValue(Dbar)    +     xlech,    LastValue(D)    +    ylech,    ColorX );

    //--------- Viet thuyet minh mo hinh: by binhnd--------------
        if (strPattern!="") 
            {
                myStr            =    "Pattern: BEARISH AB=CD";
                toadoaX        =    LastValue(Abar);
                toadoY            =    LastValue(D);

                PlotText(myStr,toadoaX,toadoY+1,ColorX );
            }
    
}            // end of VE DUONG CHO MO HINH BEARISH ABCD


//==========================================================
//   VE DUONG CHO MO HINH BEARISH BAT, GARTLEY, BUTTERFLY, CRAB
//==========================================================

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;

//--------- Ve duong ------------------
if(LastValue(Plotpattern) AND be)
{
        ColorX = colorRed;
    // Ve duong XA, AB, BC
        Plot( LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Bbar),LastValue(B)),"",ColorX ,styleDashed);
        Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",ColorX ,styleThick);
        Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"",ColorX ,styleDashed);
        Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",ColorX ,styleDashed);
        Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Dbar),LastValue(D)),"",ColorX ,styleDashed);

    // Viet cac gia tri Fibo tren duong XA, AB, BC
        PlotText(NumToStr(LastValue(ABdXA),1.2),(LastValue(Bbar)+LastValue(Xbar))/2,(LastValue(B)+LastValue(X))/2,ColorX );
        PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,ColorX );
        PlotText(NumToStr(LastValue(BCdCD),1.2) ,(LastValue(Dbar)+LastValue(Bbar))/2,(LastValue(D)+LastValue(B))/2,ColorX );
        PlotText(NumToStr(LastValue(ADdXA),1.2) ,(LastValue(Dbar)+LastValue(Xbar))/2,(LastValue(D)+LastValue(X))/2,ColorX );

    //---------- Viet cac diem X, A, B, C, D: by binhnd---------------------
        xlech        =    -1;
        ylech         =     1;
        PlotText("X",LastValue(Xbar)    +     xlech,    LastValue(X)    +    ylech,    ColorX );
        PlotText("A",LastValue(Abar)    +     xlech,    LastValue(A)    -    ylech,    ColorX );
        PlotText("B",LastValue(Bbar)    +     xlech,    LastValue(B)    +    ylech,    ColorX );
        PlotText("C",LastValue(C1bar)    +     xlech,    LastValue(C1)    -    ylech,    ColorX );
        PlotText("D",LastValue(Dbar)    +     xlech,    LastValue(D)    +    ylech,    ColorX );

    //--------- Viet thuyet minh mo hinh: by binhnd--------------
        if (strPattern!="") 
            {
                strPattern     =     "Pattern: " + strPattern;
                toadoaX        =    (LastValue(Dbar)+LastValue(Xbar))/2;
                toadoY            =    (LastValue(D)+LastValue(X))/2;

                PlotText(strPattern,toadoaX,toadoY+1,ColorX );
            }
    
}            // end of VE DUONG CHO MO HINH BEARISH BAT, GARTLEY, BUTTERFLY, CRAB




//=================================
// Show diem ho^~ tro. va` khang' cu. ko?
//=================================

plotFractals = ParamToggle("Plot Fractals","Off|On",1);                
if(PlotFractals)
{
    PlotShapes(shapeSmallCircle*P1,colorBlack,0,H,10);
    PlotShapes(shapeSmallCircle*V1,colorBlue,0,L,-10);
}



//==============================================
// DAT DIEU KIEN cho TIM KIEM BULL
//==============================================
dkBull = False;
ListBull         =     ParamList("Type of Bullish", "None|AB=CD|Gartley|Butterfly|Bat|Crab|All Patterns", 6);
    if     (    ListBull == "None"        )        dkBull =     True;
    if (    ListBull =="AB=CD"        )         dkBull    =    BullABCD ;
    if (    ListBull =="Gartley"        )         dkBull    =    BullGartley ;
    if (    ListBull =="Butterfly"    )         dkBull    =    BullButterfly ;
    if (    ListBull =="Bat"            )         dkBull    =    BullBat ;
    if (    ListBull =="Crab"            )         dkBull    =    BullCrab ;
    if (    ListBull =="All Patterns")         dkBull    =    (BullABCD) OR (BullGartley) OR (BullButterfly ) OR (BullBat ) OR (BullCrab);

//==============================================
// DAT DIEU KIEN cho TIM KIEM BEAR
//==============================================
dkBear = False;
ListBear         =     ParamList("Type of Bearish", "None|AB=CD|Gartley|Butterfly|Bat|Crab|All Patterns", 0);
    if     (    ListBear == "None"        )        dkBear =     True;
    if (    ListBear =="AB=CD"        )         dkBear    =    BearABCD ;
    if (    ListBear =="Gartley"        )         dkBear    =    BearGartley ;
    if (    ListBear =="Butterfly"    )         dkBear    =    BearButterfly ;
    if (    ListBear =="Bat"            )         dkBear    =    BearBat ;
    if (    ListBear =="Crab"            )         dkBear =    BearCrab ;
    if (    ListBear =="All Patterns")         dkBear =    (BearABCD ) OR (BearGartley ) OR (BearButterfly ) OR (BearBat ) OR (BearCrab );
//===============================

AddColumn(V,"Volume",1.0);
Filter = (dkBull) AND (dkBear);

_SECTION_BEGIN("Kpl System");
/* my entry is very simple(daily data for trading)

kpl system for entry only & exit as follow:

1 st exit at x % from entry price only 1/3 quantity.(ie 1st profit target)
2 nd exit when exit Signal comes from kpl sys remaining 1/3 quantity.
3. scale-in to initial quantity if new kpl Buy Signal comes.
re-do above scaling-out & scaling-in till filal exit.
4. final exit all quantity when Close below 21 Day EMA.

kpl system code bellow :
*/
//AFL by Kamalesh Langote. Email:kpl@...
no=Param( "Swing", 8, 1, 55 );
tsl_col=ParamColor( "Color", colorWhite );

res=HHV(H,no);
sup=LLV(L,no);
avd=IIf(C>Ref(res,-1),1,IIf(C<Ref(sup,-1),-1,0));
avn=ValueWhen(avd!=0,avd,1);
tsl=IIf(avn==1,sup,res);
Buy=Cover=Cross(C,tsl) ;
Sell=Short=Cross(tsl,C) ;

Plot(tsl, _DEFAULT_NAME(), tsl_col, styleStaircase);

Buy=ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);
Short=ExRem(Short,Cover);
Cover=ExRem(Cover,Short);

PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorWhite, 0,Low,-15);  
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone),colorYellow, 0,High,-15);  
PlotShapes(IIf(Cover, shapeHollowCircle, shapeNone),colorWhite, 0,Close,0);  
PlotShapes(IIf(Short, shapeHollowCircle, shapeNone),colorYellow, 0,Close,0); 



SetPositionSize(300,spsShares);
ApplyStop(0,1,10,1);
//-----------end--------------
Long=Flip(Buy,Sell); 
Shrt=Flip(Sell,Buy); 

BuyPrice=ValueWhen(Buy,C);
SellPrice=ValueWhen(Sell,C);


Edc=(
WriteIf (Buy AND Ref(shrt,-1), " BUY @ "+C+"  ","")+ 
WriteIf (Sell AND Ref(Long,-1), " SEll @ "+C+"  ","")+
WriteIf(Sell , "Last Trade Profit Rs."+(C-BuyPrice)+"","")+
WriteIf(Buy  , "Last Trade Profit Rs."+(SellPrice-C)+"",""));
_SECTION_END();

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

//TRENDING RIBBON
// Paste the code below to your price chart somewhere and green ribbon means both
// both MACD and ADX trending up so if the red ribbon shows up the MACD and the ADX 
// are both trending down.
_SECTION_BEGIN("trending ribbon");
uptrend= PDI()>MDI() AND MACD()>Signal() ;
downtrend= MDI()>PDI() AND Signal()>MACD() ;
Plot( 2, /* defines the height of the ribbon in percent of pane width */"",
IIf( uptrend AND EMA(C,50)>=Ref(EMA(C,50),-1), colorLime, IIf( downtrend OR EMA(C,50)<Ref(EMA(C,50),-1),
     colorRed, colorAqua )), /* choose color */
styleOwnScale|styleArea|styleNoLabel, -0.5, 100 );
_SECTION_END();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
_SECTION_BEGIN("037");
// Amibroker AFL code by Edward Pottasch, Nov 2012
// Alternative ZIG type function based on the ATR and VSTOP functions
// Added multiple timeframes. Maximum timeframe set to 1440 minutes 
// Added Fib retrace levels

x=xx=BarIndex();
tc=ParamList("Display Mode","ZIG|VSTOP|ZIG&VSTOP",0);
disp0=ParamToggle("Display labels","Off|On",1);
disp1=ParamToggle("Display value labels","Off|On",1);
tf=Param("Time Frame (min)",60,1,1440,1);tfrm=in1Minute*tf;
perBull=Param("perBull",20,1,150,1);
perBear=Param("perBear",20,1,150,1);
multBull=Param("multBull",2,0.05,4,0.05);
multBear=Param("multBear",2,0.05,4,0.05);
perc=Param("Percentage Range (S/R lines)",20,0.05,100,0.01);
npiv=Param("N Pivots Used (S/R lines)",1,1,250,1);
disp2=ParamToggle("Display S/R levels","Off|On",0);
disp3=ParamToggle("Display Fibonacci levels","Off|On",0);
nlev=Param("Number of Fib Levels to display",7,0,12,1);
TimeFrameSet(tfrm);
function vstop_func(trBull,trBear)
{
    trailArray[0]=C[0];
    for(i=1;i<BarCount;i++)
    {
        prev=trailArray[i-1];
  
        if(C[i]>prev AND C[i-1]>prev)
        {
            trailArray[i]=Max(prev,C[i]-trBull[i]);
        }
        else if(C[i]<prev AND C[i-1]< prev)
        {
            trailArray[i]=Min(prev,C[i]+trBear[i]);
        }
        else if (C[i]>prev)
        {
            trailArray[i]=C[i]-trBull[i];
        }
        else
        {
            trailArray[i]=C[i]+trBear[i];   
        }
    }
    return trailArray;
}

trBull=multBull*ATR(perBull);
trBear=multBear*ATR(perBear);
trailArray = vstop_func(trBull,trBear);
ts=IIf(trailArray>C,trailArray,Null);
tl=IIf(trailArray<C,trailArray,Null);
TimeFrameRestore();

ts=TimeFrameExpand(ts,tfrm,expandLast);
tl=TimeFrameExpand(tl,tfrm,expandLast);
  
GraphXSpace = 5;
SetChartOptions(0, chartShowDates);
SetBarFillColor(IIf(C>O,ParamColor("Candle Up Color", colorBrightGreen),IIf(C<=O,ParamColor("Candle Down Color", colorRed),colorLightGrey)));
Plot(C,"Price",IIf(C>O,ParamColor("Shadow Up Color", ColorRGB(0,255,0)),IIf(C<=O,ParamColor("Shadow Color", ColorRGB(255,0,0)),colorLightGrey)),64,0,0,0,1);

lll=LLV(L,BarsSince(!IsEmpty(tl)));lll=IIf(ts,lll,Null);llls=lll;
ttt1=IIf((!IsEmpty(ts) AND IsEmpty(Ref(ts,1))) OR BarIndex()==BarCount-1,1,Null);
ttt=ValueWhen(ttt1,lll,0);ttt=IIf(ts,ttt,Null);ttt=IIf(ttt1,Ref(ttt,-1),ttt);
tr=L==ttt;lll=Sum(tr,BarsSince(!IsEmpty(tl)));
qqq=ValueWhen(ttt1,lll,0);qqq=IIf(ts,qqq,Null);qqq=IIf(ttt1,Ref(qqq,-1),qqq);tr=tr AND lll==qqq;
tr=IIf((!IsEmpty(ts) AND IsEmpty(Ref(ts,1)) AND IsEmpty(Ref(ts,-1))),1,tr);//exception
hhh=HHV(H,BarsSince(!IsEmpty(ts)));hhh=IIf(tl,hhh,Null);hhhs=hhh;
ttt1=IIf((!IsEmpty(tl) AND IsEmpty(Ref(tl,1))) OR BarIndex()==BarCount-1,1,Null);
ttt=ValueWhen(ttt1,hhh,0);ttt=IIf(tl,ttt,Null);ttt=IIf(ttt1,Ref(ttt,-1),ttt);
pk=H==ttt;hhh=Sum(pk,BarsSince(!IsEmpty(ts)));
sss=ValueWhen(ttt1,hhh,0);sss=IIf(tl,sss,Null);sss=IIf(ttt1,Ref(sss,-1),sss);pk=pk AND hhh==sss;
pk=IIf((!IsEmpty(tl) AND IsEmpty(Ref(tl,1)) AND IsEmpty(Ref(tl,-1))),1,pk);//exception

px0=ValueWhen(pk,x,0); tx0=ValueWhen(tr,x,0);
px1=ValueWhen(pk,x,1); tx1=ValueWhen(tr,x,1);
px2=ValueWhen(pk,x,2); tx2=ValueWhen(tr,x,2);
ph0=ValueWhen(pk,H,0); tl0=ValueWhen(tr,L,0);
ph1=ValueWhen(pk,H,1); tl1=ValueWhen(tr,L,1);
ph2=ValueWhen(pk,H,2); tl2=ValueWhen(tr,L,2);

minipk=H>=Ref(HHV(H,1),-1) AND Ref(HHV(H,1),1)<H;
minitr=L<=Ref(LLV(L,1),-1) AND Ref(LLV(L,1),1)>L;

switch(tc)
{
case("ZIG"):
aa1=IIf(px0>tx1,(ph0-tl1)/(px0-tx1),0);aa1=IIf(pk,Ref(aa1,-1),aa1);ls1=aa1*(xx-tx1)+tl1;
bb1=IIf(px0>tx1 AND px1<tx1,1,0);bb1=bb1+Ref(bb1,-1);bb1=IIf(bb1,1,0);ls1=IIf(bb1,ls1,Null);
Plot(ls1,"",colorBlue,styleLine,0,0,2,3);
aa1=IIf(tx0>px1,(tl0-ph1)/(tx0-px1),0);aa1=IIf(tr,Ref(aa1,-1),aa1);ls1=aa1*(xx-px1)+ph1;
bb1=IIf(tx0>px1 AND tx1<px1,1,0);bb1=bb1+Ref(bb1,-1);bb1=IIf(bb1,1,0);ls1=IIf(bb1,ls1,Null);
Plot(ls1,"",colorOrange,styleLine,0,0,2,3);
break;
case("VSTOP"):
Plot(ts,"\ntrailShort",colorRed,styleLine,0,0,0,1,1);
Plot(llls,"",colorRed,styleDashed,0,0,0,1,1);
Plot(tl,"\ntrailLong",colorGreen,styleLine,0,0,0,1,1);
Plot(hhhs,"",colorGreen,styleDashed,0,0,0,1,1);
break;
case("ZIG&VSTOP"):
aa1=IIf(px0>tx1,(ph0-tl1)/(px0-tx1),0);aa1=IIf(pk,Ref(aa1,-1),aa1);ls1=aa1*(xx-tx1)+tl1;
bb1=IIf(px0>tx1 AND px1<tx1,1,0);bb1=bb1+Ref(bb1,-1);bb1=IIf(bb1,1,0);ls1=IIf(bb1,ls1,Null);
Plot(ls1,"",colorBlue,styleLine,0,0,0,2,3);
aa1=IIf(tx0>px1,(tl0-ph1)/(tx0-px1),0);aa1=IIf(tr,Ref(aa1,-1),aa1);ls1=aa1*(xx-px1)+ph1;
bb1=IIf(tx0>px1 AND tx1<px1,1,0);bb1=bb1+Ref(bb1,-1);bb1=IIf(bb1,1,0);ls1=IIf(bb1,ls1,Null);
Plot(ls1,"",colorOrange,styleLine,0,0,0,2,3);
Plot(ts,"\ntrailShort",colorRed,styleLine,0,0,0,1,1);
Plot(llls,"",colorRed,styleDashed,0,0,0,1,1);
Plot(tl,"\ntrailLong",colorGreen,styleLine,0,0,0,1,1);
Plot(hhhs,"",colorGreen,styleDashed,0,0,0,1,1);
break;
}

PlotShapes(shapeSmallCircle*tr,colorGreen,0,L,-10);
PlotShapes(shapeSmallCircle*pk,colorRed,0,H,10);

qq=Interval()/60;
if(qq < 60){tf=" min";tt=qq;}
else if(qq >= 60 AND qq < 1440){tf=" hrs";tt=qq/60;}
else if(qq >= 1440){tf=" days";tt=(qq/60)/24;}
qq=Max(tfrm/60,Interval()/60);
if(qq < 60){tfa=" min";tta=qq;}
else if(qq >= 60 AND qq < 1440){tfa=" hrs";tta=qq/60;}
else if(qq >= 1440){tfa=" days";tta=(qq/60)/24;}

Title = Name() + 
"\nChart TF: " + tt + tf + 
"\nZig TF: " + tta + tfa;

dxhm=14;dxlm=10;dxh=0;dxl=0;dyhm=5;dylm=3;dyh=18;dyl=29;hm=30;lm=30;
dyl2=42;dylm2=16;dyhm2=18;dyh2=31;
function GetVisibleBarCount() 
{
    lvb=Status("lastvisiblebar");
    fvb=Status("firstvisiblebar");
    return Min(lvb-fvb,BarCount-fvb);
} 
function GfxConvertPixelsToBarX(Pixels)
{
    lvb=Status("lastvisiblebar");
    fvb=Status("firstvisiblebar");
    pxchartleft=Status("pxchartleft");
    pxchartwidth=Status("pxchartwidth");
    fac=pxchartwidth/Pixels;
    bar=(lvb-fvb)/fac;
    return bar;
} 
function GfxConvertPixelToValueY(Pixels) 
{
    local Miny,Maxy,pxchartbottom,pxchartheight;
    Miny=Status("axisminy");
    Maxy=Status("axismaxy");
    pxchartbottom=Status("pxchartbottom");
    pxchartheight=Status("pxchartheight");
    fac=pxchartheight/Pixels;
    Value=(Maxy-Miny)/fac;
    return Value;
} 

ll=tr AND tl1<tl2;
hl=tr AND tl1>tl2;
hh=pk AND ph1>ph2;
lh=pk AND ph1<ph2;
dt=pk AND ph1==ph2;
db=tr AND tl1==tl2;

miny=Status("axisminy");
maxy=Status("axismaxy");
AllVisibleBars=GetVisibleBarCount();
fvb=Status("firstvisiblebar");
LowMargin=Miny+GfxConvertPixelToValueY(lm);
HighMargin=Maxy-GfxConvertPixelToValueY(hm);
dyllm=GfxConvertPixelToValueY(dylm);
dyhhm=GfxConvertPixelToValueY(dyhm);
dyll=GfxConvertPixelToValueY(dyl);
dyhh=GfxConvertPixelToValueY(dyh);
dxllm=GfxConvertPixelsToBarX(dxlm);
dxhhm=GfxConvertPixelsToBarX(dxhm);
dxll=GfxConvertPixelsToBarX(dxl);
dxhh=GfxConvertPixelsToBarX(dxh);

dyllm2=GfxConvertPixelToValueY(dylm2);
dyll2=GfxConvertPixelToValueY(dyl2);
dyhhm2=GfxConvertPixelToValueY(dyhm2);
dyhh2=GfxConvertPixelToValueY(dyh2);

if(disp0)
{
for(i=0;i<AllVisibleBars;i++) 
{
    // HH,HL etc. labels
    if(ll[i+fvb] AND L[i+fvb]>LowMargin) PlotText("LL",i+fvb+dxll,L[i+fvb]-dyll,colorWhite,colorDefault);
    if(ll[i+fvb] AND L[i+fvb]<=LowMargin) PlotText("LL",i+fvb+dxll+dxllm,L[i+fvb]-dyllm,colorWhite,colorDefault);
    if(hl[i+fvb] AND L[i+fvb]>LowMargin) PlotText("HL",i+fvb+dxll,L[i+fvb]-dyll,colorWhite,colorDefault);
    if(hl[i+fvb] AND L[i+fvb]<=LowMargin) PlotText("HL",i+fvb+dxll+dxllm,L[i+fvb]-dyllm,colorWhite,colorDefault);
    if(db[i+fvb] AND L[i+fvb]>LowMargin) PlotText("DB",i+fvb+dxll,L[i+fvb]-dyll,colorWhite,colorDefault);
    if(db[i+fvb] AND L[i+fvb]<=LowMargin) PlotText("DB",i+fvb+dxll+dxllm,L[i+fvb]-dyllm,colorWhite,colorDefault);    
    if(hh[i+fvb] AND H[i+fvb]<HighMargin) PlotText("HH",i+fvb+dxhh,H[i+fvb]+dyhh,colorWhite,colorDefault);
    if(hh[i+fvb] AND H[i+fvb]>=HighMargin) PlotText("HH",i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm,colorWhite,colorDefault);   
    if(lh[i+fvb] AND H[i+fvb]<HighMargin) PlotText("LH",i+fvb+dxhh,H[i+fvb]+dyhh,colorWhite,colorDefault);
    if(lh[i+fvb] AND H[i+fvb]>=HighMargin) PlotText("LH",i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm,colorWhite,colorDefault);       
    if(dt[i+fvb] AND H[i+fvb]<HighMargin) PlotText("DT",i+fvb+dxhh,H[i+fvb]+dyhh,colorWhite,colorDefault);
    if(dt[i+fvb] AND H[i+fvb]>=HighMargin) PlotText("DT",i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm,colorWhite,colorDefault);
}
}
if(disp1)
{
for(i=0;i<AllVisibleBars;i++)    
{
    // value labels at HH,HL etc.
    if(ll[i+fvb] AND L[i+fvb]>LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll,L[i+fvb]-dyll2,colorWhite,colorDefault);
    if(ll[i+fvb] AND L[i+fvb]<=LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll+dxllm,L[i+fvb]-dyllm2,colorWhite,colorDefault);
    if(hl[i+fvb] AND L[i+fvb]>LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll,L[i+fvb]-dyll2,colorWhite,colorDefault);
    if(hl[i+fvb] AND L[i+fvb]<=LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll+dxllm,L[i+fvb]-dyllm2,colorWhite,colorDefault);
    if(db[i+fvb] AND L[i+fvb]>LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll,L[i+fvb]-dyll2,colorWhite,colorDefault);
    if(db[i+fvb] AND L[i+fvb]<=LowMargin) PlotText(""+L[i+fvb],i+fvb+dxll+dxllm,L[i+fvb]-dyllm2,colorWhite,colorDefault);    
    if(hh[i+fvb] AND H[i+fvb]<HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh,H[i+fvb]+dyhh2,colorWhite,colorDefault);
    if(hh[i+fvb] AND H[i+fvb]>=HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm2,colorWhite,colorDefault);   
    if(lh[i+fvb] AND H[i+fvb]<HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh,H[i+fvb]+dyhh2,colorWhite,colorDefault);
    if(lh[i+fvb] AND H[i+fvb]>=HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm2,colorWhite,colorDefault);       
    if(dt[i+fvb] AND H[i+fvb]<HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh,H[i+fvb]+dyhh2,colorWhite,colorDefault);
    if(dt[i+fvb] AND H[i+fvb]>=HighMargin) PlotText(""+H[i+fvb],i+fvb+dxhh+dxhhm,H[i+fvb]+dyhhm2,colorWhite,colorDefault);
}
}
if(disp2)
{
miny=LastVisibleValue(C)-LastVisibleValue(C)/100*perc;
maxy=LastVisibleValue(C)+LastVisibleValue(C)/100*perc;
for (i=1;i<=npiv;i++)
{
    rr=ValueWhen(pk,H,i);
    rr=IIf(rr>maxy OR rr<miny,Null,rr);
    ss=ValueWhen(tr,L,i);
    ss=IIf(ss>maxy OR ss<miny,Null,ss);
    Plot(rr,"",colorBlue,styleNoLine|styleDots,0,0,0,-1);    
    Plot(ss,"",colorRed,styleNoLine|styleDots,0,0,0,-1);
}
}
if(disp3)
{
fiblevel[0]=0;fiblevel[1]=0.23;fiblevel[2]=0.38;fiblevel[3]=0.5;fiblevel[4]=0.62;
fiblevel[5]=0.78;fiblevel[6]=1;fiblevel[7]=1.27;fiblevel[8]=1.62;fiblevel[9]=2;
fiblevel[10]=2.62;fiblevel[11]=4.24;
rr=ValueWhen(pk,H,1);
ss=ValueWhen(tr,L,1);
delta=rr-ss;
fvb=Status("firstvisiblebar");
for(i=0;i<nlev;i++)
{
    l1=IIf(Flip(tr,pk),ValueWhen(tr,ss+delta*fiblevel[i]),Null);
    Plot(l1,"",ColorRGB(255-15*i,0,0),1);
    l2=IIf(Flip(pk,tr),ValueWhen(pk,rr-delta*fiblevel[i]),Null);
    Plot(l2,"",ColorRGB(0,255-15*i,0),1);   
    for(j=0;j<AllVisibleBars;j++) 
    {
        if(tr[j+fvb]) PlotText(""+NumToStr(fiblevel[i]),fvb+j,l1[fvb+j],colorWhite);
        if(pk[j+fvb]) PlotText(""+NumToStr(fiblevel[i]),fvb+j,l2[fvb+j],colorWhite);
    }
}
}
_SECTION_END();
//Fibonacci cluster

_SECTION_BEGIN("Background");
    SetChartOptions(0,chartShowArrows|chartShowDates);
    SetChartBkColor(ParamColor("Outer panel",colorWhite)); // color of outer border 
    SetChartBkGradientFill( ParamColor("Inner panel upper",colorWhite),ParamColor("Inner panel lower",colorWhite));
    tchoice=Param("Title Selection ",2,1,2,1);

//Plot(C, "", IIf(O>=C, colorOrange, colorGreen), ParamStyle(“Price Style”,styleCandle,maskPrice));
//////////////////////////////////////////////////////////////////
_SECTION_BEGIN("Fib Retracements");
    fibs = ParamToggle("Plot Fibs","Off|On",1);
    pctH = Param ("Pivot Hi %", 0.325,0.001,2.0,0.002);
    HiLB = Param ("Hi LookBack",1,1,BarCount-1,1);
    pctL = Param ("Pivot Lo %", 0.325,0.001,2.0,0.002);
    LoLB = Param ("Lo LookBack",1,1,BarCount-1,1);
    Back = Param ("Extend Left = 2",1,1,500,1);
    Fwd  = Param("Plot Forward", 0, 0, 500, 1);
    text = ParamToggle("Plot Text","Off|On",1);
    hts  = Param ("Text Shift", -33.5,-50,50,0.10);
    style =ParamStyle("Line Style",styleLine,styleNoLabel);
x = BarIndex();
pRp  = PeakBars( H, pctH, 1) == 0;
yRp0 = SelectedValue(ValueWhen( pRp, H, HiLB));
xRp0 = SelectedValue(ValueWhen( pRp, x, HiLB));
pSp  = TroughBars( L, pctL, 1) == 0;
ySp0 = SelectedValue(ValueWhen( pSp, L, LoLB));
xSp0 = SelectedValue(ValueWhen( pSp, x, LoLB));
Delta = yRp0 - ySp0;

function fib(ret)
{
retval = (Delta * ret);
Fibval = IIf(ret < 1.0 
AND xSp0 < xRp0, yRp0 - retval, IIf(ret < 1.0 
AND xSp0 > xRp0, ySp0 + retval,IIf(ret > 1.0 
AND xSp0 < xRp0, yRp0 - retval, IIf(ret > 1.0 
AND xSp0 > xRp0, ySp0 + retval, Null)))); 
return FibVal;
}

x0 = Min(xSp0,xRp0)-Back;
x1 = (BarCount -1);
//////////////////////////////////////////////////////////////////
r236 = fib(0.236);  r236I = LastValue (r236,1);
r382 = fib(0.382);  r382I = LastValue (r382,1);
r050 = fib(0.50);       r050I = LastValue (r050,1);
r618 = fib(0.618);  r618I = LastValue (r618,1);
r786 = fib(0.786);  r786I = LastValue (r786,1);
e127 = fib(1.27);       e127I = LastValue (e127,1);
e162 = fib(1.62);       e162I = LastValue (e162,1);
e200 = fib(2.00);       e200I = LastValue (e200,1);
e262 = fib(2.62);       e262I = LastValue (e262,1);
e424 = fib(4.24);       e424I = LastValue (e424,1);
//////////////////////////////////////////////////////////////////
p00 = IIf(xSp0 > xRp0,ySp0,yRp0);    p00I = LastValue (p00,1);
p100 = IIf(xSp0 < xRp0,ySp0,yRp0);   p100I = LastValue (p100,1);
color00 =IIf(xSp0 > xRp0,colorLime,colorRed);
color100 =IIf(xSp0 < xRp0,colorLime,colorRed);
//////////////////////////////////////////////////////////////////
numbars = LastValue(Cum(Status("barvisible")));
fraction= IIf(StrRight(Name(),3) == "", 3.2, 3.2);
//////////////////////////////////////////////////////////////////
if(fibs==1)
{
Plot(LineArray(xRp0-Fwd,yRp0,x1,yRp0,Back),"PR",32,8|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(xSp0-Fwd,ySp0,x1,ySp0,Back),"PS",27,8|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,r236,x1,r236,Back),"",45,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,r382,x1,r382,Back),"",44,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,r050,x1,r050,Back),"",41,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,r618,x1,r618,Back),"",43,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,r786,x1,r786,Back),"",42,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,e127,x1,e127,Back),"e127",47,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,e162,x1,e162,Back),"e162",47,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,e200,x1,e200,Back),"p200",47,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,e262,x1,e262,Back),"p262",47,style|styleNoRescale,Null, Null,Fwd);
Plot(LineArray(x0-Fwd,e424,x1,e424,Back),"p424",25,style|styleNoRescale,Null, Null,Fwd);
}
//////////////////////////////////////////////////////////////////
if(text==1)
{ 
PlotText(" 0% = " + WriteVal(p00,fraction),     LastValue(BarIndex())-(numbars/hts), p00I  + 0.05, color00);
PlotText("23% = " + WriteVal(r236,fraction), LastValue(BarIndex())-(numbars/hts), r236I + 0.05, 45);
PlotText("38% = " + WriteVal(r382,fraction), LastValue(BarIndex())-(numbars/hts), r382I + 0.05, 44);
PlotText("50% = " + WriteVal(r050,fraction), LastValue(BarIndex())-(numbars/hts), r050I + 0.05, 41);
PlotText("62% = " + WriteVal(r618,fraction), LastValue(BarIndex())-(numbars/hts), r618I + 0.05, 43);
PlotText("78% = " + WriteVal(r786,fraction), LastValue(BarIndex())-(numbars/hts), r786I + 0.05, 42);
PlotText("100% = " + WriteVal(p100,fraction), LastValue(BarIndex())-(numbars/hts),p100I + 0.05, color100);
PlotText("127% = " + WriteVal(e127,fraction), LastValue(BarIndex())-(numbars/hts),e127I + 0.05, 47);
PlotText("162% = " + WriteVal(e162,fraction), LastValue(BarIndex())-(numbars/hts),e162I + 0.05, 47);
PlotText("200% = " + WriteVal(e200,fraction), LastValue(BarIndex())-(numbars/hts),e200I + 0.05, 47);
PlotText("262% = " + WriteVal(e262,fraction), LastValue(BarIndex())-(numbars/hts),e262I + 0.05, 47);
PlotText("424% = " + WriteVal(e424,fraction), LastValue(BarIndex())-(numbars/hts),e424I + 0.05, 25);
}
_SECTION_END();
//////////////////////////////////////////////////////////////////
if (tchoice==1 ) 
{
_N(Title = EncodeColor(colorBlack)+StrFormat(" {{NAME}} -   {{INTERVAL}}      {{DATE}}    Open:  %g,    High:  %g,     Low:  %g,     Close:  %g     {{VALUES}}",O, H, L, C, SelectedValue( ROC( C, 1   ) ) ));
}
//////////////////////////////////////////////////////////////////
if (tchoice==2 ) 
{
Title = EncodeColor(colorBlack)+  Date() + "   Tick = " + EncodeColor(5) + Interval()+
EncodeColor(colorBlack) + "     Open = " + EncodeColor(colorBlack) + O + 
EncodeColor(colorBlack) + "     High = " + EncodeColor(5) + H +
EncodeColor(colorBlack) + "      Low = " + EncodeColor(colorRed) + L + 
EncodeColor(colorBlack) + "     Close = " + EncodeColor(colorBlack) + C + "\n" +
EncodeColor( colorBlack) +"_______________"+"\n"+
EncodeColor( colorBlack)  + "424%   =  "    +   EncodeColor(25)+ e424 + " " +"\n"+
EncodeColor( colorBlack)  + "262%   =  "    +   EncodeColor(47)+ e262 + " " +"\n"+
EncodeColor( colorBlack)  + "200%   =  "    +   EncodeColor(47)+ e200 + " " +"\n"+
EncodeColor( colorBlack)  + "162%   =  "    +   EncodeColor(47)+ e162 + " " +"\n"+
EncodeColor( colorBlack)  + "127%   =  "    +   EncodeColor(47)+ e127 + " " +"\n"+
EncodeColor( colorYellow) + "  Res    =  "  +   EncodeColor(32)+ p100 + " " +"\n"+
EncodeColor( colorBlack)  + "  78%   =  "   +   EncodeColor(42)+ r786 + " " +"\n"+
EncodeColor( colorBlack)  + "  62%   =  "   +   EncodeColor(43)+ r618 + " " +"\n"+
EncodeColor( colorBlack)  + "  50%   =  "   +   EncodeColor(41)+ r050 + " " +"\n"+
EncodeColor( colorBlack)  + "  38%   =  "   +   EncodeColor(44)+ r382 + " " +"\n"+
EncodeColor( colorBlack)  + "  23%   =  "   +   EncodeColor(45)+ r236+ " " +"\n"+
EncodeColor( colorYellow) + "  Sup   =   "  +   EncodeColor(34)+ p00 + " " ;
}
GraphXSpace=5;

_SECTION_BEGIN("BACK COLR");
SetChartBkGradientFill( ParamColor("BgTop", ColorRGB( 172,172,172 )),

ParamColor("BgBottom", ColorRGB( 172,172,172 )),ParamColor("titleblock",ColorRGB( 172,172,172 )));
_SECTION_END();
Back