// Downloaded From https://www.WiseStockTrader.com
//HARMONIC index me AND credibility High, especially when the models in the Tops AND Bottoms was developed by the Forum AND repeat for the benefit of 
//AND interested in the models on the RSI () 
_SECTION_BEGIN ("EMA Time Frame"); r = RSI (14);
 Plot (r, "" , colorBlack, styleDots + styleThick); 
W1 = ValueWhen (HHV (r, 14), r, 2); Plot (30, "", colorDarkRed); 
Plot (50, "", colorWhite, styleDashed); Plot (70, "", colorBlack);
 Numbars = LastValue (Cum (Status ("Barvisible"))); 
fraction = IIf (StrRight (Name (), 3) == "", 3.2,3.2); 
hts = Param ("Text Shift ", -50, -100,100,10); 
PlotText (">>>" + WriteVal (r, fraction), SelectedValue (BarIndex ()) - (Numbars / hts), SelectedValue (r), 1);
 ax=  Param ("Swing B Min.", 0.55,0.3,1,0.01); 


GBmax  = Param ("Swing b max.", 0.72,0.3,1.27,0.01); 
GBmin  = Param ("Swing b min.", 0.72,0.3,1.27,0.01);  
GCmin = Param ("Swing C Min." ,0.38,0.3,1.27,0.01); 
GCmax = Param ("Swing C Max.", 1.0,0.4,1.27,0.01); 
GDmin = Param ("Swing D Min. (XA)", 0.55,0.3,1,0.01 ); 
GDmax = Param ("Swing D Max. (XA)", 1.0,0.4,1.0,0.01); 
_SECTION_END ();
 _SECTION_BEGIN ("Bat"); BatBmin = Param ("Swing B Min.", 0.38,0.3 , 1,0.01); 
BatBmax = Param ("Swing B Max.", 0.55,0.4,1,0.01); 
BatCmin = Param ("Swing C Min.", 0.38,0.3,1.62,0.01); 
BatCmax = Param ( "Swing C Max.", 1.27,0.4,1.62,0.01); 
BatDmin = Param ("Swing D Min. (XA)", 0.5,0.3,1,0.01); 
BatDmax = Param ("Swing D Max. (XA ) ", 1.0,0.4,1.0,0.01);
 _SECTION_END (); _SECTION_BEGIN ("Butterfly"); 
BtBmin = Param ("Swing B Min.", 0.55,0.3,1,0.01); 
BtBmax = Param ("Swing B Max. ", 0.9,0.4,1,0.01); 
BtCmin = Param ("Swing C Min.", 0.38,0.3,1.62,0.01); 
BtCmax = Param ("Swing C Max.", 1.27,0.4,1.62, 0.01); 
BtDmin = Param ("Swing D Min. (XA)", 1,1,1.8,0.01);
 BtDmax = Param ("Swing D Max. (XA)", 1.38,1,1.8,0.01); 
_SECTION_END ();
 _SECTION_BEGIN ("Crab"); CBmin = Param ("Swing B Min.", 0.38,0.3,1,0.01); 
CBmax = Param ("Swing B Max.", 0.65,0.4,1,0.01); 
CCmin = Param ("Swing C Min.", 0.38,0.3,1.62,0.01); 
CCmax = Param ("Swing C Max.", 1.270,0.4,1.62,0.01); 
CDmin = Param ("Swing D Min. ( XA) ", 1.25,1,1.8,0.01); 
CDmax = Param ("Swing D Max. (XA)", 1.8,1,2,0.01);
 _SECTION_END ();
 _SECTION_BEGIN ("Patterns"); 
strength = Param ("Strength", 5,2,15,1); 
bu = ParamToggle ("Bullish Pattern", "Off | On", 1);
 be = ParamToggle ("Bearish Pattern", "Off | On", 1);
 bi = Cum (1) -1; 
function GetTop (bars) 
{ r = Top = HHV (r, 2 * bars) AND Ref (HHV (r, bars), bars) <r; 
Top = Top AND LastValue (bi )-ValueWhen (Top, bi)> bars; return Top; } 
function GetValley (bars) { Valley = W1 == LLV (W1, 2 * bars) AND Ref (LLV (W1, bars), bars)> W1;
 Valley = Valley AND LastValue (bi)-ValueWhen (Valley, bi)> bars; return Valley; }
 P1 = GetTop (strength); V1 = GetValley (Strength);
 P1 = IIf (P1, IIf (ValueWhen (P1, bi, 2 ) <ValueWhen (V1, bi), P1, IIf (ValueWhen (P1, r, 2)> r, False, P1)), P1);
 P1 = IIf (P1 AND ValueWhen (P1, bi, 0)> bi AND NOT (ValueWhen (V1, bi, 0)> 0 AND ValueWhen (V1, bi, 0) <ValueWhen (P1, bi, 0)), IIf (ValueWhen (P1, r) <= ValueWhen (P1, r, 0) , False, P1), P1);
 V1 = IIf (V1, IIf (ValueWhen (V1, bi, 2) <ValueWhen (P1, bi), V1, IIf (ValueWhen (V1, W1, 2) <W1, False, V1)), V1); 
V1 = IIf (V1 AND ValueWhen (V1, bi, 0)> bi AND NOT (ValueWhen (P1, bi, 0)> bi AND ValueWhen (P1, bi, 0) <ValueWhen (V1, bi, 0)), IIf (ValueWhen (V1, W1)>=  ValueWhen (V1, W1, 0), False, V1), V1); 
P1H1 = ValueWhen (P1, r); P1Bar1 = ValueWhen (P1, bi) ; P1H2 = ValueWhen (P1, r, 2);
 P1Bar2 = ValueWhen (P1, bi, 2); 
V1L1 = ValueWhen (V1, W1);
 V1Bar1 = ValueWhen (V1, bi); 
V1L2 = ValueWhen (V1, W1, 2 ); V1Bar2 = ValueWhen (V1, bi, 2); PTvalid = (P1Bar1> V1Bar1 AND V1Bar1> P1Bar2 AND P1bar2> V1Bar2) AND P1; 
BullGartley4 = PTvalid AND (P1H2-V1L1) / (P1H2-V1L2)> GBmin AND ( P1H2-V1L1) / (P1H2-V1L2) <GBmax AND (P1H1-V1L1) / (P1H2-V1L1)> GCMin AND (P1H1-V1L1) / (P1H2-V1L1) <GCMax; 
BullBat4 = PTvalid AND (P1H2-V1L1) / (P1H2-V1L2)> BatBmin AND (P1H2-V1L1) / (P1H2-V1L2) <BatBmax AND (P1H1-V1L1) / (P1H2-V1L1)> BatCMin AND (P1H1-V1L1) / (P1H2-V1L1) <BatCMax ; 

BullButterfly4 = PTvalid AND (P1H2-V1L1) / (P1H2-V1L2)> BtBmin AND (P1H2-V1L1) / (P1H2-V1L2) <BtBMax AND (P1H1-V1L1) / (P1H2-V1L1)> BtCmin AND (P1H1- V1L1) / (P1H2-V1L1) <BtCmax; BullCrab4 = PTvalid AND (P1H2-V1L1) / (P1H2-V1L2)> CBmin AND (P1H2-V1L1) / (P1H2-V1L2) <CBmax AND (P1H1-V1L1) / ( P1H2-V1L1)> CCmin AND (P1H1-V1L1) / (P1H2-V1L1) <CCmax;
 BullGartley = IIf (LowestSince (BullGartley4, W1) <ValueWhen (BullGartley4, P1H2)
 - (ValueWhen (BullGartley4, P1H2)-ValueWhen (BullGartley4 ,V1L2)) * GDmin AND 
LowestSince (BullGartley4, W1)> ValueWhen (BullGartley4, P1H2) - (ValueWhen (BullGartley4, P1H2)
-ValueWhen (BullGartley4, V1L2)) * GDmax AND HighestSince (BullGartley4, r) <= ValueWhen (BullGartley4 , P1H1) AND 
LowestSince (BullGartley4, W1) == W1, True, False); 
BullGartley = BullGartley AND LowestSince (BullGartley4, W1) <ValueWhen (BullGartley4, V1L1); 
BullBat = IIf (LowestSince (BullBat4, W1) <ValueWhen ( BullBat4, P1H2) - (ValueWhen (BullBat4, P1H2)
-ValueWhen (BullBat4, V1L2)) * BatDmin AND LowestSince (BullBat4, W1)> ValueWhen (BullBat4, P1H2)
 - (ValueWhen (BullBat4, P1H2)-ValueWhen (BullBat4, V1L2 )) * BatDmax AND 
HighestSince (BullBat4, r) <= ValueWhen (BullBat4, P1H1) AND LowestSince (BullBat4, W1) == W1, True, False);
 BullBat = BullBat AND LowestSince (BullCrab4, W1) <ValueWhen (BullCrab4 ,V1L1); BullCrab = IIf (LowestSince (BullCrab4, W1) <ValueWhen (BullCrab4, P1H2) 
- (ValueWhen (BullCrab4, P1H2)-ValueWhen (BullCrab4, V1L2)) * CDmin AND LowestSince (BullCrab4, W1)> ValueWhen (BullCrab4 ,P1H2) - (ValueWhen (BullCrab4, P1H2)
-ValueWhen (BullCrab4, V1L2)) * CDmax AND HighestSince (BullCrab4, r) <= ValueWhen (BullCrab4, P1H1) AND LowestSince (BullGartley4, W1) == W1, True, False) ; 
BullCrab = BullCrab AND LowestSince (BullCrab4, W1) <ValueWhen (BullCrab4, V1L2); BullButterfly = IIf (LowestSince (BullButterfly4, W1) 
AND LowestSince (BullButterfly4, W1) AND HighestSince (BullButterfly4, r) <= ValueWhen (BullButterfly4, P1H1) AND LowestSince (BullButterfly4, W1) == W1, True, False); 
BullButterfly = BullButterfly AND LowestSince (BullButterfly4, W1) <ValueWhen (BullButterfly4, V1L2); 
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, W1); 
Dbar = ValueWhen (BullHar, bi);
 ABdXA = (A-B) / (A-X);
 BCdAB = (C1-B) / (A-B); 
ADdXA = (A-b) / (A-X); 
BCdCD = (C1 -D) / (C1-B); 
PlotPattern = Dbar> C1bar; 
if (LastValue (PlotPattern) AND bu) 

Plot (LineArray (LastValue (Xbar), LastValue (X), LastValue (Abar), LastValue (A)) , "", colorBlue, styleThick); 
Plot (LineArray (LastValue (Abar), LastValue (A), LastValue (Bbar), LastValue (B)), "", colorBlue, styleThick); 
Plot (LineArray (LastValue ( Bbar), LastValue (B), LastValue (C1bar), LastValue (C1)), "" ,colorBlue, styleDashed); 
Plot (LineArray (LastValue (Xbar), LastValue (X), LastValue (Abar), LastValue (A)), "", colorBlue, styleThick); 
Plot (LineArray (LastValue (Abar), LastValue ( A), LastValue (C1bar), LastValue (C1)), "" ,colorBlue, styleDashed); 
Plot (LineArray (LastValue (Xbar), LastValue (X), LastValue (Dbar), LastValue (D)), "", C = (V1Bar1> P1Bar1 AND P1Bar1> V1Bar2 AND V1Bar2> P1Bar2) AND V1); 


BearGartley4 = PTvalid AND (P1H1-V1L2) / (P1H2-V1L2)> GBmin AND (P1H1-V1L2) / (P1H2-V1L2) <GBmax AND ( P1H1-V1L1) / (P1H1-V1L2)> GCmin AND (P1H1-V1L1) / (P1H1-V1L2) <GCmax;
 
BearBat4 = PTvalid AND (P1H1-V1L2) / (P1H2-V1L2)> BatBmin AND (P1H1-V1L2) / (P1H2-V1L2) <BatBmax AND (P1H1-V1L1) / (P1H1-V1L2)> BatCmin AND (P1H1-V1L1) / (P1H1-V1L2) <BatCmax;
 
BearButterfly4 = PTvalid AND (P1H1-V1L2) / (P1H2- V1L2)> BtBmin AND (P1H1-V1L2) / (P1H2-V1L2) <BtBmax AND (P1H1-V1L1) / (P1H1-V1L2)> BtCmin AND (P1H1-V1L1) / (P1H1-V1L2) <BtCmax; BearCrab4 = PTvalid AND (P1H1-V1L2) / (P1H2-V1L2)> CBmin AND (P1H1-V1L2) / (P1H2-V1L2) <CBmax AND (P1H1-V1L1) / (P1H1-V1L2)> CCmin AND (P1H1-V1L1) / ( P1H1-V1L2) <CCmax; 
BearGartley = IIf (HighestSince (BearGartley4, r)> ValueWhen (BearGartley4, V1L2) + (ValueWhen (BearGartley4, P1H2) - ValueWhen (BearGartley4, V1L2)) * GDmin AND HighestSince (BearGartley4, r) < ValueWhen (BearGartley4, V1L2) + (ValueWhen (BearGartley4, P1H2) - ValueWhen (BearGartley4, V1L2)) * GDMax AND LowestSince (BearGartley4, W1)>  ValueWhen (BearGartley4, V1L1) AND HighestSince (BearGartley4, r) == r, True, False); BearGartley = BearGartley AND HighestSince (BearGartley4, r)> ValueWhen (BearGartley4, P1H1);
 BearBat = IIf ((HighestSince (BearBat4, r)> ValueWhen (BearBat4, V1L2) + (ValueWhen (BearBat4, P1H2) - ValueWhen (BearBat4, V1L2)) * BatDmin AND HighestSince (BearBat4, r) <ValueWhen (BearBat4, V1L2) + (ValueWhen (BearBat4, P1H2) - ValueWhen (BearBat4, V1L2)) * BatDMax AND LowestSince (BearBat4, W1)>  ValueWhen (BearBat4, V1L1) AND HighestSince (BearBat4, r) == r), True, False);
 BearBat = BearBat AND HighestSince (BearBat4, r)> ValueWhen (BearBat4, P1H1); 
BearHar4 = BearGartley4 OR BearButterfly4 OR BearBat4 OR BearCrab4; 
//BullHar4 = BullGartley4 OR BullButterfly4 OR BullBat4 OR BullCrab4; 

BearButterfly = IIf (HighestSince (BearButterfly4, r )> ValueWhen (BearButterfly4, V1L2) + (ValueWhen (BearButterfly4, P1H2) - ValueWhen (BearButterfly4, V1L2)) * BtDmin AND HighestSince (BearButterfly4, r) <ValueWhen (BearButterfly4, V1L2) + (ValueWhen (BearButterfly4, P1H2) - ValueWhen (BearButterfly4, V1L2)) * BtDMax AND LowestSince (BearButterfly4, W1)>  ValueWhen (BearButterfly4, V1L1) AND HighestSince (BearButterfly4, r) == r, True, False);
 BearButterfly = BearButterfly AND HighestSince (BearButterfly4, r)> ValueWhen (BearButterfly4, P1H2);
 BearCrab = IIf (HighestSince (BearCrab4, r)> ValueWhen (BearCrab4, V1L2) + (ValueWhen (BearCrab4, P1H2) - ValueWhen (BearCrab4, V1L2)) * CDmin AND HighestSince (BearCrab4, r) < ValueWhen (BearCrab4, V1L2) + (ValueWhen (BearCrab4, P1H2) - ValueWhen (BearCrab4, V1L2)) * CDMax AND LowestSince (BearCrab4, W1)>  ValueWhen (BearCrab4, V1L1) AND HighestSince (BearCrab4, r) == r, True, False); 
BearCrab = BearCrab AND HighestSince (BearCrab4, r)> ValueWhen (BearCrab4, P1H2); 
BearHar = 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, r);
 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; 
if (LastValue (Plotpattern) AND be)
 { Plot (LineArray (LastValue (Xbar), LastValue (X), LastValue (Abar), LastValue (A)), "", colorWhite, styleThick); 
Plot (LineArray (LastValue (Abar), LastValue (A), LastValue ( Bbar), LastValue (B)), "", colorWhite, styleThick); 
Plot (LineArray (LastValue (Bbar), LastValue (B), LastValue (C1bar), LastValue (C1)), "" ,colorWhite, styleThick); 
Plot (LineArray (LastValue (Abar), LastValue (A), LastValue (C1bar), LastValue (C1)), "" , 
(LastValue (Dbar) + LastValue (Xbar)) / 2, (LastValue (D) + LastValue (X)) / 2, colorWhite); } 

LatPattern = bullHar OR bearHar;
Lastpattern = LastValue(ValueWhen(LatPattern,IIf(BullGartley,1,IIf(BearGartley,-1,IIf(BullBat,2,IIf(BearBat,-2,
IIf(BullButterfly,3,IIf(BearButterfly,-3,IIf(BullCrab,4,IIf(BearCrab,-4,Null))))))))));
PatternName = WriteIf(LastPattern == 1,"Bullish Gartley",WriteIf(LastPattern == -1,"Bearish Gartley",WriteIf(LastPattern == 2,"Bullish Bat",
WriteIf(LastPattern == -2,"Bearish Bat",WriteIf(LastPattern == 3,"Bullish Butterfly",WriteIf(LastPattern == -3,"Bearish Butterfly",
WriteIf(LastPattern == 4,"Bullish Crab",WriteIf(LastPattern == -4,"Bearish Crab","None"))))))));


 PlotShapes (IIf (BearHar, shapeSmallDownTriangle, shapeNone), colorBlack, 0, r, -13);

SetChartBkGradientFill (ParamColor ("BgTop", colorBrightGreen), ParamColor ("BgBottom", colorGreen)); 
SetChartBkColor (ParamColor ("Outer panel", colorYellow)); 


PlotFractals =ParamToggle("PlotFractals","Show|Hide",1);

if (PlotFractals) {
GfxSetTextColor (IIf (LastPattern> 0, colorGreen, colorYellow)); 
GfxTextOut ("Last Pattern:" + PatternName, 0,50); 
}
_SECTION_END ();   



_SECTION_BEGIN ("AuthorName"); 
k = (GetPerformanceCounter () / 100)% 100; 
printf ("GetPerformance Counter% g" , k); 
GfxSelectFont ("Jokerman", 14,800);
 GfxSetBkMode (1); 
GfxSetTextColor (colorWhite);
 GfxTextOut (" AMIBROKER", -10 + k, 20); 
RequestTimedRefresh (10); 
_SECTION_END (); 
_SECTION_BEGIN ( "CompanySympole"); 
{GfxSelectFont ("Croobie", 15,800); 
GfxSetBkMode (1); 
GfxSetTextColor (colorWhite); 
GfxTextOut (Name (), 235,20); }
 _SECTION_END ();
 _SECTION_BEGIN ("CompanyClos"); 
{GfxSelectFont ("FRENCH SCRIPT MT", 20, 800); 
GfxSetBkMode (1); GfxSetTextColor (colorWhite);
 GfxTextOut ("C =" + C + "", 850 ,200); }
 _SECTION_END (); 
_SECTION_BEGIN ("CompanyHigh"); 
{GfxSelectFont ("FRENCH SCRIPT MT", 17, 800); 
GfxSetBkMode (1); GfxSetTextColor (colorCustom13); 
GfxTextOut ("H =" + H + "", 750,20); } 
_SECTION_END ();
 _SECTION_BEGIN ("CompanyOpen");
 {GfxSelectFont ("FRENCH SCRIPT MT", 17, 800); GfxSetBkMode (1); 
GfxSetTextColor (colorWhite); 
GfxTextOut ("O =" + O + "", 650,20); }
 _SECTION_END ();
 _SECTION_BEGIN ("CompanyLow" ); 
{GfxSelectFont ("FRENCH SCRIPT MT", 17, 800); 
GfxSetBkMode (1); 
GfxSetTextColor (colorYellow); 
GfxTextOut ("L =" + L + "", 550,20); 
}
 _SECTION_END ();