// Downloaded From https://www.WiseStockTrader.com
_SECTION_BEGIN("MACD");
r= MACD(10, 22);
W1=ValueWhen(HHV(r,14),r,2);
dd= Signal(10,22,5);
mycolor = IIf(r<0 AND r>dd, colorBrightGreen,IIf(r>0 AND r>dd, colorGreen,IIf(r>0 AND r
0, colorBrightGreen, colorRed);
Hist=r-dd;
Plot(0,"",34,styleLine+styleThick);
Plot( r-dd, "MACD Histogram", IIf(r-dd > 0,colorBrightGreen,colorRed ), styleNoTitle | ParamStyle("Histogram style",styleHistogram |styleThick| styleNoLabel, maskHistogram ));
Plot(MA((r-dd),1) ,"",31,styleLine+styleThick);
numbars = SelectedValue(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),2);
SetChartBkColor( ParamColor("background",colorBlack));
Buy= Cross(MACD(10,22),Signal(10,22,5));
Sell = Cross( Signal(10, 22, 5), MACD(10,22) );
PlotShapes(IIf(Buy,shapeSmallSquare,shapeNone),colorGreen,0,r,Offset=-30);
PlotShapes(IIf(Buy,shapeSmallSquare,shapeNone),colorLime,0,r,Offset=-40);
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorWhite,0,r,Offset=-35);
PlotShapes(IIf(Sell,shapeSmallSquare,shapeNone),colorRed,0,r,Offset=30);
PlotShapes(IIf(Sell,shapeSmallSquare,shapeNone),colorOrange,0,r,Offset=40);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorWhite,0,r,Offset=-35);
_SECTION_END();
_SECTION_BEGIN(" ZigZagTrend ");
array = Close;
amount = Param("Amount", 4, 1, 50, 0.5 );
zz0 = Zig( array, amount );
zz1 = Ref( zz0, -1 );
zz2 = Ref( zz0, -2 );
tr = ValueWhen(zz0 > zz1 AND zz1 < zz2, zz1);
pk = ValueWhen(zz0 < zz1 AND zz1 > zz2, zz1);
PU = tr + 0.01 * abs(tr)*amount;
PD = pk - 0.01 * abs(pk)*amount;
ZZT = IIf( array >= PU AND zz0 > zz1, 1,
IIf( array <= PD AND zz0 < zz1, -1, 0 ) );
ZZT = ValueWhen( ZZT != 0, ZZT );
// plot Zigzag and zigzag trend
Plot( ZZT, "ZigZagTrend", colorGrey40, styleOwnScale|styleNoTitle );
Buy = Cover = Cross( ZZT, 0 );
Sell = Short = Cross( 0, ZZT );
PlotShapes(IIf(Cross( ZZT, 0 ),shapeDigit6,Null),colorYellow,0,Max(0,0),250);
PlotShapes(IIf(Cross( ZZT, 0 ),shapeUpArrow,Null),colorYellow,0,Max(0,0),240);
PlotShapes(IIf(Cross( 0, ZZT ),shapeDigit7,Null),colorCustom12,0,Min(0,0),-240);
PlotShapes(IIf(Cross( 0, ZZT ),shapeDownArrow,Null),colorCustom12,0,Min(0,0),230);
_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");
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 )));
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",9,2,15,1);
bu = ParamToggle("Bullish Pattern","Off|On",1);
be = ParamToggle("Bearish Pattern","Off|On",1);
bi = Cum(1)-1;
function GetTop(bars)
{
Top =r== 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;
}
// Build fractals array
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,IIf(ValueWhen(P1,bi,0) < ValueWhen(V1,bi,0),IIf(ValueWhen(P1,r,0) >=r,False,P1),P1),P1);
P1 = IIf(P1 AND ValueWhen(P1,bi,0) > bi AND NOT(ValueWhen(V1,bi,0) > 0 AND ValueWhen(V1,bi,0) bi ,IIf(ValueWhen(V1,bi,0) < ValueWhen(P1,bi,0),IIf(ValueWhen(V1,W1,0) <= W1, False,V1),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,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);
//Bullish Patterns
PTvalid = (P1Bar1 > V1Bar1 AND V1Bar1 > P1Bar2 AND P1bar2 > V1Bar2) AND P1; // Peaks and troughs are in order
// 4 swings of developing Gartley/Bat etc.
BullGartley4 = PTvalid AND (P1H2-V1L1)/(P1H2-V1L2) > GBmin AND (P1H2-V1L1)/(P1H2-V1L2) < GBmax
AND (P1H1-V1L1)/(P1H2-V1L1) > GCMin AND (P1H1-V1L1)/(P1H2-V1L1) < GCMax;
BullBat4 = PTvalid AND (P1H2-V1L1)/(P1H2-V1L2) > BatBmin AND (P1H2-V1L1)/(P1H2-V1L2) < BatBmax
AND (P1H1-V1L1)/(P1H2-V1L1) > BatCMin AND (P1H1-V1L1)/(P1H2-V1L1) < BatCMax;
BullButterfly4 = PTvalid AND (P1H2-V1L1)/(P1H2-V1L2) > BtBmin AND (P1H2-V1L1)/(P1H2-V1L2) < BtBMax
AND (P1H1-V1L1)/(P1H2-V1L1) > BtCmin AND (P1H1-V1L1)/(P1H2-V1L1) < BtCmax;
BullCrab4 = PTvalid AND (P1H2-V1L1)/(P1H2-V1L2) >CBmin AND (P1H2-V1L1)/(P1H2-V1L2) < CBmax
AND (P1H1-V1L1)/(P1H2-V1L1) > CCmin AND (P1H1-V1L1)/(P1H2-V1L1) < CCmax;
// Bullish Gartley/Bat found. D retacement level is not evaluated
BullGartley = IIf(LowestSince(BullGartley4,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) < ValueWhen(BullButterfly4,P1H2)-(ValueWhen(BullButterfly4,P1H2)-ValueWhen(BullButterfly4,V1L2))*BtDMin AND
LowestSince(BullButterfly4,W1) > ValueWhen(BullButterfly4,P1H2)-(ValueWhen(BullButterfly4,P1H2)-ValueWhen(BullButterfly4,V1L2))*BtDmax AND
HighestSince(BullButterfly4,r) <= ValueWhen(BullButterfly4,P1H1 ) AND
LowestSince(bullButterfly4,W1)==W1, True,False);
BullButterfly = BullButterfly AND LowestSince(BullButterfly4,W1) < ValueWhen(BullButterfly4,V1L2);
// to remove redumbdent lines
BullHar4 = BullGartley4 OR BullButterfly4 OR BullBat4 OR BullCrab4 ;
BullHar = BullGartley OR BullButterfly OR BullBat OR BullCrab ;
Point4 = IIf(BullHar,ValueWhen(BullHar4,bi),Null);
BullHar = IIf(BullHar, IIf(Point4 == ValueWhen(BullHar,point4,0) AND ValueWhen(BullHar,bi,0) > bi ,False,BullHar),BullHar);
X = ValueWhen(BullHar4,V1L2);
Xbar = ValueWhen(BullHar4,V1Bar2);
A = ValueWhen(BullHar4,P1H2);
Abar = ValueWhen(BullHar4,P1bar2);
B = ValueWhen(BullHar4,V1L1);
Bbar = ValueWhen(BullHar4,V1bar1);
C1 = ValueWhen(BullHar4,P1H1);
C1bar = ValueWhen(BullHar4,P1bar1);
D = ValueWhen(BullHar,W1);
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)
{
Plot( LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",colorDarkBlue,styleThick);
Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",colorDarkBlue,styleThick);
Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"" ,colorDarkBlue,styleThick);
Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"" ,colorDarkBlue,styleThick);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Bbar),LastValue(B)),"",colorDarkBlue,styleDashed);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",colorDarkBlue,styleThick);
Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"" ,colorDarkBlue,styleDashed);
Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",colorDarkBlue,styleDashed);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Dbar),LastValue(D)),"",colorDarkBlue,styleDashed);
PlotText(NumToStr(LastValue(ABdXA),1.2),(LastValue(Bbar)+LastValue(Xbar))/2,(LastValue(B)+LastValue(X))/2,colorDarkBlue);
PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,colorDarkBlue);
PlotText(NumToStr(LastValue(ADdXA),1.2) ,(LastValue(Dbar)+LastValue(Xbar))/2,(LastValue(D)+LastValue(X))/2,colorDarkBlue);
PlotText(NumToStr(LastValue(BCdCD),1.2),(LastValue(Bbar)+LastValue(Dbar))/2,(LastValue(B)+LastValue(D))/2,colorDarkBlue);
}
// Bearish Patterns
PTvalid = (V1Bar1 > P1Bar1 AND P1Bar1 > V1Bar2 AND V1Bar2 > P1Bar2) AND V1;
// Swing 4
BearGartley4 = PTvalid AND (P1H1-V1L2)/(P1H2-V1L2) > GBmin AND (P1H1-V1L2)/(P1H2-V1L2) < GBmax AND
(P1H1-V1L1)/(P1H1-V1L2) > GCmin AND (P1H1-V1L1)/(P1H1-V1L2) < GCmax;
BearBat4 = PTvalid AND (P1H1-V1L2)/(P1H2-V1L2) > BatBmin AND (P1H1-V1L2)/(P1H2-V1L2) < BatBmax AND
(P1H1-V1L1)/(P1H1-V1L2) > BatCmin AND (P1H1-V1L1)/(P1H1-V1L2) < BatCmax;
BearButterfly4 = PTvalid AND (P1H1-V1L2)/(P1H2-V1L2) > BtBmin AND (P1H1-V1L2)/(P1H2-V1L2) < BtBmax AND
(P1H1-V1L1)/(P1H1-V1L2) > BtCmin AND (P1H1-V1L1)/(P1H1-V1L2) < BtCmax;
BearCrab4 = PTvalid AND (P1H1-V1L2)/(P1H2-V1L2) > CBmin AND (P1H1-V1L2)/(P1H2-V1L2) < CBmax AND
(P1H1-V1L1)/(P1H1-V1L2) > CCmin AND (P1H1-V1L1)/(P1H1-V1L2) < CCmax;
// Poin D
BearGartley = IIf(HighestSince(bearGartley4,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);
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);
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,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)),"",colorDarkRed,styleThick);
Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(Bbar),LastValue(B)),"",colorDarkRed,styleThick);
Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(C1bar),LastValue(C1)),"" ,colorDarkRed,styleThick);
Plot(LineArray(LastValue(C1bar),LastValue(C1),LastValue(Dbar),LastValue(D)),"" ,colorDarkRed,styleThick);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Bbar),LastValue(B)),"",colorDarkRed,styleDashed);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Abar),LastValue(A)),"",colorDarkRed,styleThick);
Plot(LineArray(LastValue(Abar),LastValue(A),LastValue(C1bar),LastValue(C1)),"" ,colorDarkRed,styleDashed);
Plot(LineArray(LastValue(Bbar),LastValue(B),LastValue(Dbar),LastValue(D)),"",colorDarkRed,styleDashed);
Plot(LineArray(LastValue(Xbar),LastValue(X),LastValue(Dbar),LastValue(D)),"",colorDarkRed,styleDashed);
PlotText(NumToStr(LastValue(ABdXA),1.2),(LastValue(Bbar)+LastValue(Xbar))/2,(LastValue(B)+LastValue(X))/2,colorDarkRed);
PlotText(NumToStr(LastValue(BCdAB),1.2),(LastValue(C1bar)+LastValue(Abar))/2,(LastValue(C1)+LastValue(A))/2,colorDarkRed);
PlotText(NumToStr(LastValue(BCdCD),1.2) ,(LastValue(Dbar)+LastValue(Bbar))/2,(LastValue(D)+LastValue(B))/2,colorDarkRed);
PlotText(NumToStr(LastValue(ADdXA),1.2) ,(LastValue(Dbar)+LastValue(Xbar))/2,(LastValue(D)+LastValue(X))/2,colorDarkRed);
}
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"))))))));
plotFractals = ParamToggle("Plot Fractals","Off|On",0);
if(PlotFractals)
{
PlotShapes(shapeSmallCircle*P1,colorRed,0,r,10);
PlotShapes(shapeSmallCircle*V1,colorBlue,O,W1,-10);
}
RF=ValueWhen(P1,r);
SF=ValueWhen(V1,W1);
cbar = Param("cbar",4,2,50,1);
RF1 = IIf(RF AND BarsSince(P1) <=cbar,RF,Null);
SF1 = IIf(SF AND BarsSince(V1) <=cbar,SF,Null);
Plot(RF1,"",colorWhite,styleDots | styleNoLine);
Plot(SF1,"",colorWhite,styleDots | styleNoLine);
Plot(RF,"",colorBlack,40+16);
Plot(SF,"",colorBlack,40+16);
PlotShapes(IIf(P1, shapeSmallSquare,shapeNone),colorYellow,0,r,10);
PlotShapes(shapeSmallCircle*P1,colorBlack,0,r,10);
PlotShapes(IIf(V1, shapeSmallSquare,shapeNone),colorYellow,0,W1,-10);
PlotShapes(shapeSmallCircle*V1,colorBlack,0,W1,-10);
numbars = SelectedValue(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(C),2);
PlotText("" + WriteVal(RF,fraction),
SelectedValue(BarIndex()+2)-(numbars/hts),SelectedValue(RF),colorWhite,colorBlue);
PlotText("" + WriteVal(SF,fraction),
SelectedValue(BarIndex()+2)-(numbars/hts),SelectedValue(SF),colorBlack,colorYellow);
GfxSetTextColor(IIf(LastPattern > 0, colorGreen,colorRed));
GfxTextOut("Last Pattern : " + PatternName,0,20);
_SECTION_BEGIN("MACD Divergence");
// Parameters
PeriodEMA = 13;
MACDIndicatorRange = 50;
// Volume filter
VolumeFilter = Param( "Volume MA filter", 100000, 50000, 500000, 100000 );
Timeframe = Interval(2);
// Adjust for weekly if necessary
if( Timeframe == "5-day" || Timeframe == "Weekly" ) {
VolumeFilter = VolumeFilter * 5;
}
else if( Timeframe == "Monthly") {
VolumeFilter = VolumeFilter * 20;
}
else if( Timeframe != "Daily" ) {
VolumeFilter = 0;
}
// Minimum number of bars required to form a divergence pattern. For a
// positive divergence, this is the number of falling bars in the context
// of a rising MACD or MACD-H pattern. Vice versa for negative divergence
MACDDivMinWidth = Param("Divergence min width", 4, 1, 10, 1 );
// Minimum width of negative projecting wave between two positive MACD-H waves,
// otherwise two positive waves will be considered as one single wave. This
// minimises invalid divergences, to ensure that "back of bears is broken".
// The same applies for a positive wave between two negative waves.
HistMinWidth = Param("Histogram min width", 4, 1, 10, 1 );
PeriodEMA = Optimize( "PeriodEMA ", 13, 5, 23, 1 );
// Other parameters
OpenPositions = 10;
ATRPeriod = 5;
InitialCapital = 100000;
PeriodFast = Param( "Fast EMA", 12, 2, 200, 1 );
PeriodSlow = Param( "Slow EMA", 26, 2, 200, 1 );
PeriodSignal = Param( "Signal EMA", 9, 2, 200, 1 );
MACDInd = MACD(PeriodFast, PeriodSlow );
SigInd = Signal(PeriodFast, PeriodSlow , PeriodSignal );
HistInd = MACDInd - SigInd ;
_N( macdStr = WriteVal( PeriodFast, 1.0 )+","+WriteVal( PeriodSlow , 1.0 ) );
_N( sigStr = macdStr + ","+WriteVal( PeriodSignal , 1.0 ) );
// Get displayed min and max value of MACD and MACD-H, to rescale it for better visibility
scMACDMax = LastValue(HHV(Max(MACDInd, sigInd),
BarsSince( Status("barvisible") AND NOT Ref(Status("barvisible"),-1) )));
scMACDMin = LastValue(LLV(Min(MACDInd, sigInd),
BarsSince( Status("barvisible") AND NOT Ref(Status("barvisible"),-1) )));
scaleMACD = Max( abs(scMACDMax), abs(scMACDMin) );
scHistMax = LastValue(HHV(HistInd,
BarsSince( Status("barvisible") AND NOT Ref(Status("barvisible"),-1) )));
scHistMin = LastValue(LLV(HistInd,
BarsSince( Status("barvisible") AND NOT Ref(Status("barvisible"),-1) )));
scaleHist = Max( abs(scHistMax), abs(scHistMin) );
;
// If current symbol is NOT an index, compare volume MA to filter limit
VolumeMA = MA( V, 50 );
if( IsIndex() ) {
VolumeMABool = True;
}
else {
VolumeMABool = IsTrue( VolumeMA > VolumeFilter );
}
// Get MACD-H, EMA, Stochastics and RSI arrays
DayHist = MACD( PeriodFast, PeriodSlow ) -
Signal( PeriodFast, PeriodSlow, PeriodSignal );
DayEMA = EMA( Close, PeriodEMA );
DaySTO = StochK( 14 );
DayRSI = RSI( 14 );
DayBuyBool = IsTrue(
( // DayEMA > Ref(DayEMA,-1) // EMA rising
DaySTO < 70 // STO not overbought
// AND DayRSI > Ref(DayRSI,-1) // RSI rising
AND MACD( PeriodFast, PeriodSlow ) < 0 )
OR Timeframe == "5-day" OR Timeframe == "Weekly"
);
DaySellBool = IsTrue(
( // DayEMA < Ref(DayEMA,-1) // EMA falling
DaySTO > 30 // STO not oversold
// AND DayRSI < Ref(DayRSI,-1) // RSI falling
AND MACD( PeriodFast, PeriodSlow ) > 0 )
OR Timeframe == "5-day" OR Timeframe == "Weekly"
);
//--------------------------
// Positive MACD divergences
//--------------------------
// Get array containing for each element, when the MACD's lowest
// value occur, within the specified number of bars
MACDLowBars = LLVBars( MACDInd, MACDDivMinWidth );
// Get array defining if the MACD's previous bar was the
// minimum, AND if that MACD value < 0
MACDMinCond = MACDLowBars > 0 AND
Ref(MACDLowBars,-1) == 0 AND
Ref(MACDInd,-1) < 0;
// Get array containing MACD low bar values where lows
// occured, all other bars filled with 0
MACDLowVal = IIf( MACDMinCond , Ref(MACDInd,-1), 0 );
// Get array containing MACD low bar value at bar where MACD
// low occured, all other bars filled with preceding MACD
// low value (chandelier)
MACDLowSteps = ValueWhen( Ref(MACDMinCond,0),
Ref(MACDInd,-1), 1 );
// Get array containing price low bar values where lows
// occured, all other bars filled with huge number
PriceMACDLowVal = IIf( MACDMinCond,
Ref(LLV(L,MACDDivMinWidth ),-1),
2000000 );
// Get array containing local price low bar value at bar
// where MACD low occured, all other bars filled with preceding
// price low value (chandelier)
PriceMACDLowSteps = ValueWhen( Ref(MACDMinCond ,0),
LLV(L,MACDDivMinWidth ) );
// Get array containing differences in MACD low bar values
MACDLowDiffs = MACDLowSteps - Ref(MACDLowSteps,-1);
// Get array containing differences in price low bar values
PriceMACDLowDiffs = PriceMACDLowSteps - Ref(PriceMACDLowSteps,-1);
// Get array defining positive divergences
MACDLowBarDiffs = Ref( BarsSince(MACDMinCond ), -1 );
// Divergence signal
MACDPosDivergence = // MACDLowDiffs > 0 AND
MACDLowVal < 0
AND MACDLowVal > LLV(MACDLowVal, MACDIndicatorRange )
AND PriceMACDLowVal < LLV(Ref(PriceMACDLowVal,-1), MACDIndicatorRange )
AND PriceMACDLowDiffs < 0
AND MACDLowBarDiffs < MACDIndicatorRange
AND VolumeMABool
AND C > 1.0
// AND WeekBuyBool
;
//--------------------------
// Negative MACD divergences
//--------------------------
// Get array containing for each element, when the MACD's highest
// value occur, within the specified number of bars
MACDHighBars = HHVBars( MACDInd, MACDDivMinWidth );
// Get array defining if the MACD's previous bar was the
// maximum, AND if that MACD value > 0
MACDMaxCond = MACDHighBars > 0 AND
Ref(MACDHighBars,-1) == 0 AND
Ref(MACDInd,-1) > 0;
// Get array containing MACD high bar values where highs
// occured, all other bars filled with 0
MACDHighVal = IIf( MACDMaxCond,
Ref(MACDInd,-1), 0);
// Get array containing MACD high bar value at bar where MACD
// high occured, all other bars filled with preceding MACD
// high value (chandelier)
MACDHighSteps = ValueWhen( Ref(MACDMaxCond,0),
Ref(MACDInd,-1), 1 );
// Get array containing MACD high bar values where highs
// occured, all other bars filled with 0
PriceMACDHighVal = IIf( MACDMaxCond,
Ref(HHV(H,MACDDivMinWidth),-1),
0);
// Get array containing local price high bar value at bar
// where MACD high occured, all other bars filled with preceeding
// price high value (chandelier)
PriceMACDHighSteps = ValueWhen( Ref(MACDMaxCond,0),
HHV(H,MACDDivMinWidth) );
// Get array containing differences in MACD high bar values
MACDHighDiffs = MACDHighSteps - Ref(MACDHighSteps,-1);
// Get array containing differences in price high bar values
PriceMACDHighDiffs = PriceMACDHighSteps - Ref(PriceMACDHighSteps,-1);
// Get array defining negative divergences
MACDHighBarDiffs = Ref( BarsSince(MACDMaxCond), -1 );
// Divergence signal
MACDNegDivergence = // MACDHighDiffs < 0 AND
MACDHighVal > 0
AND PriceMACDHighVal > HHV( Ref(PriceMACDHighVal,-1), MACDIndicatorRange )
AND MACDHighVal < HHV( MACDHighVal, MACDIndicatorRange )
AND PriceMACDHighDiffs > 0
AND MACDHighBarDiffs < MACDIndicatorRange
AND VolumeMABool
AND C > 1.0
// AND WeekBuyBool
;
//------------------------------------
// Positive MACD Histogram divergences
//------------------------------------
// Get array containing when positive and negative and positive
// crossovers occured
HistPosCrossover = Cross( HistInd, 0 ) ;
HistNegCrossover = Cross( 0, HistInd ) ;
BarsSinceNegCross = BarsSince( HistNegCrossover );
BarsSincePosCross = BarsSince( HistPosCrossover );
// Get arrays containing for each element, when the MACD-H lowest
// values occur, within the specified number of bars
HistLowBars = LLVBars( HistInd, MACDDivMinWidth );
// Get array defining if the MACD-H previous bar was the minimum
// AND if that MACD-H value was < 0 or > 0
HistMinCond = HistLowBars > 0 AND
BarsSinceNegCross >= HistLowBars AND
Ref(HistLowBars,-1) == 0 AND
Ref(HistInd,-1) < 0;
// Get array containing MACD-H low bar values where lows
// occured, all other bars filled with 0
HistLowVal = IIf( HistMinCond , Ref(HistInd,-1), 0 );
// Get array containing MACD-H low bar value at bar where MACD-H
// low occured, all other bars filled with preceding MACD-H
// low value (chandelier)
HistLowSteps = ValueWhen( Ref(HistMinCond,0), Ref(HistInd,-1), 1 );
// Get array containing differences between MACD-H low bar value and the value
// at previous MACD-H zero positive crossing
// HistLowDiffs = HistLowSteps - ValueWhen( HistPosCrossover, HistLowSteps, 1 );
HistLowDiffs = HistLowSteps - Ref(HistLowSteps,-1);
// Get array containing MACD-H min value when MACD-H < 0, all other
// bars filled with 0
BarsSincePrevNegCross = ValueWhen( HistNegCrossover,
Ref(BarsSinceNegCross ,-1), 1 );
BarsSinceWideNegCross = IIf( HistInd < 0 AND
BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
BarsSincePrevNegCross + BarsSinceNegCross + 1,
BarsSinceNegCross );
HistMinSteps = IIf( !BarsSinceWideNegCross,
HistInd,
LLV( HistInd , BarsSinceWideNegCross + 1) );
// Get array containing differences in MACD-H max bar values
HistMinDiffs = IIf( HistInd < 0,
HistMinSteps - Ref(HistMinSteps,-1),
0);
// Get minumum from previous MACD-H negative wave
// Plot( ValueWhen( HistNegCrossover, Ref(HistMinSteps,-1), 1 ),"PrevHistMinSteps-1", colorGreen );
// Plot( ValueWhen( HistNegCrossover, Ref(HistMinSteps,-1), 2 ),"PrevHistMinSteps-1", colorGreen );
PrevHistMinSteps = IIf( HistInd < 0 AND
BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
ValueWhen( HistNegCrossover,
Ref(HistMinSteps,-1), 2 ),
ValueWhen( HistNegCrossover,
Ref(HistMinSteps,-1), 1 ) );
// Get array containing price low bar values where lows
// occured, all other bars filled with huge number
PriceHistLowVal = IIf( HistMinCond,
Ref(LLV(L,MACDDivMinWidth),-1),
2000000 );
// Get array containing local price low bar value at bar
// where MACD-H low occured, all other bars filled with preceding
// price low value (chandelier)
PriceHistLowSteps = ValueWhen( Ref(HistMinCond ,0),
LLV(L,MACDDivMinWidth) );
// Get array containing differences in price low bar values
PriceHistLowDiffs = PriceHistLowSteps - Ref(PriceHistLowSteps,-1);
// Get array containing price low minimum value when MACD-H < 0,
// all other bars filled with 0
PriceHistMinSteps = IIf( !BarsSinceNegCross,
L,
LLV( L , BarsSinceNegCross) );
// Get minimum from previous MACD-H negative wave
PrevPriceHistMinSteps = IIf( BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
ValueWhen( HistNegCrossover,
Ref(PriceHistMinSteps,-1), 2 ),
ValueWhen( HistNegCrossover,
Ref(PriceHistMinSteps,-1), 1 ) );
// Divergence signal
HistPosDivergence = // HistLowDiffs > 0 AND
// AND PriceHistLowDiffs < 0
HistMinSteps > PrevHistMinSteps
AND PriceHistMinSteps < PrevPriceHistMinSteps
AND HistLowVal < 0
AND VolumeMABool
AND C > 1.0
;
//------------------------------------
// Negative MACD Histogram divergences
//------------------------------------
// Get arrays containing for each element, when the MACD-H highest values
// occur, within the specified number of bars
HistHighBars = HHVBars( HistInd, MACDDivMinWidth );
// Get array defining if the MACD-H previous bar was the maximum,
// AND if that MACD-H value was < 0 OR > 0
HistMaxCond = HistHighBars > 0
AND BarsSincePosCross >= HistHighBars
AND Ref(HistHighBars,-1) == 0
AND Ref(HistInd,-1) > 0
;
// Get array containing MACD-H high bar values where highs
// occured, all other bars filled with 0
HistHighVal = IIf( HistMaxCond, Ref(HistInd,-1), 0);
// Get array containing MACD-H high bar value at bar where MACD-H
// high occured, all other bars filled with preceding MACD-H
// high value (chandelier)
HistHighSteps = ValueWhen( Ref(HistMaxCond,0),
Ref(HistInd,-1), 1 );
// Get array containing differences in MACD-H high bar values
HistHighDiffs = HistHighSteps - Ref(HistHighSteps,-1);
// Get array containing MACD-H max value when MACD-H > 0, all other
// bars filled with 0
BarsSincePrevPosCross = ValueWhen( HistPosCrossover,
Ref(BarsSincePosCross ,-1), 1 );
BarsSincePrevNegCross = ValueWhen( HistNegCrossover,
Ref(BarsSinceNegCross ,-1), 1 );
BarsSinceWidePosCross = IIf( HistInd > 0 AND
BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
BarsSincePrevPosCross + BarsSincePosCross + 1,
BarsSincePosCross );
HistMaxSteps = IIf( !BarsSinceWidePosCross,
HistInd,
HHV( HistInd , BarsSinceWidePosCross + 1) );
// Get array containing differences in MACD-H max bar values
HistMaxDiffs = IIf( HistInd > 0,
HistMaxSteps - Ref(HistMaxSteps,-1),
0);
// Get high from pevious MACD-H positive wave
PrevHistMaxSteps = IIf( HistInd > 0 AND
BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
ValueWhen( HistPosCrossover,
Ref(HistMaxSteps,-1), 2 ),
ValueWhen( HistPosCrossover,
Ref(HistMaxSteps,-1), 1 ) );
// Get array containing MACD-H high bar values where highs
// occured, all other bars filled with 0
PriceHistHighVal = IIf( HistMaxCond,
Ref(HHV(H,MACDDivMinWidth),-1),
0);
// Get array containing local price high bar value at bar
// where MACD-H high occured, all other bars filled with preceeding
// price high value (chandelier)
PriceHistHighSteps = ValueWhen( Ref(HistMaxCond,0),
HHV(H,MACDDivMinWidth) );
// Get array containing differences in price high bar values
PriceHistHighDiffs = PriceHistHighSteps - Ref(PriceHistHighSteps,-1);
// Get array containing MACD-H max value when MACD-H > 0, all other
// bars filled with 0
PriceHistMaxSteps = IIf( !BarsSincePosCross,
H,
HHV( H , BarsSincePosCross) );
// Get high from pevious MACD-H positive wave
PrevPriceHistMaxSteps = IIf( BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
ValueWhen( HistPosCrossover,
Ref(PriceHistMaxSteps,-1), 2 ),
ValueWhen( HistPosCrossover,
Ref(PriceHistMaxSteps,-1), 1 ) );
// Divergence signal
HistNegDivergence = // HistHighDiffs < 0 AND
// AND PriceHistHighDiffs > 0
HistMaxSteps < PrevHistMaxSteps
AND PriceHistMaxSteps > PrevPriceHistMaxSteps
AND HistHighVal > 0
AND VolumeMABool
AND C > 1.0
;
//-----------------------
// MACD crossover signals
//-----------------------
PosCrossover = Cross( DayHist, 0 )
AND DayBuyBool
AND VolumeMABool
AND C > 1.0
;
NegCrossover = Cross( 0, DayHist )
AND DaySellBool
AND VolumeMABool
AND C > 1.0
;
// Plot signals
PlotShapes( IIf( HistPosDivergence , shapeSmallUpTriangle, shapeNone ),
colorYellow, 0, 0 , -12 );
PlotShapes( IIf( HistNegDivergence , shapeSmallDownTriangle, shapeNone ),
colorRed, 0, 0, -12 );
_SECTION_END();
_SECTION_BEGIN("MACD");
ml = MACD(6, 13);
dd= Signal(6,13,5);
Hist=ml-dd;
col_hist= IIf(Hist > BBandTop( Hist, 5, 0.5 ),colorLightBlue,IIf(Hist < BBandBot( Hist, 5, 0.5 ),colorBlue,colorRed));
pr=PeakBars(C,5)==0;
ps =TroughBars(C,5)==0;
PlotShapes(IIf(ps,shapeSmallUpTriangle,Null),colorCustom11,0,Min(0,0),-40);
PlotShapes(IIf(pr,shapeSmallDownTriangle,Null),colorCustom12,0,Min(0,0),-40);
Plot(ps,"",colorBrightGreen,styleHistogram|styleDashed|styleOwnScale|styleNoLabel,0,1,0,0);
Plot(pr,"",colorRed,styleHistogram|styleDashed|styleOwnScale|styleNoLabel,0,1,0,0);