//+------------------------------------------------------------------+
//|                                                   ICWR Color     |
//+------------------------------------------------------------------+
#property copyright "ICWR Color"
#property link      "ICWR Color"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 EMPTY 

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int RequiredWaveHeight=100;
extern bool ShowPrice=True;

//---- indicator buffers--
double ExtMapBuffer[];
double ExtMapBuffer2[];
double Fibo1=0;
double Fibo2=0;
double Fibo3=0;
double Fibo4=0;
double Fibo5=0;
double Fibo6=0;
double Fibo7=0;//<<<<<<<<<ADDED THE NEXT 4
double Fibo8=0;
double Fibo9=0;
double Fibo10=0;
double Fibo11=0;

string oname = "icwr_";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(2);

//---- drawing settings-----------
   SetIndexStyle(0,DRAW_SECTION);
   
//---- indicator buffers mapping --------
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
   ArraySetAsSeries(ExtMapBuffer,true);
   ArraySetAsSeries(ExtMapBuffer2,true);
   
//---- indicator short name -------------------------------------------------------------
   IndicatorShortName("ICWR Color Ext("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");

//---- initialization done
   return(0);
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+

int deinit()                           
{                                 
   /*                                    
   ObjectDelete("ActiveWave");
   ObjectDelete("Fibo1");
   ObjectDelete("Fibo2");
   ObjectDelete("Fibo3");
   ObjectDelete("Fibo4");
   ObjectDelete("Fibo5");
   ObjectDelete("Fibo6");
   */
   delete_obj();
   return(0);
}

//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
int start(){
   static int last_bar = 0;
   if(last_bar==Bars) return (0);
   last_bar = Bars;

   delete_obj();
   
   int    shift,back,lasthighpos,lastlowpos,LastActivePos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow,LastActive;
   
   int AWStartPos, AWEndPos;
   double AWStart, AWEnd;
   
   double FiboL, FiboH, FiboLC, FiboLR, FiboHR, FiboHC;

   for(shift=Bars-ExtDepth; shift>=0; shift--){
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow)
         val=0.0;              
      else{ 
         lastlow=val;
         if((Low[shift]-val)>(ExtDeviation*Point)) 
            val=0.0;                   
         else{                           
            for(back=1; back<=ExtBackstep; back++){                      
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) 
                  ExtMapBuffer[shift+back]=0.0; 
               }
            }
         } 
      ExtMapBuffer[shift]=val;    
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh)
         val=0.0;
      else{
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point))
            val=0.0;
         else{
            for(back=1; back<=ExtBackstep; back++){
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) 
                  ExtMapBuffer2[shift+back]=0.0; 
               } 
            }
         }
      ExtMapBuffer2[shift]=val;
      }

   // final cutting 
   lasthigh=-1; 
   lasthighpos=-1;
   lastlow=-1;  
   lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--){
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      
      if((curlow==0)&&(curhigh==0))
         continue;                   
      
      if(curhigh!=0){
         if(lasthigh>0){
            if(lasthigh<curhigh)
               ExtMapBuffer2[lasthighpos]=0;
            else
               ExtMapBuffer2[shift]=0;
            }
         
         if(lasthigh<curhigh || lasthigh<0){                             
            lasthigh=curhigh;         
            lasthighpos=shift;      
            }
         lastlow=-1;              
         }

      if(curlow!=0){
         if(lastlow>0){
            if(lastlow>curlow) 
               ExtMapBuffer[lastlowpos]=0;
            else 
               ExtMapBuffer[shift]=0;
            }

         if((curlow<lastlow)||(lastlow<0)){
            lastlow=curlow;
            lastlowpos=shift;
            } 
         lasthigh=-1;
         }
      }
  
   for(shift=Bars-1; shift>=0; shift--){                               
      if(shift>=Bars-ExtDepth)   
         ExtMapBuffer[shift]=0.0; 
      else{                          
         res=ExtMapBuffer2[shift];   
         if(res!=0.0)              
            ExtMapBuffer[shift]=res;
         }                           
      }                              

   LastActive = -1;
   LastActivePos = -1;
      
   for(shift=0; shift<=Bars-ExtDepth; shift++){
      if(ExtMapBuffer[shift]!=0.0){
         if(LastActive > 0){
            if(MathAbs(LastActive - ExtMapBuffer[shift]) >= RequiredWaveHeight*Point){
               AWStartPos = shift;
               AWStart = ExtMapBuffer[shift];
               AWEndPos = LastActivePos;
               AWEnd = LastActive;
 //====================================================================================================================================================              
               if(AWStart < AWEnd){
                  FiboL = AWStart;
                  FiboH = AWEnd;
                  }
               else{
                  FiboL = AWEnd;
                  FiboH = AWStart;
                  }
               create_line(Time[AWStartPos],Time[AWEndPos],DarkSlateGray,AWStart,AWEnd,false,STYLE_DOT,0);//White//STYLE_SOLID
               create_line(Time[AWStartPos],Time[0],Yellow,AWStart,AWStart,false,STYLE_SOLID,0);
               create_line(Time[AWStartPos],Time[0],Yellow,AWEnd,AWEnd,false,STYLE_SOLID,100);
               
               create_line(Time[AWStartPos],Time[0],Magenta,AWEnd+(AWStart-AWEnd)*1.236,AWEnd+(AWStart-AWEnd)*1.236,false,STYLE_DOT,-23.6);
               create_line(Time[AWStartPos],Time[0],Magenta,AWEnd+(AWStart-AWEnd)*1.125,AWEnd+(AWStart-AWEnd)*1.125,false,STYLE_DOT,-12.5);
               create_line(Time[AWStartPos],Time[0],Lime,AWEnd+(AWStart-AWEnd)*0.236,AWEnd+(AWStart-AWEnd)*0.236,false,STYLE_DOT,100-23.6);//0.236
               create_line(Time[AWStartPos],Time[0],Orange,AWEnd+(AWStart-AWEnd)*0.382,AWEnd+(AWStart-AWEnd)*0.382,false,STYLE_DOT,100-38.2);//38.2
               create_line(Time[AWStartPos],Time[0],Yellow,AWEnd+(AWStart-AWEnd)*0.50,AWEnd+(AWStart-AWEnd)*0.50,false,STYLE_SOLID,50);
               create_line(Time[AWStartPos],Time[0],Orange,AWEnd+(AWStart-AWEnd)*0.618,AWEnd+(AWStart-AWEnd)*0.618,false,STYLE_DOT,100-61.8);//61.8
               create_line(Time[AWStartPos],Time[0],Lime,AWEnd+(AWStart-AWEnd)*0.764,AWEnd+(AWStart-AWEnd)*0.764,false,STYLE_DOT,100-76.4);//78.6
               create_line(Time[AWStartPos],Time[0],Yellow,AWEnd+(AWStart-AWEnd)*(0.0-0.125),AWEnd+(AWStart-AWEnd)*(0.0-0.125),false,STYLE_DOT,112.5);
               create_line(Time[AWStartPos],Time[0],Magenta,AWEnd+(AWStart-AWEnd)*(0.0-0.236),AWEnd+(AWStart-AWEnd)*(0.0-0.236),false,STYLE_DOT,123.6);
               create_line(Time[AWStartPos],Time[0],Yellow,AWEnd+(AWStart-AWEnd)*(0.0-0.382),AWEnd+(AWStart-AWEnd)*(0.0-0.382),false,STYLE_DOT,138.2);
               create_line(Time[AWStartPos],Time[0],Red,AWEnd+(AWStart-AWEnd)*(0.0-0.50),AWEnd+(AWStart-AWEnd)*(0.0-0.50),false,STYLE_SOLID,150);
/*
        
//=========================================================================================================================================================            
               if(ObjectFind("ActiveWave") != 0){
                  ObjectCreate("ActiveWave", OBJ_TREND, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("ActiveWave", OBJPROP_STYLE, STYLE_SOLID);
                  ObjectSet("ActiveWave", OBJPROP_COLOR, White);  //Red             
                  ObjectSet("ActiveWave", OBJPROP_WIDTH, 3);
                  ObjectSet("ActiveWave", OBJPROP_RAY, false);  
                  }
               else{
                  ObjectMove("ActiveWave", 0, Time[AWStartPos], AWStart);
                  ObjectMove("ActiveWave", 1, Time[AWEndPos], AWEnd);
                  }
            
               if(ObjectFind("Fibo1") != 0){
                  ObjectCreate("Fibo1", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo1", OBJPROP_STYLE, STYLE_DASHDOT);// STYLE_SOLID
                  ObjectSet("Fibo1", OBJPROP_COLOR, RosyBrown);               
                  ObjectSet("Fibo1", OBJPROP_LEVELCOLOR, RosyBrown);               
                  
                  ObjectSet("Fibo1", OBJPROP_WIDTH, 1); //2
                  ObjectSet("Fibo1", OBJPROP_FIBOLEVELS, 1);
                  ObjectSet("Fibo1", OBJPROP_FIRSTLEVEL+0, 0);
                  }
               else{
                  ObjectMove("Fibo1", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo1", 1, Time[AWEndPos], AWEnd);
                  }
 //======================================================================================================================================              
               
               if(ObjectFind("Fibo2") != 0){
                  ObjectCreate("Fibo2", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo2", OBJPROP_STYLE, STYLE_DASHDOT);  // SOLID
                  ObjectSet("Fibo2", OBJPROP_COLOR, SpringGreen);               
                  ObjectSet("Fibo2", OBJPROP_WIDTH, 1); //2
                  ObjectSet("Fibo2", OBJPROP_FIBOLEVELS, 2);
                  ObjectSet("Fibo2", OBJPROP_FIRSTLEVEL+1, 0.236); 
                  }
               else{
                  ObjectMove("Fibo2", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo2", 1, Time[AWEndPos], AWEnd);
                  }
              
 //===============================================================================================================================             
               if(ObjectFind("Fibo3") != 0){
                  ObjectCreate("Fibo3", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo3", OBJPROP_STYLE, STYLE_DASHDOT);  //SOLID
                  ObjectSet("Fibo3", OBJPROP_COLOR, Aqua);                
                  ObjectSet("Fibo3", OBJPROP_WIDTH, 1); //2
                  ObjectSet("Fibo3", OBJPROP_FIBOLEVELS, 3);
                  ObjectSet("Fibo3", OBJPROP_FIRSTLEVEL+1, 0.382); 
                  }
               else{
                  ObjectMove("Fibo3", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo3", 1, Time[AWEndPos], AWEnd);
                  }
               
//==============================================================================================================               
               if(ObjectFind("Fibo4") != 0){
                  ObjectCreate("Fibo4", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo4", OBJPROP_STYLE, STYLE_DASHDOT); //SOLID
                  ObjectSet("Fibo4", OBJPROP_COLOR, Aqua);               
                  ObjectSet("Fibo4", OBJPROP_WIDTH, 1); //2
                  ObjectSet("Fibo4", OBJPROP_FIBOLEVELS, 4);
                  ObjectSet("Fibo4", OBJPROP_FIRSTLEVEL+1, 0.618); 
                  }
               else{
                  ObjectMove("Fibo4", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo4", 1, Time[AWEndPos], AWEnd);
                  }
               
//==============================================================================================================               
               if(ObjectFind("Fibo5") != 0){
                  ObjectCreate("Fibo5", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo5", OBJPROP_STYLE, STYLE_DASHDOT); //SOLID
                  ObjectSet("Fibo5", OBJPROP_COLOR, SpringGreen);                 
                  ObjectSet("Fibo5", OBJPROP_WIDTH, 1); //2
                  ObjectSet("Fibo5", OBJPROP_FIBOLEVELS, 5);
                  ObjectSet("Fibo5", OBJPROP_FIRSTLEVEL+1, 0.764);  
                  }
               else{
                  ObjectMove("Fibo5", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo5", 1, Time[AWEndPos], AWEnd);
                  }
               
 //==============================================================================================================              
               if(ObjectFind("Fibo6") != 0){
                  ObjectCreate("Fibo6", OBJ_FIBO, 0, Time[AWStartPos], AWStart, Time[AWEndPos], AWEnd);
                  ObjectSet("Fibo6", OBJPROP_STYLE, STYLE_DASHDOT); //SOLID
                  ObjectSet("Fibo6", OBJPROP_COLOR, RosyBrown);               
                  ObjectSet("Fibo6", OBJPROP_WIDTH, 1);  //2
                  ObjectSet("Fibo6", OBJPROP_FIBOLEVELS, 3);
                  ObjectSet("Fibo6", OBJPROP_FIRSTLEVEL+1, 1.0); 
                  }
               else{
                  ObjectMove("Fibo6", 0, Time[AWStartPos], AWStart);
                  ObjectMove("Fibo6", 1, Time[AWEndPos], AWEnd);
                  }
       
//=================================================================================================================               
*/
               break;
               }
            }
         LastActive = ExtMapBuffer[shift];
         LastActivePos = shift;
         }
      }
}

void delete_obj(){
   string  buff_str = "";
   for(int i=ObjectsTotal()-1;i>=0;i--){
      buff_str = ObjectName(i);
      if(StringFind(buff_str,oname,0)==0) ObjectDelete(buff_str);
      }
}

void create_line(datetime from,datetime to,color c,double p0,double p1,bool,int type, double Percent){
   static int acc = 0;
   string  buff_str = oname+acc; acc++;
   ObjectCreate(buff_str, OBJ_TREND, 0, from, p0, to, p1);
   ObjectSet(buff_str,OBJPROP_RAY,true);
   ObjectSet(buff_str,OBJPROP_BACK,true);
   ObjectSet(buff_str,OBJPROP_COLOR,c);
   ObjectSet(buff_str,OBJPROP_STYLE,type);
   if(type!=STYLE_SOLID){
      ObjectSet(buff_str,OBJPROP_WIDTH,1);
      }
   else{
      ObjectSet(buff_str,OBJPROP_WIDTH,2);
      }

   if (ShowPrice && to==Time[0])
   {
      string label = buff_str+"SPP";
      ObjectDelete(label);
      ObjectCreate( label, OBJ_TEXT, 0, 0,0,0);
      ObjectSetText(label, DoubleToStr(NormalizeDouble(p0,Digits),Digits)+" ("+DoubleToStr(Percent,2) +"%)" , 10, "Times New Roman", c);
      ObjectSet( label, OBJPROP_COLOR, c);
      ObjectSet( label, OBJPROP_TIME1, to);
      ObjectSet( label, OBJPROP_PRICE1, p0);

   }   
}
//=============================================================+
                  
                  


