H_Volum_v01

Author: Inkov Evgeni ew123@mail.ru
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
H_Volum_v01
//+------------------------------------------------------------------+
//|                                                  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