Author: Viatcheslav Suvorov
00mp.pocLn
0 Views
0 Downloads
0 Favorites
00mp.pocLn
//+------------------------------------------------------------------+
//|                                                MarketProfile.mq4 |
//|                             Copyright © 2006, Viatcheslav Suvorov| 
//| Modified to better show "Points of Balance" by GodfreyH          |
//|                                                                  |
//| Cleaned up code, added DeleteObjects() to remove only the        |
//| objects created by this indicator and added settings for the     |
//| session/POC colors - mods by TwoBuckChuck                        |
//+------------------------------------------------------------------+
#property copyright "Viatcheslav Suvorov"

#property indicator_chart_window
#property indicator_buffers    1
#property indicator_color1     Yellow

extern datetime StartDate;// = D''; //removes the compiler warning
extern bool lastdayStart = true;
extern int CountProfile = 1;

// We all love custom settings
extern color Asia_Color    = Olive;
extern color Europe_Color  = Navy;
extern color US_Color      = Maroon;
extern color POC_Color     = Red;
extern int   POC_LineStyle = 0;//STYLE_DOT

int fontsize=10;
int i,j;
double LastHigh,LastLow,CurPos;
bool signal;
datetime flag;
string Obj_Prefix;
string Obj_Prefix1;
double buffer1[];
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
   DeleteObjects(); //only delete our objects
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   string short_name;
   
   Obj_Prefix = "mp__"; //object prefix
   Obj_Prefix = "mp-poc"; //object prefix
   
   //---- name for DataWindow and indicator subwindow label
   short_name="MarketProfile";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   
   if (!StartDate) StartDate = TimeCurrent();
   SetIndexBuffer(0,buffer1);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   if (flag!=Time[0]) // Calculate on new bar.
   { 
      flag=Time[0];
      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<5) 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]))
            {
               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])>=13)  MySizeAmerica++;
                        else if ((TimeHour(Time[j])>=8) && (TimeHour(Time[j])<13)) MySizeEuropa++; 
                        else MySizeAzia++;
         
                     }//if  //
                      
                     buffer1[i]=EMPTY_VALUE;
                     if  (TimeHour(Time[0])>2 && TimeHour(Time[0])<24)   buffer1[0]=Mediana;         

                     
                  }//for
                  
                  if (MySizeAzia+MySizeEuropa+MySizeAmerica>MaxSize)
                  {
                     MaxSize=MySizeAzia+MySizeEuropa+MySizeAmerica;
                     Mediana=CurPos;  
                  }
                  if (i-MySizeAzia>=0) // hmmmm this doesn't look right
                     if(ObjectFind(Obj_Prefix+"rec"+"Azia"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeAzia!=0)
                     {
                        ObjectCreate(Obj_Prefix+"rec"+"Azia"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i], CurPos,Time[i-MySizeAzia],CurPos+onetick);           
                        ObjectSet(Obj_Prefix+"rec"+"Azia"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, Asia_Color);
                     }//if      
                     
                  // FYI, we are not inside the if (i-MySizeAzia>=0) anymore. Not sure if we need to be...
                  if(ObjectFind(Obj_Prefix+"rec"+"Europa"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeEuropa!=0)
                  {
                     ObjectCreate(Obj_Prefix+"rec"+"Europa"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i-MySizeAzia], CurPos,Time[i-MySizeAzia-MySizeEuropa],CurPos+onetick);
                     ObjectSet(Obj_Prefix+"rec"+"Europa"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, Europe_Color);           
                  }//if  
                      
                  if(ObjectFind(Obj_Prefix+"rec"+"America"+TimeToStr(Time[i],TIME_DATE)+CurPos) == -1 && MySizeAmerica!=0)
                  {
                     ObjectCreate(Obj_Prefix+"rec"+"America"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJ_RECTANGLE, 0, Time[i-MySizeAzia-MySizeEuropa], CurPos,Time[i-MySizeAzia-MySizeEuropa-MySizeAmerica],CurPos+onetick);
                     ObjectSet(Obj_Prefix+"rec"+"America"+TimeToStr(Time[i],TIME_DATE)+CurPos, OBJPROP_COLOR, US_Color);                      
                  }//if      

                  CurPos=CurPos+onetick;
               }//while
               BACK=i+1; 
             //  ObjectCreate(Obj_Prefix+1+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJ_TREND, 0, Time[cycles+5], Mediana,Time[cycles],Mediana);//+onetick
             //  ObjectSet(Obj_Prefix1+1+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_STYLE, POC_LineStyle);
             //  ObjectSet(Obj_Prefix1+1+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_COLOR,POC_Color);   
             //  ObjectSet(Obj_Prefix1+1+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_WIDTH,1);   
             //  ObjectSet(Obj_Prefix1+1+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_RAY,0);   
           

  
            
           
           
            }//if
            
            i++;   
            if (i>=Bars) return(0);
            
         } //while
         
      } //for
      
   } //if
   
   return(0);
}

//+------------------------------------------------------------------+
//| Delete only our objects                                          |
//+------------------------------------------------------------------+
int DeleteObjects()
{     
   for (int i = ObjectsTotal() - 1; i >= 0; i--)
   {
       string label = ObjectName(i);
       if (StringSubstr(label, 0, StringLen(Obj_Prefix)) != Obj_Prefix)
           continue;
       ObjectDelete(label);   
   }
   return(0);
}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---