//+------------------------------------------------------------------+
//|                                                MarketProfile.mq4 |
//|                             Copyright © 2006, Viatcheslav Suvorov| 
//+------------------------------------------------------------------+
#property copyright "V.Suvorov©editing by olegf0x"

#property indicator_chart_window


extern datetime StartDate = D'';
extern bool ShowHistogram =true;
extern bool lastdayStart = true;
extern int CountProfile = 5;
extern color Asia=Olive;
extern color Europe=C'64,64,255';
extern color America=Maroon;
extern color Moda=White;
extern bool ShowModa=FALSE;
extern int maxLineStyle = 0;

int fontsize=10;
int i,j;
double LastHigh,LastLow,CurPos;
bool signal; 
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
int total = ObjectsTotal();
   int count = 0;
   string prefixline = "MarketProfile\n";
   for (int i = total - 1; i >= 0; i--)
   {
       string prefix1 = ObjectName(i);
      if (StringFind(prefix1,prefixline) == 0)
      {ObjectDelete(prefix1);count++;}			
	}
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;


//---- name for DataWindow and indicator subwindow label
   short_name="MarketProfile";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);

   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()

  {  
  deinit();
double onetick;  
double Mediana=0;
int MaxSize=0;
int MySize=0;
int MySizeEuropa=0;
int MySizeAzia=0;
int MySizeAmerica=0;
int BACK=0;
if (lastdayStart) StartDate=Time[0];

int x=Period();
if (x>60) return(-1);
if (x<15) return(-1);


  BACK=0;
  while (TimeDayOfYear(Time[BACK])>TimeDayOfYear(StartDate) || TimeYear(Time[BACK])!=TimeYear(StartDate) && (BACK<Bars)) {  
    BACK++;   
    if (BACK>=Bars) return(0);
  }//while


onetick = 1/(MathPow(10,Digits));
i=BACK;
////
int cycles;

for (cycles=CountProfile;cycles>0;cycles--) {

signal=false;
LastHigh=High[i];
LastLow=Low[i];
while (!signal)
{ 
//if (i+1==Bars) signal=true;
if (High[i+1]>LastHigh) LastHigh=High[i+1];
if (Low[i+1]<LastLow) LastLow=Low[i+1];
MaxSize=0;
MySize=0;

if (TimeDay(Time[i])!=TimeDay(Time[i+1]))
  { double maxAzia = 0;
     double maxEuropa = 0;
     double maxAmerica =0;
      double CurEuropa,CurAzia,CurAmerica;
   signal=true;
   CurPos=LastLow;
   while (CurPos<=LastHigh)
   {
     MySizeAzia=0;
     MySizeEuropa=0;
     MySizeAmerica=0;
     
     for (j=i;j>=BACK;j--)
     {
       if ((High[j]>=CurPos) && (Low[j]<=CurPos)) 
       {
         MySize++;       
         if (TimeHour(Time[j])>=14)  MySizeAmerica++; else 
         if ((TimeHour(Time[j])>=9) && (TimeHour(Time[j])<14)) MySizeEuropa++; else 
           MySizeAzia++;
         
       }//if  
     }//for
     if (MySizeAzia+MySizeEuropa+MySizeAmerica>MaxSize)
     {
       MaxSize=MySizeAzia+MySizeEuropa+MySizeAmerica;
       Mediana=CurPos;
     }
     if (i-MySizeAzia>=0)
     if(ShowHistogram==TRUE)
        {if(ObjectFind("MarketProfile\n"+"Azia\n"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeAzia!=0) 
         {
           ObjectCreate("MarketProfile\n"+"Azia\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i], CurPos,Time[i-MySizeAzia],CurPos+onetick);           
           ObjectSet("MarketProfile\n"+"Azia\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, Asia);
         }
         }  if(maxAzia<MySizeAzia) {maxAzia = MySizeAzia;CurAzia = CurPos;
           
     }//if      
     if(ShowHistogram==TRUE)    
        { if(ObjectFind("MarketProfile\n"+"Europa\n"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeEuropa!=0) {
           ObjectCreate("MarketProfile\n"+"Europa\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i-MySizeAzia], CurPos,Time[i-MySizeAzia-MySizeEuropa],CurPos+onetick);
           ObjectSet("MarketProfile\n"+"Europa\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, Europe);
        } 
        } if(maxEuropa<MySizeEuropa) {maxEuropa = MySizeEuropa;CurEuropa = CurPos;      
     }//if      
     if(ShowHistogram==TRUE)
        { if(ObjectFind("MarketProfile\n"+"America\n"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeAmerica!=0) {
           ObjectCreate("MarketProfile\n"+"America\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i-MySizeAzia-MySizeEuropa], CurPos,Time[i-MySizeAzia-MySizeEuropa-MySizeAmerica],CurPos+onetick);
           ObjectSet("MarketProfile\n"+"America\n"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, America);
        }
        } if(maxAmerica< MySizeAmerica) {maxAmerica = MySizeAmerica;CurAmerica=CurPos;                       
     }//if      
           
    
                     
       
     CurPos=CurPos+onetick;
   }//while
     if(ShowModa==TRUE)
     {
      ObjectCreate("MarketProfile\nmediana\n"+TimeToStr(Time[i],TIME_DATE), OBJ_RECTANGLE, 0, Time[i], Mediana,Time[i]+PERIOD_D1*60,Mediana+onetick);
      ObjectSet("MarketProfile\nmediana\n"+TimeToStr(Time[i],TIME_DATE), OBJPROP_STYLE, STYLE_SOLID);
      ObjectSet("MarketProfile\nmediana\n"+TimeToStr(Time[i],TIME_DATE), OBJPROP_COLOR,Moda);
     }
        drawLine("MarketProfile\nmaxAzia\n"+TimeToStr(Time[i],TIME_DATE), Time[i], CurAzia,Time[i]+PERIOD_D1*60, Asia, maxLineStyle);
         drawLine("MarketProfile\nmaxEuropa\n"+TimeToStr(Time[i],TIME_DATE), Time[i],CurEuropa, Time[i]+PERIOD_D1*60, Europe, maxLineStyle);
         drawLine("MarketProfile\nmaxAmerica\n"+TimeToStr(Time[i],TIME_DATE), Time[i], CurAmerica,Time[i]+PERIOD_D1*60, America, maxLineStyle);
   BACK=i+1;   
   }//if
   i++;   
   if (i>=Bars) return(0);
}//while
}//for
//----
   return(0);
  }
  
void drawLine(string name, datetime time1, double price1, datetime time2, color Öâåò, int Ñòèëü)
{  ObjectCreate(name, OBJ_TREND, 0, time1, price1, time2, price1);int width=2;
	ObjectSet(name, OBJPROP_COLOR, Öâåò);
	ObjectSet(name, OBJPROP_BACK, true);
	if(Ñòèëü<0 && Ñòèëü >5){Ñòèëü = 0;}
	if(Ñòèëü !=0){width=1;}
	ObjectSet(name, OBJPROP_STYLE, Ñòèëü);
   ObjectSet(name, OBJPROP_RAY, false);
   ObjectSet(name, OBJPROP_WIDTH,width );
}
//+------------------------------------------------------------------+