//+------------------------------------------------------------------+
//|                                                     AML_v1_3.mq4 |
//|                                        caveman @ Forex Factory   |
//|                                          v2 Mods by pips4life    |
//+------------------------------------------------------------------+
#property copyright "CaveMan"
#property link      "http://www.forexfactory.com"

#property indicator_chart_window

//2012-FEB-11  Mod v2 by pips4life :
//  Fixed the inaccurate placement of the 1st point for Mod.Schiff.  The time is left unchanged, however the price 
//    is adjusted such that the ML passes *exactly* through the midpoint of both price&time.  Previously the slope was 
//    off a bit.  This is usually due to the fact that the midpoint in time might occur at a half-bar, which is
//    impossible for MT4 to handle, so it had rounded either forward or back a half-bar.   AND/OR it might have been
//    due to the improper division of double-variables by the integer "2" instead of what is now "2.0".  It's a
//    subtle change that sometimes makes a difference in accuracy.
//
//  Reworked the object name scheme such that a suffix is used for created objects.  The suffix is "_" + the
//    value of "Choose_Type_of_Meridian_Lines" (default=1).  The BENEFIT of this change is that it allows the user
//    to add MULTIPLE instances of this indicator to a chart where all of them still use the same AL_Name object.
//    Hence, the Andrews can be drawn, and it's Warning lines, etc., AND a Mod.Schiff can be drawn and also display
//    its Warning lines, etc.    NOTE: The user can copy this indicator and rename the copies to unique names, and
//    then set the default value for "Choose_Type_of_Meridian_Lines" from "1" to "2", "3" and "4" for each of the 
//    various Pitchfork transforms.  Then when you want a Mod.Schiff, you add THAT indicator. Same for the others.
//
//  As a consequence of the above change, the NEW required names for Sliding parallels include the suffix.
//    Hence, to draw Andrews Sliding parallels, the user now creates lines named:  AL1SP1_1, AL1SP2_1, AL1SP3_1
//    For ModSchiff sliding parallels, the user now creates lines named: AL1SP1_3, AL1SP2_3, AL1SP3_3
//
//  NOTE: There is one minor flaw with this usage model, and that is that if each of the instances are
//    all looking for the same master pitchfork (e.g. "AL1"), then all of those indicators will be forcing 
//    the color & linestyle & other properties of object "AL1".   If they all agree, it's no problem.  If you
//    try to change the indicator properties for the color, etc. of object "AL1", then you created a fight and
//    only one indicator is going to win, forcing the properties however it does.  So... to make any such change,
//    you should edit ALL of the Indicator source files;  OR, you must edit every instance of the indicator on
//    a given chart and make the same change(s)! 
// 
//2012-JAN-04  Mod v1_1 :  
//  Changed default "Use_Fib_Levels_4_Inner_Lines" to "FALSE".  
//
//  Added 4-more "inner-lines" as quartiles OUTSIDE of the pitchfork.

//+----------------------------------------------------------------------------------------------------------+
//| 
//| A simple indicator to draw Andrew's Median Lines with support for
//| 
//| 1. Inner Lines (using fibonnaci levels and standard equal portions)
//| 2. Warning Lines 
//| 3. Reaction Lines
//| 4. Trigger Lines 
//| 5. Sliding Parallel Lines
//| 6. Andrew's, Schiff, Modified Schiff and Catalin 
//| 
//| To start using the indicator, start by plotting a Pitchfork onto the chart.
//| Next, rename the Pitchfork to the name you set in the indicator. Default is AL1.
//| 
//| Then go to the indicator property for options to custom configure to your own preference.
//| 
//| Instructions for using Sliding Parallel Lines
//| =============================================
//| 3 Sliding Parallel Lines are supported. To use Sliding Parallel Lines, just draw a trend line and rename 
//| it to AL_Name + SP1 or SP2 or SP3.
//| 
//| e.g. 
//| if using default AL_Name of AL1, then rename your sliding paralell lines as AL1SP1, AL1SP2 and AL1SP3.
//| 
//| Multiple instances of the indicator can be loaded to support multiple Andrew's Meridian Lines on a chart.
//| Be sure to allocate unique names to each of the ALs. The same applies for the sliding parallel lines.
//| 
//| e.g. if using 2nd AL with AL_Name AL2, then sliding paralells for this AL is AL2SP1, AL2SP2 and AL3SP3.
//| 
//| 
//| That's it.
//| 
//+----------------------------------------------------------------------------------------------------------+

extern string AL_Name = "AL1";
extern int Choose_Type_of_Meridian_Lines = 1;
extern string Option_1 = "Andrew ML";
extern string Option_2 = "Schiff ML (time same, price half P0 P1)";
extern string Option_3 = "Modified Schiff ML (price and time half P0 P1)";
extern string Option_4 = "Catalin ML (time same, price P0 = P2)";
extern string Hide_AL_Instruction1 = "Set same color as chart background to";
extern string Hide_AL_Instruction2 = "hide original AL when using modified MLs.";
extern color Original_AL_Color = DimGray;
extern color Chart_Bkgrd_Color = Black;

extern string Advance_Options = "Choose AL Extensions.";
extern bool Draw_Trigger_Lines = false;
extern bool Draw_Inner_Lines = true;
extern bool Use_Fib_Levels_4_Inner_Lines = FALSE; // MOD:  Orig was true.
extern string Use_Fib_3_Inner_Lines_Note1 = "True means use Fibonacci Levels. 4 Inner Lines.";
extern string Use_Fib_3_Inner_Lines_Note2 = "False means equally divided. Set no. of lines.";
extern int Num_Of__Inner_Lines_2_or_6 = 2;
extern bool Draw_Warning_Lines = true;
extern int Num_Of_Warning_Lines = 6;
extern bool Draw_Reaction_Lines = false;
extern int Num_Of_Reaction_Lines = 6;
extern bool Extend_Reaction_Lines = true;

extern bool Draw_Sliding_Parallel = true;
extern string Sliding_Parallel_Instruction1 = "To automate sliding parallel lines,";
extern string Sliding_Parallel_Instruction2 = "draw up to 3 trend lines and name them";
extern string Sliding_Parallel_Instruction3 = "as such: AL_Name defined above + SP1 to SP3 +";
extern string Sliding_Parallel_Instruction4 = "the suffix of '_' then the # of the Meridian-Line-Type";
extern string Sliding_Parallel_Instruction5 = "e.g AL1SP1_1, AL1SP2_1, AL1SP3_1 for Andrews sliding parallels.";
extern string Sliding_Parallel_Instruction6 = "e.g AL1SP1_3, AL1SP2_3, AL1SP3_3 for ModSchiff sliding parallels.";

extern string Look_and_Feel = "Set colors, width and styles";

extern string Settings_for_Meridian_Lines = "==========================================================";
extern color Main_AL_Color = Teal;
extern int Main_AL_Style = 0;
extern int Main_AL_Width = 0; 
extern color Modified_AL_Color = Blue;
extern int Modified_AL_Style = 0;
extern int Modified_AL_Width = 0;
extern string Settings_for_Inner_Lines = "==========================================================";
extern color Upper_LN1_Color = Gray;
extern int Upper_LN1_Style = STYLE_DOT;
extern int Upper_LN1_Width = 0; 
extern color Upper_LN2_Color = Gray;
extern int Upper_LN2_Style = STYLE_DASH;
extern int Upper_LN2_Width = 0;
extern color Upper_LN3_Color = Gray;
extern int Upper_LN3_Style = STYLE_DOT;
extern int Upper_LN3_Width = 0;
extern color Lower_LN1_Color = Gray;
extern int Lower_LN1_Style = STYLE_DOT;
extern int Lower_LN1_Width = 0;
extern color Lower_LN2_Color = Gray;
extern int Lower_LN2_Style = STYLE_DASH;
extern int Lower_LN2_Width = 0;
extern color Lower_LN3_Color = Gray;
extern int Lower_LN3_Style = STYLE_DOT;
extern int Lower_LN3_Width = 0;
extern string Settings_for_Warning_Lines = "==========================================================";
extern color Warning_LN_Color = Brown;
extern int Warning_LN_Style = STYLE_DASHDOT;
extern int Warning_LN_Width = 0;
extern string Settings_for_Reaction_Lines = "==========================================================";
extern color Reaction_LN_Color = Brown;
extern int Reaction_LN_Style = STYLE_DASHDOT;
extern int Reaction_LN_Width = 0;
extern string Settings_for_Sliding_Parallels = "==========================================================";
extern color Sliding_Parallel_Color = Yellow;
extern int Sliding_Parallel_Style = STYLE_SOLID;
extern int Sliding_Parallel_Width = 0;
extern string Settings_for_Trigger_Lines = "==========================================================";
extern color Trigger_Lines_Color = Gray;
extern int Trigger_Lines_Style = STYLE_DASHDOTDOT;
extern int Trigger_Lines_Width = 0;
extern string Settings_for_Info_Label = "==========================================================";
extern bool show_label = true;
extern color label_color = Red;
extern int label_window_corner = 0;
extern int label_x_shift = 5;
extern int label_y_shift = 20;
extern string label_font_type = "Arial";
extern int label_font_size = 10;

string SP_Name1, SP_Name2, SP_Name3, Orig_AL_Name;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string suffix = StringConcatenate("_",Choose_Type_of_Meridian_Lines);
   Orig_AL_Name = AL_Name;
   SP_Name1 = Orig_AL_Name+"SP1"+suffix;
   SP_Name2 = Orig_AL_Name+"SP2"+suffix;
   SP_Name3 = Orig_AL_Name+"SP3"+suffix;
   
   AL_Name = StringConcatenate(AL_Name,suffix);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete(AL_Name+"AL_Label");
   ObjectDelete(AL_Name+"Upper_ML1");
   ObjectDelete(AL_Name+"Upper_ML2");
   ObjectDelete(AL_Name+"Upper_ML3");
   ObjectDelete(AL_Name+"Lower_ML1");
   ObjectDelete(AL_Name+"Lower_ML2");
   ObjectDelete(AL_Name+"Lower_ML3");
   ObjectDelete(AL_Name+"Modified_AL");
   ObjectDelete(AL_Name+"Hidden_TL");
   ObjectDelete(AL_Name+"Trigger_Line1");
   ObjectDelete(AL_Name+"Trigger_Line2");
   ObjectDelete(SP_Name1+"1");
   ObjectDelete(SP_Name2+"1");
   ObjectDelete(SP_Name3+"1");
   for(int i=1; i <= Num_Of_Warning_Lines;i++)
      {
         string text = AL_Name+"Upper_Warning_LN"+i;
         ObjectDelete(text);
         text = AL_Name+"Lower_Warning_LN"+i;
         ObjectDelete(text);
      }
   for(i=1; i <= Num_Of_Reaction_Lines;i++)
      {
         text = AL_Name+"Reaction_LN1"+i;
         ObjectDelete(text);
         text = AL_Name+"Reaction_LN2"+i;
         ObjectDelete(text);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

int start()
  {
   if (ObjectFind(Orig_AL_Name)!= -1) // || ObjectFind(AL_Name+"Modified_AL") != -1)
      {
         double Price1 = ObjectGet(Orig_AL_Name, OBJPROP_PRICE1);
         double Price2 = ObjectGet(Orig_AL_Name, OBJPROP_PRICE2);
         double Price3 = ObjectGet(Orig_AL_Name, OBJPROP_PRICE3);
         datetime Time1 = ObjectGet(Orig_AL_Name, OBJPROP_TIME1);
         datetime Time2 = ObjectGet(Orig_AL_Name, OBJPROP_TIME2);
         datetime Time3  = ObjectGet(Orig_AL_Name, OBJPROP_TIME3);
   
         double PriceGap;    // Used to subdivide upper and lower ML into 8 portions
         double PriceShift;  // Used to calculate the next pair coorinates
         int TimeShift;      // for parallel lines
         double p1 = Price1, p2 = Price2, p3 = Price3;
         datetime t1 = Time1, t2 = Time2, t3 = Time3;

         if (ObjectGet(Orig_AL_Name, OBJPROP_COLOR) != Original_AL_Color)
            {
             ObjectSet(Orig_AL_Name, OBJPROP_COLOR, Main_AL_Color);
             ObjectSet(Orig_AL_Name, OBJPROP_STYLE, Main_AL_Style);
             ObjectSet(Orig_AL_Name, OBJPROP_WIDTH, Main_AL_Width);
             ObjectSet(Orig_AL_Name, OBJPROP_BACK, false);
            }
         if (ObjectFind(AL_Name+"AL_Label") == -1 && show_label)
            {
             ObjectCreate(AL_Name+"AL_Label",OBJ_LABEL,0,0,0);
             ObjectSet(AL_Name+"AL_Label", OBJPROP_CORNER, label_window_corner);
             ObjectSet(AL_Name+"AL_Label", OBJPROP_XDISTANCE, label_x_shift);
             ObjectSet(AL_Name+"AL_Label", OBJPROP_YDISTANCE, label_y_shift);
             ObjectSetText(AL_Name+"AL_Label", AL_Name+": Andrew ML", label_font_size, label_font_type, label_color);
             }
          else if (ObjectFind(AL_Name+"AL_Label") != -1 && !show_label)
            {
             ObjectDelete(AL_Name+"AL_Label");
            }
      // Types of ALs
      // 1 - Normal AL
      // 2 - Schiff
      // 3 - Modified Schiff (Catalin)
      // 4 - 50% Pitchfork (Austin Financial Group)
      // 5 - SuperPitchfork (Austin Financial Group)
         if (Choose_Type_of_Meridian_Lines == 2) { p1 = p1 + (p2 - p1)/2.0; if (show_label) ObjectSetText(AL_Name+"AL_Label", AL_Name+": Schiff ML", label_font_size, "Arial", label_color);}           
         if (Choose_Type_of_Meridian_Lines == 3) 
            {
             double denom = 2.0 * (TimeToBar(t1) - TimeToBar(t3));
             if (denom != 0.0) p1 = (p1 + p2)/2.0 + (p1 - p3)*(TimeToBar(t1) - TimeToBar(t2))/denom; 
             if (show_label) ObjectSetText(AL_Name+"AL_Label", AL_Name+": Modified Schiff ML", label_font_size, label_font_type, label_color);
            }         
//         if (Choose_Type_of_Meridian_Lines == 3) { p1 = p1 + (p2 - p1)/2; t1 = BarToTime(TimeToBar(t1) - (TimeToBar(t1) - TimeToBar(t2))/2) ; if (show_label) ObjectSetText(AL_Name+"AL_Label", AL_Name+": Modified Schiff ML", label_font_size, label_font_type, label_color);}         
         if (Choose_Type_of_Meridian_Lines == 4) { p1 = p3; if (show_label) ObjectSetText(AL_Name+"AL_Label", AL_Name+": Catalin ML", label_font_size, label_font_type, label_color);}           
         if (Choose_Type_of_Meridian_Lines > 1)
            {
             ObjectSet(Orig_AL_Name, OBJPROP_BACK, true);
             ObjectSet(Orig_AL_Name, OBJPROP_COLOR, Original_AL_Color);
             if (ObjectFind(AL_Name+"Modified_AL") == -1)
               {
                  ObjectCreate(AL_Name+"Modified_AL",OBJ_PITCHFORK,0, t1,p1,t2,p2,t3,p3);
                }
             else
               {
                  ObjectSet(AL_Name+"Modified_AL", OBJPROP_PRICE1, p1);
                  ObjectSet(AL_Name+"Modified_AL", OBJPROP_PRICE2, p2);
                  ObjectSet(AL_Name+"Modified_AL", OBJPROP_TIME1, t1);
                  ObjectSet(AL_Name+"Modified_AL", OBJPROP_TIME2, t2);
                  ObjectSet(AL_Name+"Modified_AL", OBJPROP_COLOR, Modified_AL_Color);
               }
             ObjectSet(AL_Name+"Modified_AL", OBJPROP_STYLE, Modified_AL_Style);
             ObjectSet(AL_Name+"Modified_AL", OBJPROP_COLOR, Modified_AL_Color);
             ObjectSet(AL_Name+"Modified_AL", OBJPROP_WIDTH, Modified_AL_Width);
             }
          else
          {
             ObjectSet(Orig_AL_Name, OBJPROP_BACK, false);
             ObjectSet(Orig_AL_Name, OBJPROP_COLOR, Main_AL_Color);
             ObjectSet(Orig_AL_Name, OBJPROP_STYLE, Main_AL_Style);
             ObjectSet(Orig_AL_Name, OBJPROP_WIDTH, Main_AL_Width);
          }
      //     
      // Price and Time Coordintes to draw parallel lines within MLs
      //
               double UpperP1, UpperP2, UpperP3, MiddleP0, LowerP1, LowerP2, LowerP3;
               int UT1Bar, UT2Bar, UT3Bar, MT0Bar, LT1Bar, LT2Bar, LT3Bar; // Time in bars for upper, mid and Lower inside lines

               int T1Bar, T2Bar, T3Bar, NumOfBars_T2T3, Bar_Gap, accuracy_factor = 10;
   
               T1Bar = TimeToBar(t1);
               T2Bar = TimeToBar(t2);
               T3Bar = TimeToBar(t3);

               NumOfBars_T2T3 = T2Bar - T3Bar; 
               Bar_Gap = (NumOfBars_T2T3)/8;

               UT1Bar = T2Bar - Bar_Gap;
               UT2Bar = T2Bar - Bar_Gap*2;
               UT3Bar = T2Bar - Bar_Gap*3;
               MT0Bar = T2Bar - Bar_Gap*4;
               LT1Bar = T3Bar + Bar_Gap*3;
               LT2Bar = T3Bar + Bar_Gap*2;
               LT3Bar = T3Bar + Bar_Gap;

               PriceGap = (p2 - p3)/8.0;
       
               UpperP1 = p2 - PriceGap;
               UpperP2 = p2 - PriceGap*2;
               UpperP3 = p2 - PriceGap*3;
               MiddleP0 = p2 - (p2 - p3)/2.0;
               LowerP1 = p3 + PriceGap*3;
               LowerP2 = p3 + PriceGap*2;
               LowerP3 = p3 + PriceGap;

/* 
There is a need here to multiple the shifts for both price and time by 2 as they are used for calculations of the 2nd
pivot point for drawing trendlines. If the 2 pivot points for drawing trendline are too close, there is a high chance
that the trendline drawn will not be totally parallel to the Meridian Lines. By increasing the distance between the 
pivots by a factor of 2 will reduce the slight misalignment of all lines drawn parallel to the Andrew Meridian Lines. 
This problem is less obvious when more bars are used for the ALs. 
*/       
               PriceShift = (MiddleP0 - p1)*accuracy_factor; 
               TimeShift = (T1Bar - MT0Bar)*accuracy_factor;   

         if (Draw_Inner_Lines)
            {
               if (Use_Fib_Levels_4_Inner_Lines)
                  {
                     SetLN(AL_Name+"Upper_ML1", BarToTime(T2Bar - (NumOfBars_T2T3*0.382)), p2 - (p2 - p3)*0.382, BarToTime(T2Bar - (NumOfBars_T2T3*0.382) - TimeShift), p2 - (p2 - p3)*0.382 + PriceShift, Upper_LN1_Color,Upper_LN1_Style,Upper_LN1_Width, true);
                     SetLN(AL_Name+"Lower_ML1", BarToTime(T3Bar + (NumOfBars_T2T3*0.382)), p3 + (p2 - p3)*0.382, BarToTime(T3Bar + (NumOfBars_T2T3*0.382) - TimeShift), p3 + (p2 - p3)*0.382 + PriceShift, Lower_LN1_Color,Lower_LN1_Style,Lower_LN1_Width, true);
                     SetLN(AL_Name+"Upper_ML2", BarToTime(T2Bar - (NumOfBars_T2T3*0.236)), p2 - (p2 - p3)*0.236, BarToTime(T2Bar - (NumOfBars_T2T3*0.236) - TimeShift), p2 - (p2 - p3)*0.236 + PriceShift, Upper_LN1_Color,Upper_LN1_Style,Upper_LN1_Width, true);
                     SetLN(AL_Name+"Lower_ML2", BarToTime(T3Bar + (NumOfBars_T2T3*0.236)), p3 + (p2 - p3)*0.236, BarToTime(T3Bar + (NumOfBars_T2T3*0.236) - TimeShift), p3 + (p2 - p3)*0.236 + PriceShift, Lower_LN1_Color,Lower_LN1_Style,Lower_LN1_Width, true);
                  }
               else if (Num_Of__Inner_Lines_2_or_6 == 2)
                  {
                     SetLN(AL_Name+"Upper_ML1", BarToTime(UT2Bar), UpperP2, BarToTime(UT2Bar - TimeShift), UpperP2 + PriceShift, Upper_LN2_Color,Upper_LN2_Style,Upper_LN2_Width, true);
                     SetLN(AL_Name+"Lower_ML1", BarToTime(LT2Bar), LowerP2, BarToTime(LT2Bar - TimeShift), LowerP2 + PriceShift, Lower_LN2_Color,Lower_LN2_Style,Lower_LN2_Width, true);
                     // MOD: The lines below add additional "quartiles" outside of the original pitchfork
                     SetLN(AL_Name+"Upper_ML2", BarToTime(T2Bar - (NumOfBars_T2T3* (-0.25))), p2 - (p2 - p3)* (-0.25), BarToTime(T2Bar - (NumOfBars_T2T3* (-0.25)) - TimeShift), p2 - (p2 - p3)* (-0.25) + PriceShift, Upper_LN1_Color,Upper_LN1_Style,Upper_LN1_Width, true);
                     SetLN(AL_Name+"Lower_ML2", BarToTime(T3Bar + (NumOfBars_T2T3* (-0.25))), p3 + (p2 - p3)* (-0.25), BarToTime(T3Bar + (NumOfBars_T2T3* (-0.25)) - TimeShift), p3 + (p2 - p3)* (-0.25) + PriceShift, Lower_LN1_Color,Lower_LN1_Style,Lower_LN1_Width, true);
                     SetLN(AL_Name+"Upper_ML3", BarToTime(T2Bar - (NumOfBars_T2T3* (-0.75))), p2 - (p2 - p3)* (-0.75), BarToTime(T2Bar - (NumOfBars_T2T3* (-0.75)) - TimeShift), p2 - (p2 - p3)* (-0.75) + PriceShift, Upper_LN1_Color,Upper_LN1_Style,Upper_LN1_Width, true);
                     SetLN(AL_Name+"Lower_ML3", BarToTime(T3Bar + (NumOfBars_T2T3* (-0.75))), p3 + (p2 - p3)* (-0.75), BarToTime(T3Bar + (NumOfBars_T2T3* (-0.75)) - TimeShift), p3 + (p2 - p3)* (-0.75) + PriceShift, Lower_LN1_Color,Lower_LN1_Style,Lower_LN1_Width, true);
                  }
               else
                  {
                     SetLN(AL_Name+"Upper_ML1", BarToTime(UT1Bar), UpperP1, BarToTime(UT1Bar - TimeShift), UpperP1 + PriceShift, Upper_LN1_Color,Upper_LN1_Style,Upper_LN1_Width, true);
                     SetLN(AL_Name+"Upper_ML2", BarToTime(UT2Bar), UpperP2, BarToTime(UT2Bar - TimeShift), UpperP2 + PriceShift, Upper_LN2_Color,Upper_LN2_Style,Upper_LN2_Width, true);
                     SetLN(AL_Name+"Upper_ML3", BarToTime(UT3Bar), UpperP3, BarToTime(UT3Bar - TimeShift), UpperP3 + PriceShift, Upper_LN3_Color,Upper_LN3_Style,Upper_LN3_Width, true);
                     SetLN(AL_Name+"Lower_ML1", BarToTime(LT1Bar), LowerP1, BarToTime(LT1Bar - TimeShift), LowerP1 + PriceShift, Lower_LN1_Color,Lower_LN1_Style,Lower_LN1_Width, true);
                     SetLN(AL_Name+"Lower_ML2", BarToTime(LT2Bar), LowerP2, BarToTime(LT2Bar - TimeShift), LowerP2 + PriceShift, Lower_LN2_Color,Lower_LN2_Style,Lower_LN2_Width, true);
                     SetLN(AL_Name+"Lower_ML3", BarToTime(LT3Bar), LowerP3, BarToTime(LT3Bar - TimeShift), LowerP3 + PriceShift, Lower_LN3_Color,Lower_LN3_Style,Lower_LN3_Width, true);
                  }
            }
         if (Draw_Warning_Lines)
            {
               for(int x=1; x <= Num_Of_Warning_Lines;x++)
                  {
                     string txt = AL_Name+"Upper_Warning_LN"+x;
                     SetLN(txt,  BarToTime(T2Bar + (T2Bar - MT0Bar)*x), p2 + (p2-MiddleP0)*x, BarToTime((T2Bar + (T2Bar - MT0Bar)*x) - TimeShift), p2 + (p2-MiddleP0)*x + PriceShift, Warning_LN_Color,Warning_LN_Style,Warning_LN_Width, true);               
                     txt = AL_Name+"Lower_Warning_LN"+x;
                     SetLN(txt,  BarToTime(T3Bar - (T2Bar - MT0Bar)*x), p3 - (p2-MiddleP0)*x, BarToTime((T3Bar - (T2Bar - MT0Bar)*x) - TimeShift), p3 - (p2-MiddleP0)*x + PriceShift, Warning_LN_Color,Warning_LN_Style,Warning_LN_Width, true);               
                  }
            }
         if (Draw_Reaction_Lines)
            {
               for(x=1; x <= Num_Of_Reaction_Lines;x++)
                  {
                     txt = AL_Name+"Reaction_LN1"+x;
                     SetLN(txt, BarToTime(T2Bar - TimeShift/accuracy_factor*x), p2 + PriceShift/accuracy_factor*x , BarToTime(T3Bar - TimeShift/accuracy_factor*x), p3 + PriceShift/accuracy_factor*x,  Reaction_LN_Color,Reaction_LN_Style,Reaction_LN_Width, Extend_Reaction_Lines);               
                     txt = AL_Name+"Reaction_LN2"+x;
                     SetLN(txt,BarToTime(T3Bar - TimeShift/accuracy_factor*x), p3 + PriceShift/accuracy_factor*x ,   BarToTime(T2Bar - TimeShift/accuracy_factor*x), p2 + PriceShift/accuracy_factor*x, Reaction_LN_Color,Reaction_LN_Style,Reaction_LN_Width, Extend_Reaction_Lines);               
                  }            
            }
         if (Draw_Trigger_Lines)
            {
                  SetLN(AL_Name+"Trigger_Line1", t1, p1, t2, p2, Trigger_Lines_Color,Trigger_Lines_Style,Trigger_Lines_Width, true);               
                  SetLN(AL_Name+"Trigger_Line2", t1, p1, t3, p3, Trigger_Lines_Color,Trigger_Lines_Style,Trigger_Lines_Width, true);               
             }
         if (Draw_Sliding_Parallel)
            {
             if (ObjectFind(AL_Name+"Hidden_TL") == -1)
               { 
                  ObjectCreate(AL_Name+"Hidden_TL", OBJ_TREND, 0,t1,p1, BarToTime(TimeToBar(t1)- TimeShift), p1 + PriceShift);
//                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_COLOR, Red); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_COLOR, Chart_Bkgrd_Color); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_BACK, true);
               }
             else
               {
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_PRICE1, p1); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_PRICE2, p1 + PriceShift);
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_TIME1, t1); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_TIME2, BarToTime(TimeToBar(t1)- TimeShift));
//                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_COLOR, Red); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_COLOR, Chart_Bkgrd_Color); 
                  ObjectSet(AL_Name+"Hidden_TL", OBJPROP_BACK, true);
               }
            for (x=1;x <=3;x++)
               {
               switch(x)
                  {
                     case 1: string line_name = SP_Name1;break;
                     case 2: line_name = SP_Name2;break;
                     case 3: line_name = SP_Name3;break;                     
                   }
               if (ObjectFind(line_name) != -1)
                  {
                     double sl_p; datetime sl_t;
                     sl_p = ObjectGet(line_name, OBJPROP_PRICE1);
                     sl_t = ObjectGet(line_name, OBJPROP_TIME1);
                  
                     ObjectSet(line_name, OBJPROP_TIME2, BarToTime(TimeToBar(sl_t) - TimeShift));
                     ObjectSet(line_name, OBJPROP_PRICE2, sl_p + PriceShift);
                     ObjectSet(line_name, OBJPROP_COLOR, Sliding_Parallel_Color);
                     ObjectSet(line_name, OBJPROP_STYLE, Sliding_Parallel_Style);
                     ObjectSet(line_name, OBJPROP_WIDTH, Sliding_Parallel_Width);
                     ObjectSet(line_name, OBJPROP_RAY, true);
                     
                     double check = ObjectGetValueByShift(AL_Name+"Hidden_TL", TimeToBar(sl_t)/10);

                     if (p2 > p3 && sl_p > check)
                        {
                          SetLN(line_name+1, BarToTime(TimeToBar(sl_t)-(T2Bar - T3Bar + 1)), sl_p - (p2 - p3), BarToTime(TimeToBar(sl_t)-(T2Bar - T3Bar + 1)- TimeShift),  sl_p - (p2 -p3) + PriceShift,  Sliding_Parallel_Color,Sliding_Parallel_Style,Sliding_Parallel_Width, true);               
                         }
                     else if (p2 > p3 && sl_p < check) 
                        {
                          SetLN(line_name+1, BarToTime(TimeToBar(sl_t)+(T2Bar - T3Bar + 1)), sl_p + (p2 - p3), BarToTime(TimeToBar(sl_t)+(T2Bar - T3Bar + 1)- TimeShift),  sl_p + (p2 -p3) + PriceShift,  Sliding_Parallel_Color,Sliding_Parallel_Style,Sliding_Parallel_Width, true);               
                        }
                     else if (p3 > p2 && sl_p > check)
                        {
                          SetLN(line_name+1, BarToTime(TimeToBar(sl_t)+(T2Bar - T3Bar + 1)), sl_p + (p2 - p3), BarToTime(TimeToBar(sl_t)+(T2Bar - T3Bar + 1)- TimeShift),  sl_p + (p2 -p3) + PriceShift,  Sliding_Parallel_Color,Sliding_Parallel_Style,Sliding_Parallel_Width, true);               
                         }
                     else if (p3 > p2 && sl_p < check) 
                        {
                          SetLN(line_name+1, BarToTime(TimeToBar(sl_t)-(T2Bar - T3Bar + 1)), sl_p - (p2 - p3), BarToTime(TimeToBar(sl_t)-(T2Bar - T3Bar + 1)- TimeShift),  sl_p - (p2 -p3) + PriceShift,  Sliding_Parallel_Color,Sliding_Parallel_Style,Sliding_Parallel_Width, true);               
                        }
                  }
                else if (ObjectFind(line_name) == -1) if (ObjectFind(line_name+1)!= -1) ObjectDelete(line_name+1);
                }
             }
   }
   return(0);
  }
//+------------------------------------------------------------------+

void SetLN(string text, datetime t1, double p1,datetime t2, double p2, color col, int style, int width, bool extend_ray) {
   string linename=text;
   // create or move the object 
   if (ObjectFind(linename) < 0) {
      ObjectCreate(linename, OBJ_TREND, 0, t1, p1, t2, p2);
      ObjectSet(linename, OBJPROP_RAY, extend_ray);
      ObjectSet(linename, OBJPROP_STYLE, style);
      ObjectSet(linename, OBJPROP_COLOR, col);
      ObjectSet(linename, OBJPROP_WIDTH, width);
   } else {
      ObjectSet(linename, OBJPROP_TIME1, t1);
      ObjectSet(linename, OBJPROP_TIME2, t2);
      ObjectSet(linename, OBJPROP_PRICE1, p1);
      ObjectSet(linename, OBJPROP_PRICE2, p2);
   }
}

datetime BarToTime(int bar)
  {
    bar /= 10;
    
    if (bar >= 0)
      return(Time[bar]);
    else
      {
        return(Time[0] + (-bar * Period() * 60));
      }
  }
  
int TimeToBar(datetime d)  
  {
    if (d > Time[0])
      return(((Time[0] - d) / (Period() * 60)) * 10);
    else
      return(10 * iBarShift(NULL, 0, d, false));
  }

