NOTE: THIS IS SECOND OF FOUR...COMBINE WITH THE NEXT TWO THREADs...
//Put Divergence codes into Array
//Compute results for display
Sel_LastLow = IIf(TradeON==1,LastValue(LastLow),SelectedValue(LastLow));
Sel_CurrTrough = IIf(TradeON==1,LastValue(CurrTrough),SelectedValue(CurrTrough));
Sel_PriorTrough = IIf(TradeON==1,LastValue(PriorTrough),SelectedValue(PriorTrough));
Sel_LastLowBars = IIf(TradeON==1,LastValue(LastLowBars),SelectedValue(LastLowBars));
Sel_CurrTroughBars = IIf(TradeON==1,LastValue(CurrTroughBars),SelectedValue(CurrTroughBars));
Sel_PriorTroughBars = IIf(TradeON==1,LastValue(PriorTroughBars),SelectedValue(PriorTroughBars));
//Needed for Backtest Arrays
LR1 = CurrTrough < PriorTrough AND LastLow == CurrTrough;
LR2 = CurrTrough > PriorTrough AND LastLow == CurrTrough;
LR3 = Osc_Issue < Middle AND CurrTrough < PriorTrough AND LastLow > CurrTrough;
LR4 = Osc_Issue < Middle AND CurrTrough > PriorTrough AND LastLow > CurrTrough;
LR5 = LastLow > Middle AND LastLow > CurrTrough AND LR3==0 AND LR4==0;
if (Sel_Bull_Diverge==1)
{
Bull_Diverge = 1;
LDiv_Code = 15;
Diverge = "Bullish";
Pattern = "Lower Low";
}
else
{
Bull_Diverge = 0;
LDiv_Code = 14;
Diverge = "";
}
if (Sel_SR3==1)
{
_TRACE("Bear Reversal - SR3 - True");
Curr_HighPrice = HHV(High,5);
Curr_PeakPrice = Ref(HHV(High,6),-(Sel_CurrPeakBars-3));
Sel_CHighPrice = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
Sel_CPeakPrice = IIf(TradeON==1,LastValue(Curr_PeakPrice),SelectedValue(Curr_PeakPrice));
Sel_Bear_Diverge = Sel_CHighPrice >= Sel_CPeakPrice;
if (Sel_Bear_Diverge==1)
{
Bear_Diverge = 1;
SDiv_Code = 15;
Diverge = "Bearish";
Pattern = "Higher High";
}
else
{
Bear_Diverge = 0;
SDiv_Code = 14;
Diverge = "";
Pattern = "Higher High";
}
}
if (Sel_SR4==1)
{
_TRACE("Bear Reversal - SR4 - True");
Curr_HighPrice = HHV(High,5);
Curr_PeakPrice = Ref(HHV(High,6),-(Sel_CurrPeakBars-3));
Sel_CHighPrice = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
Sel_CPeakPrice = IIf(TradeON==1,LastValue(Curr_PeakPrice),SelectedValue(Curr_PeakPrice));
Sel_Bear_Diverge = Sel_CHighPrice >= Sel_CPeakPrice;
if (Sel_Bear_Diverge==1)
{
Bear_Diverge = 1;
SDiv_Code = 17;
Diverge = "Bearish";
Pattern = "Lower High";
}
else
{
Bear_Diverge = 0;
SDiv_Code = 16;
Diverge = "";
Pattern = "Lower High";
}
} // end Sel_Bear_Diverge
if (Sel_SR5==1)
{
Bear_Diverge = 0;
SDiv_Code = 18;
Diverge = "";
Pattern = "Continuation";
}
BT_SDiv_Code = IIf(SR1==1,11,
IIf(SR2==1 AND Bear_Diverge==0,12,IIf(SR2==1 AND Bear_Diverge==1,13,
IIf(SR3==1 AND Bear_Diverge==0,14,IIf(SR3==1 AND Bear_Diverge==1,15,
IIf(SR4==1 AND Bear_Diverge==0,16,IIf(SR4==1 AND Bear_Diverge==1,17,
IIf(SR5==1 AND SR4==0 AND SR3==0,18,0))))))));
if (Diag_trace)
{
_TRACE("Bear Reversal #00 - Div_Code " + WriteVal(SDiv_Code,1.0) + " -- SR1 " + WriteVal(Sel_SR1,1.0)
+ " SR2 " + WriteVal(Sel_SR2,1.0) + " SR3 " + WriteVal(Sel_SR3,1.0) + " SR4 " + WriteVal(Sel_SR4,1.0));
_TRACE("Bear Reversal #00 - LastHigh " + WriteVal(Sel_LastHigh,1.2) + " CurrPeak " + WriteVal(Sel_CurrPeak,1.2)
+ " PriorPeak " + WriteVal(Sel_PriorPeak,1.2) );
}
if (Backtest == 0)
{
//Assign Values to coordinates
y10=Sel_CurrPeak;
y11=Sel_LastHigh;
x10=BarCount - 1 - Sel_CurrPeakBars - (LastValue(BarIndex()) - Sel_BarIndex);
x11=BarCount - 1 - Sel_LastHighBars - (LastValue(BarIndex()) - Sel_BarIndex);
Line1 = LineArray( x10, y10, x11, y11, 0 );
y20=Sel_PriorPeak;
y21=Sel_CurrPeak;
x20=BarCount - 1 - SelectedValue(Final_Bars) - (LastValue(BarIndex())- Sel_BarIndex);
//x20=BarCount - 1 - Sel_PriorPeakBars - (LastValue(BarIndex())- Sel_BarIndex);
x21=BarCount - 1 - Sel_CurrPeakBars - (LastValue(BarIndex())- Sel_BarIndex);
Line2 = LineArray( x20, y20, x21, y21, 0 );
//Compute area to paint, based on MACD / Stochastic
if (Middle==50)
{
Area_MaxValue = 100;
PlotOver2 = IIf(BarIndex() >= Sel_BarIndex - (x21-x20)-(x11-x10) -1 AND
BarIndex() <= Sel_BarIndex - (x11-x10),Area_MaxValue,0);
PlotOver1 = IIf(BarIndex() >= Sel_BarIndex - (x11-x10) -1 AND BarIndex() <= Sel_BarIndex,Area_MaxValue,0);
if (SelectedValue(SDiv_Code)==15)
{
//Limit the blue bar for divergence to 2nd half of area for code 15
PlotDiverge = IIf(BarIndex() >= Sel_BarIndex - (x11-x10) -1
AND BarIndex() <= Sel_BarIndex AND Diverge=="Bearish",10,0);
}
if (SelectedValue(SDiv_Code)==13 OR SelectedValue(SDiv_Code)==17)
{
PlotDiverge = IIf(BarIndex() >= Sel_BarIndex - (x21-x20)-(x11-x10) -1
AND BarIndex() <= Sel_BarIndex AND Diverge=="Bearish",10,0);
}
}
else
{
Area_MinValue = Max(y10,y20);
PlotOver2 = IIf(BarIndex() >= Sel_BarIndex - (x21-x20)-(x11-x10) -1 AND
BarIndex() <= Sel_BarIndex - (x11-x10),Area_MinValue,0);
PlotOver1 = IIf(BarIndex() >= Sel_BarIndex - (x11-x10) -1 AND BarIndex() <= Sel_BarIndex,Area_MinValue,0);
}
} // end if backtest
if (Diag_Trace==1)
{
_TRACE("Bear Reversal #0 - Backtest " + WriteVal(Backtest,1.0));
_TRACE("Bear Reversal #1 - Sel_TurnDn_OK " + WriteVal(Sel_TurnDn_OK,1.0));
_TRACE("Bear Reversal #2 - CurrPeak " + WriteVal(Sel_CurrPeak,1.2) + " CPBars " + WriteVal(Sel_CurrPeakBars,1.0)
+ " DivCode " + WriteVal(SDiv_Code,1.0));
_TRACE("Bear Reversal #3 - LB_PGroup " + WriteVal(Sel_LastBar_PG,1.0) + " FB_PGroup " + WriteVal(Sel_FirstBar_PG,1.0));
_TRACE("Bear Reversal #4 - Pk_PGroup " + WriteVal(PriorPeak,1.2) + " PB_PG " + WriteVal(PriorPeakBars,1.0));
_TRACE("Bear Reversal #5 - xy1: x10=" + WriteVal(x10,1.0) + " y10=" + WriteVal(y10,1.2)
+ " x11=" + WriteVal(x11,1.0) + " y11=" + WriteVal(y11,1.2));
_TRACE("Bear Reversal $6 - xy2: x20=" + WriteVal(x20,1.0) + " y20=" + WriteVal(y20,1.2)
+ " x21=" + WriteVal(x21,1.0) + " y21=" + WriteVal(y21,1.2));
_TRACE("Bear Reversal - end ================================================ ");
} // end Diag_Trace
} // end Sel_TurnDn_OK
// Add code for troughs
else
{
SDiv_Code = 10;
}
return Sel_TurnDn_OK;
} //end DetectBearishReversal
//Determine Troughs
function DetectLastLow(Osc_Issue)
{
global LastLow, LastLowBars, TurnUp_OK, Sel_TurnUp_OK;
TurnUp_OK = False;
Sel_TurnUp_OK = False;
LastLow = 0;
LastLowBars = 0;
Def_Trough1 = 0;
Def_Trough2 = 0;
Def_Trough1 = Osc_Issue > Ref(Osc_Issue,-1) AND Ref(Osc_Issue,-1) < Ref(Osc_Issue,-2) AND Osc_Issue > Ref(Osc_Issue,-2);
Def_Trough2 = Osc_Issue > Ref(Osc_Issue,-1) AND Ref(Osc_Issue,-1) > Ref(Osc_Issue,-2) AND Ref(Osc_Issue,-2) < Ref(Osc_Issue,-3)
AND Osc_Issue > Ref(Osc_Issue,-3);
TurnUp_OK = Def_Trough1 OR Def_Trough2;
Sel_TurnUp_OK = IIf(TradeON==1,LastValue(TurnUp_OK),SelectedValue(TurnUp_OK));
LowBar1 = IIf(Def_Trough1==1,1,0);
LowBar2 = IIf(Def_Trough2==1,1,0);
LowBar = IIf(LowBar1==1,3,4);
LastLow = LLV(Osc_Issue,LowBar);
LastLowBars = LLVBars(Osc_issue,LowBar);
_TRACE("Bull - LB1 " + WriteVal(LowBar1,1.0) + " LB2 " + WriteVal(LowBar2,1.0) + " LB " + WriteVal(LowBar,1.0));
if (Diag_Trace==1)
{
_TRACE("DetectLastLow - LastLow " + WriteVal(LastLow,1.2) + " Def Trough1 " + WriteVal(Def_Trough1,1.0)
+ " Def Trough2 " + WriteVal(Def_Trough2,1.0) + " TUp " + WriteVal(TurnUp_OK,1.0));
_TRACE("DetectLastLow - LastLow - Osc " + WriteVal(Osc_Issue,1.2) + " Osc -1 " + WriteVal(Ref(Osc_Issue,-1),1.2)
+ " Ref Osc -2 " + WriteVal(Ref(Osc_Issue,-2)) + " Ref Osc -3 " + WriteVal(Ref(Osc_Issue,-3)));
}
_TRACE("Bear Code - end of Bear function " + WriteVal(SDiv_Code,1.0));
return Sel_TurnUp_OK;
}
function DetectBullishReversal(Osc_Issue,Middle)
{
global LDiv_Code, BT_LDiv_Code, BT_Code, Bull_Diverge;
LDiv_Code = BT_LDiv_Code = 0;
Bull_Diverge = 0;
_TRACE("Program Flow - Enter Detect Bullish Reversal - Bar Index " + WriteVal(BarIndex(),1.0) +
" Last Bar " + WriteVal(LastValue(BarIndex()),1.0));
//Determine Trough for current period
Sel_TurnUp_OK = DetectLastLow(Osc_Issue);
_TRACE("Bull Code - Bull function Start " + Name() + " TurnUp " + WriteVal(sel_TurnUp_OK,1.0)+ " Code= " + WriteVal(LDiv_Code,1.0));
if (Sel_TurnUp_OK ==1 OR Backtest==1) // or 1==1 may be needed
{
FirstBar_CurrGroup = BarsSince(Cross(Middle,Osc_Issue))+1;
CurrTrough = LLV(Osc_Issue,FirstBar_Currgroup);
CurrTroughBars = LLVBars(Osc_Issue,FirstBar_Currgroup)+0;
Sel_CurrTrough = IIf(TradeON==1,LastValue(CurrTrough),SelectedValue(CurrTrough));