//+------------------------------------------------------------------+
//|                             BetterVolume ChartBars part1 1.6.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 Yellow
#property indicator_color5 White
#property indicator_color6 White
#property indicator_width1 10
#property indicator_width2 10
#property indicator_width3 10
#property indicator_width4 10
#property indicator_width5 10
#property indicator_width6 10

//---- external parameters ------------------------------------------+
enum timeFrames
{
   tf_cu,         // Current time frame
   tf_m1,         // 1 minute
   tf_m2,         // 2 minutes
   tf_m3,         // 3 minutes
   tf_m4,         // 4 minutes
   tf_m5,         // 5 minutes
   tf_m6,         // 6 minutes
   tf_m10 =10,    // 10 minutes
   tf_m12 =12,    // 12 minutes
   tf_m15 =15,    // 15 minutes
   tf_m20 =20,    // 20 minutes
   tf_m30 =30,    // 30 minutes
   tf_h1  =60,    // 1 hour
   tf_h2  =120,   // 2 hours
   tf_h3  =180,   // 3 hours
   tf_h4  =240,   // 4 hours
   tf_h6  =360,   // 6 hours
   tf_h8  =480,   // 8 hours
   tf_h12 =720,   // 12 hours
   tf_d1  =1440,  // daily
   tf_w1  =10080, // weekly
   tf_mn  =43200  // monthly
};
extern timeFrames TimeFrame               = tf_cu;

extern int     NumberOfBars = 300;
extern string  Note = "0 means Display all bars";
extern int     MAPeriod = 100;
extern int     LookBack = 20;


double red[],blue[],yellow[],green[],white[],magenta[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexBuffer(0,red);
      SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexLabel(0,"Climax High ");
      
      SetIndexBuffer(1,blue);
      SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexLabel(1,"");
      
      SetIndexBuffer(2,yellow);
      SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexLabel(2,"Low ");
      
      SetIndexBuffer(3,green);
      SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexLabel(3,"");
      
      SetIndexBuffer(4,white);
      SetIndexStyle(4,DRAW_HISTOGRAM);
      SetIndexLabel(4,"Climax Low ");
      
      SetIndexBuffer(5,magenta);
      SetIndexStyle(5,DRAW_HISTOGRAM);
      SetIndexLabel(5,"");
           
      IndicatorShortName("Better Volume On Chart 1.4" );
      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  
   double VolLowest,Range,Value2,Value3,HiValue2,HiValue3,LoValue3,tempv2,tempv3,tempv;
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if ( NumberOfBars == 0 ) 
      NumberOfBars = Bars-counted_bars;
   limit=NumberOfBars; //Bars-counted_bars;
   
      
   for(int i=0; i<limit; i++)   
      {
      int bar_shift = iBarShift(NULL,TimeFrame,iTime(NULL,Period(),i),false);
      
         red[i] = 0; blue[i] = 0; yellow[i] = 0; green[i] = 0; white[i] = 0; magenta[i] = 0;
         Value2=0;Value3=0;HiValue2=0;HiValue3=0;LoValue3=99999999;tempv2=0;tempv3=0;tempv=0;
         
         
               
         Range = (iHigh(NULL,TimeFrame,bar_shift)-iLow(NULL,TimeFrame,bar_shift))/Point;
         Value2 = iVolume(NULL,TimeFrame,bar_shift)*Range;
         
         if (  Range != 0 )
            Value3 = iVolume(NULL,TimeFrame,bar_shift)/Range;
            
         for ( int n=i;n<i+LookBack;n++)
            {
            int bar_shift1 = iBarShift(NULL,TimeFrame,iTime(NULL,Period(),n),false);
               tempv2 = iVolume(NULL,TimeFrame,bar_shift1)*((iHigh(NULL,TimeFrame,bar_shift1)-iLow(NULL,TimeFrame,bar_shift1))/Point); 
               if ( tempv2 > HiValue2 )
                  HiValue2 = tempv2;
                  
               
               if ( iVolume(NULL,TimeFrame,bar_shift1)*((iHigh(NULL,TimeFrame,bar_shift1)-iLow(NULL,TimeFrame,bar_shift1))/Point) != 0 )
                  {
                     tempv3 = iVolume(NULL,TimeFrame,bar_shift1) / ((iHigh(NULL,TimeFrame,bar_shift1)-iLow(NULL,TimeFrame,bar_shift1))/Point);
                     if ( tempv3 > HiValue3 ) 
                        HiValue3 = tempv3;
                     if ( tempv3 <  LoValue3 )
                        LoValue3 = tempv3;
                  }         
            }
          
           
          if ( Value2 == HiValue2 && iClose(NULL,TimeFrame,bar_shift) > (iHigh(NULL,TimeFrame,bar_shift) + iLow(NULL,TimeFrame,bar_shift)) / 2 )
            {
               red[i] = MathMax(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
               blue[i]= MathMin(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
               //yellow[i]=0;
            }   
            
          if ( Value3 == HiValue3 )
            {
               //green[i] = High[i];                
               //blue[i] =Low[i];
               //yellow[i]=0;
               //red[i]=0;
            }

         VolLowest = iVolume(NULL,TimeFrame,(iLowest(NULL,TimeFrame,MODE_VOLUME,20,bar_shift)));
         if (iVolume(NULL,TimeFrame,bar_shift) == VolLowest && Value3 != HiValue3)
            {
               yellow[i] = MathMax(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
               green[i]  = MathMin(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
            }   
          if ( Value2 == HiValue2 && Value3 == HiValue3 )
            {
               //magenta[i] = High[i];
               //blue[i]=Low[i];
               //red[i]=0;
               //green[i]=0;
               //yellow[i]=0;
            } 
          if ( Value2 == HiValue2 && iClose(NULL,TimeFrame,bar_shift) <= (iHigh(NULL,TimeFrame,bar_shift) + iLow(NULL,TimeFrame,bar_shift)) / 2 )
            {
               white[i]   = MathMax(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
               magenta[i] = MathMin(iOpen(NULL,TimeFrame,bar_shift),iClose(NULL,TimeFrame,bar_shift));
               //blue[i]=0;
               //red[i]=0;
               //green[i]=0;
               //yellow[i]=0;
            }     
            
         
      }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
         