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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---