//+------------------------------------------------------------------+
//| H_Volum_v01.mq4 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link "+7-918-600-11-33"
//-------------------------------------------------------
#define Razm_Mas 1000
//-------------------------------------------------------
int point_bars;
//-------------------------------------------------------
int mas_vol[Razm_Mas];
int pred_begin_bar,begin_bar, end_bar, max_kol_line,nom_line;
double pred_pr_min,pr_min, pr_max, pr1,pr2;
int ed_ampl,max_vol, vol2;
string name;
int pred_X;
int pred_Y;
int pred_plus_X;
int pred_plus_Y;
int pred_minus_X;
int pred_minus_Y;
int pred_HL_X;
int pred_HL_Y;
bool High_Low;
int diskret;
//+------------------------------------------------------------------+
int init()
{
diskret=1;
if (Digits==3 || Digits==5)diskret=10;
if (Digits==6)diskret=100;
point_bars=diskret;
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
while (ObjectFind("10") >= 0)ObjectDelete ("10");
Del_All_Rect(Razm_Mas);
ObjectDelete ("Plus");
ObjectDelete ("Minus");
ObjectDelete ("width");
ObjectDelete ("HL");
Comment("");
return(0);
}
//-------------------------
int start()
{
pred_X=0;
pred_Y=0;
pred_plus_X=0;
pred_plus_Y=0;
pred_minus_X=0;
pred_minus_Y=0;
pred_begin_bar=0;
pred_pr_min=0;
High_Low=true;
put_obj("10","EXIT",1,0,Magenta);
while (!sdvig_obj("10",pred_X,pred_Y))
{
// îïðåäåëèòü ðåæèì ïðèâÿçêè îáú¸ìîâ
if (sdvig_obj("HL",pred_HL_X,pred_HL_Y))
{
if (ObjectGet("HL",OBJPROP_XDISTANCE)==12 && ObjectGet("HL",OBJPROP_YDISTANCE)==58)High_Low=!High_Low;
pred_HL_X=0;
pred_HL_Y=0;
}
if (High_Low)
put_obj("HL","H - L",1,2,Blue);
else
put_obj("HL","Close",1,2,Blue);
put_obj("width",point_bars,6,1,Blue);
//------------------------------------------
// åñëè ñäâèíóòû + èëè -, èçìåíèòü øèðèíó ïðÿìîóãîëüíèêà
if (sdvig_obj("Plus",pred_plus_X,pred_plus_Y))
if (ObjectGet("Plus",OBJPROP_XDISTANCE)!=72 || ObjectGet("Plus",OBJPROP_YDISTANCE)!=58)
{
point_bars=point_bars+diskret;
pred_plus_X=0;
pred_plus_Y=0;
Del_All_Rect(Razm_Mas);
}
if (sdvig_obj("Minus",pred_minus_X,pred_minus_Y))
if (ObjectGet("Minus",OBJPROP_XDISTANCE)!=72 || ObjectGet("Minus",OBJPROP_YDISTANCE)!=10)
{
if (point_bars>diskret) point_bars=point_bars-diskret;
if (point_bars<diskret) point_bars=diskret;
pred_minus_X=0;
pred_minus_Y=0;
Del_All_Rect(Razm_Mas);
}
put_obj("Plus","+",6,2,Green);
put_obj("Minus","-",6,0,Red);
//------------------------------------------
// îïðåäåëèòü ãðàíèöû ýêðàíà
begin_bar=WindowFirstVisibleBar();
end_bar=begin_bar-WindowBarsPerChart();
if (end_bar<0)end_bar=0;
pr_min=WindowPriceMin();
pr_max=WindowPriceMax();
max_kol_line=NormalizeDouble((pr_max-pr_min)/Point/point_bars,0);
//----------------------------------------------------------------
// çàïîëíèòü ìàññèâ îáú¸ìàìè
ArrayResize(mas_vol,max_kol_line+1);
ArrayInitialize(mas_vol,-1);
RefreshRates();
for (int i=begin_bar;i>=end_bar;i--)
if (High_Low)
{
if (!get_High_Low(i))continue;
}
else
{
if (!get_Close(i))continue;
}
//----------------------------------------------------------------
// íàéòè ìàêñèìàëüíûé îáú¸ì è îïðåäåëèòü ìàñøòàá ãðàôèêà
max_vol=0;
for (i=0;i<=max_kol_line;i++)
if (mas_vol[i]>max_vol)max_vol=mas_vol[i];
if (max_vol==0)return(0);
ed_ampl=NormalizeDouble(max_vol/WindowBarsPerChart()*3.0,0);
if (ed_ampl==0) return(0);
//----------------------------------------------------------------
// íà÷åðòèòü ïðÿìîóãîëüíèêè
Del_All_Rect(MathMin(2*max_kol_line,Razm_Mas));
for (i=0;i<=max_kol_line;i++)
{
name="rect"+i;
if (mas_vol[i]<0)
{
Del_Rect(name);
continue;
}
pr1=pr_min+i*point_bars*Point;
pr2=pr_min+(i+1)*point_bars*Point;
vol2=begin_bar-NormalizeDouble(mas_vol[i]/ed_ampl,0);
out_Rect(name,pr1,begin_bar,pr2,vol2);
}
WindowRedraw();
Sleep(100);
//----------------------------------------------------------------
}
return(0);
}
//+------------------------------------------------------------------+
bool get_High_Low (int i)
{
nom_line=NormalizeDouble((High[i]-pr_min)/Point/point_bars,0);
if (nom_line>=Razm_Mas)return(0);
if (mas_vol[nom_line]<0)
mas_vol[nom_line]=NormalizeDouble(Volume[i]/2.0,0);
else
mas_vol[nom_line]+=NormalizeDouble(Volume[i]/2.0,0);
nom_line=NormalizeDouble((Low[i]-pr_min)/Point/point_bars,0);
if (nom_line>=Razm_Mas)return(0);
if (mas_vol[nom_line]<0)
mas_vol[nom_line]=NormalizeDouble(Volume[i]/2.0,0);
else
mas_vol[nom_line]+=NormalizeDouble(Volume[i]/2.0,0);
return(1);
}
//------------------------------
bool get_Close (int i)
{
nom_line=NormalizeDouble((Close[i]-pr_min)/Point/point_bars,0);
if (nom_line>=Razm_Mas)return(0);
if (mas_vol[nom_line]<0)
mas_vol[nom_line]=NormalizeDouble(Volume[i],0);
else
mas_vol[nom_line]+=NormalizeDouble(Volume[i],0);
return(1);
}
//-------------------------
void put_obj(string name1, string vol, int X,int Y,color col)
{
if (ObjectFind(name1)<0)ObjectCreate(name1, OBJ_LABEL, 0,0,0);
ObjectSet(name1, OBJPROP_CORNER, 3);
ObjectSet(name1, OBJPROP_XDISTANCE, 12*X);
ObjectSet(name1, OBJPROP_YDISTANCE, 24*Y+10);
ObjectSetText(name1, vol, 12, "Arial Black", col);
}
//----------------------------------------------
void Del_Rect(string name1)
{
if (ObjectFind(name1)>=0)ObjectDelete(name1);
if (ObjectFind(name1+"_")>=0)ObjectDelete(name1+"_");
}
//---------------------------
void Del_All_Rect(int kol)
{
string name1;
for (int i=1;i<=kol;i++)
{
name1="rect"+i;
if (ObjectFind(name1)>=0)ObjectDelete(name1);
if (ObjectFind(name1+"_")>=0)ObjectDelete(name1+"_");
}
}
//---------------------------
void out_Rect(string name1,double pr11, int bar1, double pr21, int bar2)
{
if (ObjectFind(name1)<0)ObjectCreate(name1, OBJ_RECTANGLE, 0,0,0,0);
ObjectSet(name1, OBJPROP_PRICE1, pr11);
ObjectSet(name1, OBJPROP_PRICE2, pr21);
ObjectSet(name1, OBJPROP_TIME1, Time[bar1]);
ObjectSet(name1, OBJPROP_TIME2, Time[bar2]);
ObjectSet(name1, OBJPROP_COLOR, LightPink);
ObjectSet(name1, OBJPROP_BACK, true);
if (ObjectFind(name1+"_")<0)ObjectCreate(name1+"_", OBJ_TREND, 0,0,0,0);
ObjectSet(name1+"_", OBJPROP_PRICE1, pr21);
ObjectSet(name1+"_", OBJPROP_PRICE2, pr21);
ObjectSet(name1+"_", OBJPROP_TIME1, Time[bar1]);
ObjectSet(name1+"_", OBJPROP_TIME2, Time[bar2]);
ObjectSet(name1+"_", OBJPROP_COLOR, Black);
ObjectSet(name1+"_", OBJPROP_RAY, false);
}
//--------------------
bool sdvig_obj(string name1,int& PX,int& PY)
{
if (ObjectFind(name1) < 0)return(1);
int X,Y;
X=ObjectGet(name1,OBJPROP_XDISTANCE);
Y=ObjectGet(name1,OBJPROP_YDISTANCE);
if (PX==0)PX=X;
if (PY==0)PY=Y;
if (PX!=X || PY!=Y)return(1);
return(0);
}
//+------------------------------------------------------------------+
Comments