//+------------------------------------------------------------------+ //| 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 extern datetime StartDate;// = D''; //removes the compiler warning extern bool lastdayStart = true; extern int CountProfile = 3; // 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 = STYLE_DOT; int fontsize=10; int i,j; double LastHigh,LastLow,CurPos; bool signal; datetime flag; string Obj_Prefix; //+------------------------------------------------------------------+ //| 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 //---- name for DataWindow and indicator subwindow label short_name="MarketProfile"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); if (!StartDate) StartDate = TimeCurrent(); 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 }//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 ObjectCreate(Obj_Prefix+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJ_HLINE, 0, Time[i], Mediana,Time[i+10],Mediana+onetick); ObjectSet(Obj_Prefix+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_STYLE, POC_LineStyle); ObjectSet(Obj_Prefix+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_COLOR,POC_Color); ObjectSet(Obj_Prefix+"mediana"+TimeToStr(Time[i],TIME_DATE), OBJPROP_WIDTH,1); BACK=i+1; }//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); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: