//+----------------------------------------------------------------------------------+
//|                                                           Candle_Temperatura.mq4 |
//|                                                                                  |
//+----------------------------------------------------------------------------------+
#property copyright "rodolfo.leonardo@gmail.com"
#property version       "1.30"
#property link          "https://www.mql5.com/pt/users/rodolfolm"
#property description   "Indicator Candle heat"
#property strict


//===================================//
#property indicator_chart_window
#property indicator_buffers 1
//===================================//
enum CSpectrum
  {
   GREEN = 1, // Green
   RED = 2 // Red
  };

extern            bool MaxMinVolume_AllCandles=false; // false/true - Determination of the maximum volume / min on each candle separately / on all candles
extern            bool CandleShadow=true; // Display "temperature" in shadows of candles
extern            bool CandleBody=true; // Display "temperature" on the bodies of candles
extern       CSpectrum BullSpectrum=GREEN; //Spectrum for candles "high"
extern       CSpectrum BearSpectrum=RED; // Spectrum for "low" candles
extern             int DrawSize=1; // Candle cell size (in points)
extern ENUM_TIMEFRAMES VolumeTf=PERIOD_M15; //Period of time (in minutes) from which the volume values ​​are read
extern             int SumBars=2; // Number of candles to display the "temperature"
                          //===================================//
                          
double MaxVolume,MinVolume,Volume_;
int Bars_,TimePrev=0;
//===================================//
int init()
  {
   HistoryCheck();

   return(0);
  }
//===================================//
int deinit()
  {
   Comment("");
   Obj_Del();

   return(0);
  }
//===================================//
int start()
  {
   if(TimePrev==Time[0])
     {
      RemoveObjects();
      CandlesDraw(1);
     }
   else
     {
      if(SumBars>0)
        {
         Bars_=SumBars;
         if(Bars_>Bars) Bars_=Bars;
        }
      else
         Bars_=Bars;
      MaxVolume=0.0; MinVolume=0.0;
      Obj_Del();
      CandlesDraw(Bars_);
      TimePrev=Time[0];
     }
   return(0);
  }
//===================================//
void CandlesDraw(int sum)
  {
   double HighValue,LowValue,HighValue_,LowValue_,High_,Low_,Vol_,
   Step=DrawSize*Point;
   int i,j,n,Time_,cell_numb,Spectrum;

   if(MaxMinVolume_AllCandles)
     { // расчёт макс/мин объёма по всем свечам
      if(CandleBody)
        {
         for(i=0; i<=sum-1; i++)
           {
            if(!CandleShadow)
              {
               HighValue=ND(MathMax(Open[i],Close[i]));
               LowValue=ND(MathMin(Open[i],Close[i]));
               if(ND(HighValue-LowValue)==0.0) continue;
              }
            else
              {
               HighValue=ND(High[i]);
               LowValue=ND(Low[i]);
               if(ND(HighValue-LowValue)==0.0) continue;
              }

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while
           } // end of for

         for(i=0; i<=sum-1; i++)
           {
            if(!CandleShadow)
              {
               HighValue=ND(MathMax(Open[i],Close[i]));
               LowValue=ND(MathMin(Open[i],Close[i]));
               if(ND(HighValue-LowValue)==0.0) continue;
              }
            else
              {
               HighValue=ND(High[i]);
               LowValue=ND(Low[i]);
               if(ND(HighValue-LowValue)==0.0) continue;
              }

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));

              } // end of while
           } // end of for
        }
      else if(CandleShadow)
        {
         for(i=0; i<=sum-1; i++)
           {
            HighValue=ND(High[i]);
            LowValue=ND(MathMax(Open[i],Close[i]));
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while
           } // end of for

         for(i=0; i<=sum-1; i++)
           {
            HighValue=ND(MathMin(Open[i],Close[i]));
            LowValue=ND(Low[i]);
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while
           } // end of for

         for(i=0; i<=sum-1; i++)
           {
            HighValue=ND(High[i]);
            LowValue=ND(MathMax(Open[i],Close[i]));
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
              } // end of while
           } // end of for

         for(i=0; i<=sum-1; i++)
           {
            HighValue=ND(MathMin(Open[i],Close[i]));
            LowValue=ND(Low[i]);
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
              } // end of while
           } // end of for
        }
     }
   else if(!MaxMinVolume_AllCandles)
     { // расчёт макс/мин объёма по каждой свече
      if(CandleBody)
        {
         for(i=0; i<=sum-1; i++)
           {
            if(!CandleShadow)
              {
               HighValue=ND(MathMax(Open[i],Close[i]));
               LowValue=ND(MathMin(Open[i],Close[i]));
               if(ND(HighValue-LowValue)==0.0) continue;
              }
            else
              {
               HighValue=ND(High[i]);
               LowValue=ND(Low[i]);
               if(ND(HighValue-LowValue)==0.0) continue;
              }

            n=0; HighValue_=0.0; MinVolume=0.0; MaxVolume=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));

              } // end of while
           } // end of for
        }
      else if(CandleShadow)
        {
         for(i=0; i<=sum-1; i++)
           {
            HighValue=ND(High[i]);
            LowValue=ND(MathMax(Open[i],Close[i]));
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0; MinVolume=0.0; MaxVolume=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while

            HighValue=ND(MathMin(Open[i],Close[i]));
            LowValue=ND(Low[i]);
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(Volume_!=0.0)
                 {
                  if(Volume_>MaxVolume) MaxVolume=Volume_;
                  if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
                 }

              } // end of while

            HighValue=ND(High[i]);
            LowValue=ND(MathMax(Open[i],Close[i]));
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
              } // end of while

            HighValue=ND(MathMin(Open[i],Close[i]));
            LowValue=ND(Low[i]);
            if(ND(HighValue-LowValue)==0.0) continue;

            n=0; HighValue_=0.0;
            while(HighValue>HighValue_)
              {
               if(n==0)
                 {
                  LowValue_=LowValue;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  n++;
                 }
               else
                 {
                  LowValue_=HighValue_;
                  HighValue_=ND(LowValue_+Step);
                  if(HighValue<HighValue_) HighValue_=HighValue;
                  if(ND(HighValue_-LowValue_)==0.0) break;
                 }

               if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
               j=iBarShift(_Symbol,VolumeTf,Time[i]);
               Volume_=0.0;

               while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
                 {
                  High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
                  Low_=ND(iLow(_Symbol,VolumeTf,j));
                  Vol_=iVolume(_Symbol,VolumeTf,j);
                  if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
                  if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
                     Volume_=Volume_+Vol_;
                  else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
                                                     Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
                  else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
                                 Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
                  else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
                                Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);

                  j--;
                 } // end of while

               if(ND(Volume_-MinVolume)==0.0)
                  cell_numb=1;
               else if(ND(Volume_-MaxVolume)==0.0)
                  cell_numb=20;
               else if(ND(MaxVolume-MinVolume)==0.0)
                  cell_numb=1;
               else
                 {
                  cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
                 }
               if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
               if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
               Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
              } // end of while
           } // end of for
        }
     }
   WindowRedraw();
  }
//===================================//
bool HistoryCheck(int j=0)
  {
   if(j==0) Comment("Подождите, идет обновление данных таймфреймов...");
   int i=0;
   while(i<100)
     {
      iTime(_Symbol,0,0);
      iTime(_Symbol,VolumeTf,0);
      if(GetLastError()!=4066) break;
      Sleep(1000);
      i++;
     } // end of while

   if(i==100)
     {
      Comment("Обновление данных завершилось с ошибкой. Переход к следующей попытке.");
      return(false);
     }

   Comment("");
   return(true);
  }
//===================================//
double ND(double A)
  {
   return(NormalizeDouble(A,Digits));
  }
//===================================//
void Draw_Cell(datetime x1,datetime x2,double y1,double y2,color Color)
  {
   string label="Cell_volume"+"_"+DoubleToStr(y1,Digits)+"_"+TimeToStr(x1);
   ObjectDelete(label);
   ObjectCreate(label,OBJ_RECTANGLE,0,x1,y1,x2,y2,0,0);
   ObjectSet(label,OBJPROP_COLOR,Color);
  }
//===================================//
void Obj_Del()
  {
   string label;
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      label=ObjectName(i);
      if(StringSubstr(label,0,11)=="Cell_volume") { ObjectDelete(label); continue; }
     }
/* end of for */
  }
//===================================//
void RemoveObjects()
  {
   int t1=ObjectsTotal()-1;
   while(t1>=0)
     {
      if(StringFind(ObjectName(t1),TimeToStr(Time[0]),0)>-1) { ObjectDelete(ObjectName(t1)); }
      t1--;
     }
  }
//===================================//
color GetColor(int palette,int cell)
  {
   if(palette==1)
     {
      switch(cell)
        {
         case 1: return(C'10,219,0');
         case 2: return(C'22,210,1');
         case 3: return(C'35,222,2');
         case 4: return(C'48,224,3');
         case 5: return(C'61,226,4');
         case 6: return(C'73,228,5');
         case 7: return(C'86,230,6');
         case 8: return(C'99,232,7');
         case 9: return(C'112,234,8');
         case 10: return(C'125,236,9');
         case 11: return(C'137,237,10');
         case 12: return(C'150,239,11');
         case 13: return(C'163,241,12');
         case 14: return(C'176,243,13');
         case 15: return(C'189,245,14');
         case 16: return(C'201,247,15');
         case 17: return(C'214,249,16');
         case 18: return(C'227,251,17');
         case 19: return(C'240,253,18');
         case 20: return(C'253,255,20');
        }
/* end of switch */
     }
   else if(palette==2)
     {
      switch(cell)
        {
         case 1: return(C'219, 0, 19');
         case 2: return(C'220, 13, 19');
         case 3: return(C'222, 26, 19');
         case 4: return(C'224, 40, 19');
         case 5: return(C'226, 53, 19');
         case 6: return(C'227, 67, 19');
         case 7: return(C'229, 80, 19');
         case 8: return(C'231, 93, 19');
         case 9: return(C'233, 107, 19');
         case 10: return(C'235, 120, 19');
         case 11: return(C'236, 134, 19');
         case 12: return(C'238, 147, 19');
         case 13: return(C'240, 161, 19');
         case 14: return(C'242, 174, 19');
         case 15: return(C'244, 187, 19');
         case 16: return(C'245, 201, 19');
         case 17: return(C'247, 214, 19');
         case 18: return(C'249, 228, 19');
         case 19: return(C'251, 241, 19');
         case 20: return(C'253, 255, 20');
        }
/* end of switch */
     }
     return(C'0,0,0');
  }
//===================================//