Anyone use my method?

Discussion in 'Index Futures' started by no_pm_please, Dec 10, 2005.

  1. observation: my only win out of my first 3 trades today was when the adx was above 30....I took the other trades when the adx was a hair shy of 30, but got stopped out as a result...
     
    #351     Feb 8, 2006
  2. Sherm..I take the 5 min setups and the 1 min setups....and yes the stops are different, but calculated the same using1/3 of the channel width.
     
    #352     Feb 8, 2006
  3. Although this 5 min YM setup was a hair shy of adx30....it is still working out great...I didnt take it because I was in the ES 1 min trade at the time :(

    I will wait for the adx to be above 30 though....

    note: please ignore the top info panel on the charts....amibroker does not export the correct info on that for some reason...
     
    • ym.png
      File size:
      12.4 KB
      Views:
      260
    #353     Feb 8, 2006
  4. shermdog

    shermdog

    Thanks Dennis.

    I am actually looking at the strategy with ETF's also. Here is a nice move with OIH today. I still like the CMF indicator over the CCI.

    I think you may need to tighten stops a little and take profits quicker using the ETF's, but it still seems to work well.
     
    #354     Feb 8, 2006
  5. Well Im done tradiing for the morning....I gotta take my son to preschool...

    Today's mistake: I took 2 trades with the adx not above 30

    Result: I got stopped out on both

    The only win I had out of the 3 trades was when all the ducks were lined up (i.e. the adx was above 30)

    So....I'll follow the trading rules exactly and better trades will follow.

    -Dennis


    attached is a follow up on that 5min YM trade with the adx a hair shy of 30 at entry signal.....not working out so great at this moment....
     
    • ym.png
      File size:
      12.3 KB
      Views:
      397
    #355     Feb 8, 2006
  6. spersky

    spersky

    been following this system for a while looks like a setup is forming in the ES right now. Just need that CCI Divergence
     
    #356     Feb 8, 2006
  7. Here are the codes for the panels in Amibroker...

    -Dennis

    //Top Signal Panel
    tempnum = Now( 4 ) - TimeNum();

    TimeRem = Interval() - ((int(tempnum[BarCount - 1] / 100) * 60) + (tempnum[BarCount - 1] - int(tempnum[BarCount - 1] / 100) * 100));

    if (TimeRem[BarCount - 1] < 0) TimeRem = 0;

    TitleTimeRem = EncodeColor(colorYellow) + "Time Remaining: ";

    MinuteVar = int(TimeRem / 60);

    SecondsVar = int(frac(TimeRem / 60) * 60);

    if (TimeRem[BarCount - 1] > 60)

    {

    TitleTimeRem = TitleTimeRem + EncodeColor(colorWhite) + MinuteVar + ":" + WriteIf(SecondsVar > 9, "", "0") + SecondsVar;

    }

    else if (TimeRem[BarCount - 1] > 20)

    {

    TitleTimeRem = TitleTimeRem + EncodeColor(colorYellow) + MinuteVar + ":" + WriteIf(SecondsVar > 9, "", "0") + SecondsVar;

    }

    else

    {

    TitleTimeRem = TitleTimeRem + EncodeColor(colorLime) + MinuteVar + ":" + WriteIf(SecondsVar > 9, "", "0") + SecondsVar;

    }

    // Channel Spread

    Length = 20; Num_ATRs = 2.5;
    // Length and Num_ATRs parameters should be personalized for your preferred
    // settings.

    Mov_Avg = MA(C,Length);
    KUP = Mov_Avg + Num_ATRs * ATR(Length);
    KDOWN = Mov_Avg - Num_ATRs * ATR(Length);

    spread=round(kup-kdown);
    spreadtitlepoints=EncodeColor(colorYellow)+"K-Channel Spread = "+ spread;
    Longstoptitlepoints=round((spread*(1/3)));
    //Longstoptitleticks=round(((spread*4)*(1/3)));
    Shortstoptitlepoints=round((spread*(1/3)));
    //Shortstoptitleticks=round(((spread*4)*(1/3)));

    Title = "" + Name() + ", " + Interval(2) + ", " + Date() + "\n" +
    TitleTimeRem + EncodeColor(colorWhite)+"\n"+
    EncodeColor(colorSkyblue)+"Open = "+O+" "+EncodeColor(colorPink)+"Close = "+C+"\n"+
    spreadtitlepoints + "\n"+
    EncodeColor(colorSkyblue)+"Long Stop = "+ Longstoptitlepoints + "\n"
    +EncodeColor(colorPink)+"Short Stop = "+Shortstoptitlepoints;
     
    #357     Feb 9, 2006
  8. //Middle Price Panel
    // Keltner Channels are constructed similar to Bollinger Bands
    // around a moving average +/- volatility.
    // The difference is in the measurement of volatility.
    // Bollinger uses standard deviation. MA(Close,20) +/- #STDs
    // Keltner uses ATR (Average True Range). MA(Close,20) +/- #ATRs
    // Keltner channels may be easier to use for detecting oversold / overbought
    // conditions



    Length = 20; Num_ATRs = 2.5;
    // Length and Num_ATRs parameters should be personalized for your preferred
    // settings.

    Mov_Avg = MA(C,Length);
    KUP = Mov_Avg + Num_ATRs * ATR(Length);
    KDOWN = Mov_Avg - Num_ATRs * ATR(Length);


    Plot (KUP,"KUP",32,1);
    Plot (KDown,"Kdown",32,1);
    Plot (Mov_Avg,"Mov_Avg",6,1);
    Plot (C,"Close",colorLime,styleBar);

    _SECTION_BEGIN("Hi");
    HiDay = TimeFrameGetPrice("H", inDaily);
    LoDay = TimeFrameGetPrice("L", inDaily);

    HiDayTitle = EncodeColor(colorPink) + "HOD ";
    HiDayTitle = HiDayTitle + EncodeColor(colorYellow) + HiDay;
    LoDayTitle = EncodeColor(colorPink) + ", LOD ";
    LoDayTitle = LoDayTitle + EncodeColor(colorYellow) + LoDay;

    Plot(HiDay,"",colorYellow,styleDashed,styleNoLine,styleNoLabel);
    Plot(LoDay,"",colorYellow,styleDashed,styleNoLine,styleNoLabel);
    _SECTION_END();

    _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 ) );
    _SECTION_END();
     
    #358     Feb 9, 2006
  9. NOTE: THIS IS FIRST OF FOUR...COMBINE WITH THE NEXT THREE THREADS....



    // DIVERGENCE INDICATOR
    /*
    FileName: Mod - Osc-Price Divergence31
    October 25, 2005
    Version 1.0
    ====================================
    Use with MACD or Stochastics
    program detects and plots trendlines on oscillators
    generates price divergence data
    ====================================
    Program is built as an include module
    Program does not return anything. It plots the divergence area.
    The global variables below are available to controlling code
    ===============================================================
    - Modify divergence detection to account for continuation cases properly
    - Currently case #18 useed for continuation
    */

    // Parameters needed to be defined before calling this module

    Issue = CCI(20);
    Middle = 0;

    //Middle: MACD=0, Stoc=50, RSI=50

    Div_Version = 32;
    Pattern = Diverge = "";

    //Parameters
    Trendlines = Param("Trendlines",3,0,3,1);
    TradeON = Param("TradeON",1,0,1,1);
    Diag_Trace = Param("Diag_Trace",0,0,1,1);
    Alerts = Param("Alerts",0,0,1,1);

    function ParameterSetup(Osc_Issue)
    {
    //Variables are defined here if they are assigned values in more than one location
    global Pattern, Diverge, PlotDiverge;
    global PlotOver1, PLotOver2, Line1, Line2;
    global Backtest, explore;
    global Sel_BarIndex, Sel_Osc_Issue;


    pattern = "";
    diverge = "";
    PlotDiverge = 0;

    Plotover1 = Plotover2 = Line1 = Line2 = 0;

    Backtest = Status("action") == 5;
    Explore = Status("action") == 4;

    Sel_OscIssue = IIf(TradeON==1,LastValue(Osc_Issue),SelectedValue(Osc_Issue));
    Sel_BarIndex = IIf(TradeON==1,LastValue(BarIndex()),SelectedValue(BarIndex()));


    // verify this segment
    if (Backtest ==1)
    {
    TradeON = 0;
    Sel_OscIssue = Osc_Issue;
    Sel_BarIndex = BarIndex();

    }


    } // end ParameterSetup





    // ****************************************************************************************** //
    // Functions
    //
    //Determine Peaks - Bearish Reversal
    function DetectLastHigh(Osc_Issue)
    {
    global LastHigh, LastHighBars, TurnDn_OK, Sel_TurnDn_OK;

    TurnDn_OK = False;
    Sel_TurnDn_OK = False;
    Def_Peak1 = 0;
    Def_Peak2 = 0;
    LastHigh = 0;
    LastHighBars = 0;

    Def_Peak1 = Osc_Issue < Ref(Osc_Issue,-1) AND Ref(Osc_Issue,-1) > Ref(Osc_Issue,-2) AND Osc_Issue < Ref(Osc_Issue,-2);
    Def_Peak2 = 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);
    TurnDn_OK = Def_Peak1 OR Def_Peak2;
    Sel_TurnDn_OK = IIf(TradeON==1,LastValue(TurnDn_OK),SelectedValue(TurnDn_OK));


    HighBar1 = IIf(Def_Peak1==1,1,0);
    HighBar2 = IIf(Def_Peak2==1,1,0);
    HighBar = IIf(HighBar1==1,3,4);

    LastHigh = HHV(Osc_Issue,HighBar);
    LastHighBars = HHVBars(Osc_issue,HighBar);


    _TRACE("Sel_TurnDn_OK " + WriteVal(Sel_TurnDn_OK));

    if (Diag_Trace==1)
    {
    _TRACE("Detect LastHigh - " + WriteVal(LastHigh,1.2) + " Def Peak1 " + WriteVal(Def_Peak1,1.0)
    + " Def Peak2 " + WriteVal(Def_Peak2,1.0) + " TurnDn " + WriteVal(TurnDn_OK,1.0));
    _TRACE("Detect LastHigh - Osc " + WriteVal(Osc_Issue,1.2) + " Ref Osc -2 " + WriteVal(Ref(Osc_Issue,-2))
    + " Ref Osc -3 " + WriteVal(Ref(Osc_Issue,-3)));
    }
    return Sel_TurnDn_OK;
    } // end DetectLastHigh



    function DetectBearishReversal(Osc_Issue,Middle)
    {
    global SDiv_Code, BT_SDiv_Code, Bear_Diverge;

    SDiv_Code = BT_SDiv_Code = Bear_Diverge = 0;

    Sel_TurnDn_OK = DetectLastHigh(Osc_Issue);
    _TRACE("Bear Reversal - Enter Bear Diverge");

    if (Sel_TurnDn_OK ==1 OR Backtest==1)
    {
    //Find Current Peak
    FirstBar_CurrGroup = BarsSince(Cross(Osc_Issue,Middle))+1;
    CurrPeak = HHV(Osc_Issue,FirstBar_Currgroup);
    CurrPeakBars = HHVBars(Osc_Issue,FirstBar_Currgroup)+0;
    Sel_CurrPeak = IIf(TradeON==1,LastValue(CurrPeak),SelectedValue(CurrPeak));
    _TRACE("Bear Reversal 02-0 - CPeak " + WriteVal(Sel_CurrPeak,1.2));

    //Determine Prior Peak
    //Distances computed relative to selected bar
    i=0;
    _TRACE("Bear Reversal 00 - start of loop ------- ");
    do
    {
    i++;
    LastBar_PriorGroup = Sel_BarIndex-ValueWhen(Cross(Middle,Osc_Issue),BarIndex(),i);
    FirstBar_PriorGroup = Sel_BarIndex-ValueWhen(Cross(Osc_Issue,Middle),BarIndex(),i+1);

    Sel_LastBar_PG = IIf(TradeON==1,LastValue(LastBar_PriorGroup),SelectedValue(LastBar_PriorGroup));
    Sel_FirstBar_PG = IIf(TradeON==1,LastValue(FirstBar_PriorGroup),SelectedValue(FirstBar_PriorGroup));

    //Lines below need the selected variable to function correctly
    Peak_PriorGroup = Ref(HHV(Osc_Issue,Sel_FirstBar_PG - Sel_LastBar_PG+1),-Sel_LastBar_PG+1);
    PeakBars_PriorGroup = Ref(HHVBars(Osc_Issue,Sel_FirstBar_PG - Sel_LastBar_PG+1),-Sel_LastBar_PG+1);

    Sel_LastBar_PriorGroup = IIf(TradeON==1,LastValue(LastBar_PriorGroup),SelectedValue(LastBar_PriorGroup));
    Sel_PeakBars_PriorGroup = IIf(TradeON==1,LastValue(PeakBars_PriorGroup),SelectedValue(PeakBars_PriorGroup));
    Sel_Peak_PriorGroup = IIf(TradeON==1,LastValue(Peak_PriorGroup),SelectedValue(Peak_PriorGroup));

    Final_Bars = Sel_PeakBars_PriorGroup + Sel_LastBar_PriorGroup;


    // Diagnostic
    _TRACE("Bear Reversal - loop 01 - i= " + WriteVal(i,1.0) + " FB_PrGr " + WriteVal(Sel_FirstBar_PG,1.0) + " LB_PrGr " + WriteVal(Sel_LastBar_PG,1.0));
    _TRACE("Bear Reversal - loop 02 - CPeak " + WriteVal(Sel_CurrPeak,1.2));
    _TRACE("Bear Reversal - loop 03 - Pk_PG " + WriteVal(Sel_Peak_PriorGroup,1.2) + " Pk_PGBars " + WriteVal(Sel_PeakBars_PriorGroup,1.0) + " F Bars " + WriteVal(Final_Bars));
    _TRACE("Bear Reversal - loop 04 - While1= " + WriteVal((SelectedValue(Peak_PriorGroup)-Middle),1.2) + " Compare= " + WriteVal(((SelectedValue(CurrPeak)-Middle) / 3),1.2));

    } while (((Sel_Peak_PriorGroup-Middle) < (Sel_CurrPeak-Middle) / 3) AND i<10);


    _TRACE("Bear Reversal 05 - end of loop ------- ");


    PriorPeak = Peak_PriorGroup;
    PriorPeakBars = Final_Bars;

    Sel_LastHigh = IIf(TradeON==1,LastValue(LastHigh),SelectedValue(LastHigh));
    Sel_CurrPeak = IIf(TradeON==1,LastValue(CurrPeak),SelectedValue(CurrPeak));
    Sel_PriorPeak = IIf(TradeON==1,LastValue(PriorPeak),SelectedValue(PriorPeak));
    Sel_LastHighBars = IIf(TradeON==1,LastValue(LastHighBars),SelectedValue(LastHighBars));
    Sel_CurrPeakBars = IIf(TradeON==1,LastValue(CurrPeakBars),SelectedValue(CurrPeakBars));
    Sel_PriorPeakBars = IIf(TradeON==1,LastValue(PriorPeakBars),SelectedValue(PriorPeakBars));

    //Needed for Backtest Arrays
    SR1 = CurrPeak > PriorPeak AND LastHigh == CurrPeak; //Curr Peak Higher - Divergence not possible
    SR2 = CurrPeak < PriorPeak AND LastHigh == CurrPeak; //Curr Peak Lower
    SR3 = Osc_Issue > Middle AND CurrPeak > PriorPeak AND LastHigh < CurrPeak; //Curr Peak Higher - Last High Lower
    SR4 = Osc_Issue > Middle AND CurrPeak < PriorPeak AND LastHigh < CurrPeak; //Curr Peak Lower - Best
    SR5 = LastHigh < Middle AND LastHigh < CurrPeak AND SR4==0 AND SR3==0; //Continuation signal with Osc_Issue < Middle


    //Needed for display
    Sel_SR1 = IIf(TradeON==1,LastValue(SR1),SelectedValue(SR1));
    Sel_SR2 = IIf(TradeON==1,LastValue(SR2),SelectedValue(SR2));
    Sel_SR3 = IIf(TradeON==1,LastValue(SR3),SelectedValue(SR3));
    Sel_SR4 = IIf(TradeON==1,LastValue(SR4),SelectedValue(SR4));
    Sel_SR5 = IIf(TradeON==1,LastValue(SR5),SelectedValue(SR5));


    //Determine Price Divergence
    if (Sel_SR1==1)
    {
    Bear_Diverge = 0;
    SDiv_Code = 11;
    Diverge = "";
    Pattern = "Higher High";
    }

    if (Sel_SR2==1)
    {
    Curr_HighPrice = HHV(High,5);
    Prior_PeakPrice = Ref(HHV(High,6),-(Sel_PriorPeakBars-3));
    Sel_CHighPrice = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
    Sel_PPeakPrice = IIf(TradeON==1,LastValue(Prior_PeakPrice),SelectedValue(Prior_PeakPrice));
    Sel_Bear_Diverge = Sel_CHighPrice >= Sel_PPeakPrice;

    if (Sel_Bear_Diverge==1)
    {
    Bear_Diverge = 1;
    SDiv_Code = 13;
    Diverge = "Bearish";
    Pattern = "Lower High";
    }
    else
    {
    Bear_Diverge = 0;
    SDiv_Code = 12;
    Diverge = "";
    Pattern = "Lower High";
    }
    }
     
    #359     Feb 9, 2006
  10. 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));
     
    #360     Feb 9, 2006