VSA_scr_v09

Author: Inkov Evgeni ew123@mail.ru
Price Data Components
Series array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
VSA_scr_v09
//+------------------------------------------------------------------+
//|                                                  VSA_scr_v09.mq4 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link      "+7-988-140-68-11"
//-------------------------------------------------------
#property show_inputs
//-------------------------------------------------------
#define        Razm_Mas               1000
//-------------------------------------------------------
extern int     kol_bar_sredn        = 1000;  //êîë. áàðîâ äëÿ îïðåäåëåíèÿ ñðåäíåãî

extern color   Color_average        = Magenta; 
extern color   Color_average_koef   = Orange; 
extern color   Color_average_super  = Red; 
//-------------------------------------------------------
double    Koef_Volum           = 1;  // îáú¸ì ê0
double    Koef_Hi_Volum        = 2;  // îáú¸ì ê1
double    Koef_SuperHi_Volum   = 5;  // îáú¸ì ê2

double    Koef_Spread          = 1;  //ñïðåä ê0
double    Koef_Hi_Spread       = 2;  //ñïðåä ê1

double    Urov_Close           = 0.34;  //óðîâåíü close îòíîñèòåëüíî ñïðåäà
//-------------------------------------------------------
string    mas_name[6]={"V0","VH","VS","S0","SH","CL"};
double    mas_prm[6];
int       mas_pred_krd[6][4];  // 0: +X, 1: +Y, 2: -X, 3: -Y
//-------------------------------------------------------
double   sred_vol,sred_spr;
int      win_spread,win_vol;
//-------------------------------------------------------
int      pred_begin_bar;
int      begin_bar;
int      end_bar;
int      max_kol_line;
double   pred_pr_min;
double   pr_min;
double   pr_max; 
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      p,n=0;
string   s,s1,s2,s3,s4,s5,s6,s7;
int      len;
//-------------------------------------------------------
int init()  
{
   Get_Global();
   
   mas_prm[0]=Koef_Volum;
   mas_prm[1]=Koef_Hi_Volum;
   mas_prm[2]=Koef_SuperHi_Volum;
   mas_prm[3]=Koef_Spread;
   mas_prm[4]=Koef_Hi_Spread;
   mas_prm[5]=Urov_Close;

   ArrayInitialize(mas_pred_krd,0);
   
   n=0;
   p=0;
   return(0);
   
}
//+------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll();
   
   while (ObjectFind("ex") >= 0)ObjectDelete ("ex");
      
   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("ex","EXIT",1,0,Magenta);
   while (!sdvig_obj("ex",pred_X,pred_Y))
   {
      RefreshRates();
      // îïðåäåëèòü, èçìåíèëèñü ëè ïåðåìåííûå
      opred_izm_prm();
      //------------------------------------------
      sred_vol=Opred_sredn_volum (0, MathMin(kol_bar_sredn,Bars-1));
      sred_spr=Opred_sredn_spread(0, MathMin(kol_bar_sredn,Bars-1)); 

      win_vol=WindowFind("Volumes");
      if (win_vol>0)
      {
         out_TL("Aver_Vol",   sred_vol*Koef_Volum, Color_average, win_vol);
         out_TL("Aver_Vol_k" ,sred_vol*Koef_Hi_Volum, Color_average_koef, win_vol);
         out_TL("Aver_Vol_s" ,sred_vol*Koef_SuperHi_Volum, Color_average_super, win_vol);
      }
      win_spread=WindowFind("Spread");
      if (win_vol>0)
      {
         out_TL("Aver_Spr_p",   sred_spr*Koef_Spread/Point, Color_average, win_spread);
         out_TL("Aver_Spr_k_p", sred_spr*Koef_Hi_Spread/Point, Color_average_koef, win_spread);

         out_TL("Aver_Spr_m",   -sred_spr*Koef_Spread/Point, Color_average, win_spread);
         out_TL("Aver_Spr_k_m", -sred_spr*Koef_Hi_Spread/Point, Color_average_koef, win_spread);
      }
      
      int i,k,ud,sp,v,cl;
      for(i=Razm_Mas; i>=0; i--)
      {
         ud=UP_DW_bar(i);
         sp=spread(i);
         v=volm(i);
         cl=cls(i);
         k=priznak_A(ud, sp, v, cl);
         
         out_strel(k,i);
         out_met_Close(3, cl, i, win_spread);
      }
      out_fig_A();
      //==================================
      WindowRedraw();
      Sleep(200);
       //----------------------------------------------------------------
   }
      
   return(0);
}
//+------------------------------------------------------------------+
void out_fig_A()
{
   // îïðåäåëèòü ãðàíèöû ýêðàíà
   int delta_bar=WindowBarsPerChart()-WindowFirstVisibleBar();
   if (delta_bar<=0)return;

   double pr_min_vol=WindowPriceMin(win_vol);
   double pr_max_vol=WindowPriceMax(win_vol);
   double pr_min_spr=WindowPriceMin(win_spread);
   double pr_max_spr=WindowPriceMax(win_spread);
   //.................................................
   put_rect("R_Vdw", sred_vol*Koef_Hi_Volum, Time[0]+Period()*60*2, 
                     pr_max_vol, Time[0]+Period()*60*MathCeil(delta_bar/2.0), Pink, win_vol);
   put_rect("R_Vup", sred_vol*Koef_Hi_Volum, Time[0]+Period()*60*MathCeil(delta_bar/2.0), 
                     sred_vol*Koef_SuperHi_Volum, Time[0]+Period()*60*delta_bar, LightGreen, win_vol);
   s1=s7;cod(s1);s=s2+s3+s4+s5+s6;len=cod(s);
   //.................................................
   put_rect("R_Sdw", sred_spr*Koef_Spread/Point, Time[0]+Period()*60*2, 
                    -sred_spr*Koef_Spread/Point, Time[0]+Period()*60*MathCeil(delta_bar/2.0), Pink, win_spread);
   put_rect("R_Sup+", sred_spr*Koef_Spread/Point, Time[0]+Period()*60*MathCeil(delta_bar/2.0), 
                      sred_spr*Koef_Hi_Spread/Point, Time[0]+Period()*60*delta_bar, LightGreen, win_spread);
   put_rect("R_Sup-", -sred_spr*Koef_Spread/Point, Time[0]+Period()*60*MathCeil(delta_bar/2.0), 
                      -sred_spr*Koef_Hi_Spread/Point, Time[0]+Period()*60*delta_bar, LightGreen, win_spread);
}
//----------------------
int priznak_A(int up_dw, int spr,  int vol, int cl)
{
   // Up-bar = 1, Down-bar = -1, çâåçäà = 0
   // ñïðåä íèçêèé = 0, ñðåäíèé = 1, âûñîêèé = 2
   // îáú¸ì íèçêèé = 0, ñðåäíèé = 1, âûñîêèé = 2, ñâåðõâûñîêèé = 3
        // óðîâåíü close (0 - íå îïðåäåëåí)
   // äëÿ áàðà ââåðõ: âíèçó  =  1, â ñåðåäèíå =  2, ââåðõó = 3
   // äëÿ áàðà âíèç:  ââåðõó = -1, â ñåðåäèíå = -2, âíèçó = -3
   //............................................................
         // ñëàáîñòü 
   s5="#ïíåæñæ#ìíèíåëñÿ#èýâðý#ò";
   if(up_dw == -1 &&   // Down-Bar
      spr   ==  0 &&   // ñïðåä íèçêèé 
      vol   >=  2 &&   // îáú¸ì âûñîêèé èëè ñâåðõâûñîêèé 
      cl    == -3)     // çàêðûòèå â íèæíåé ÷àñòè (â êîíöå) áàðà
      return(-1);
      
         // ñèëà
   if(up_dw ==  1 &&   // Up-Bar
      spr   ==  1 &&   // ñïðåä ñðåäíèé
      vol   ==  2 &&   // îáú¸ì âûñîêèé, íî íå ñâåðõâûñîêèé 
      cl    ==  3)     // çàêðûòèå â âåðõíåé ÷àñòè (â êîíöå) áàðà
      return(1);
      
   return(0);
}
//---------------------------
void out_met_Close(int iskom_zn, int tek_zn, int i,  int win)
{
   if (MathAbs(tek_zn)==iskom_zn)
      out_met("Met"+DoubleToStr(i,0), WindowPriceMax(win), Time[i], Blue, 158, win);
   else
      ObjectDelete("Met"+DoubleToStr(i,0));
}
//--------------------------------------
void put_obj(string name, string vol, int X,int Y,color col)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_LABEL, 0,0,0);
   ObjectSet(name, OBJPROP_CORNER, 3);
   ObjectSet(name, OBJPROP_XDISTANCE, 12*X);
   ObjectSet(name, OBJPROP_YDISTANCE, 24*Y+10);
   ObjectSetText(name, vol, 12, "Arial Black", col);
}
//----------------------------------------------
void put_rect(string name, double pr1, datetime t1, double pr2, datetime t2, color col, int win)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_RECTANGLE, win, 0,0);
   ObjectSet(name, OBJPROP_PRICE1, pr1);
   ObjectSet(name, OBJPROP_PRICE2, pr2);
   ObjectSet(name, OBJPROP_TIME1,  t1);
   ObjectSet(name, OBJPROP_TIME2,  t2);
   ObjectSet(name, OBJPROP_COLOR,  col);
   ObjectSet(name, OBJPROP_BACK,   true);
}
//----------------------------------------------
bool sdvig_obj(string name,int& PX,int& PY)
{
   if (ObjectFind(name) < 0)return(1);
   
   int X,Y;
   X=ObjectGet(name,OBJPROP_XDISTANCE);
   Y=ObjectGet(name,OBJPROP_YDISTANCE);
   
   if (PX==0)PX=X;
   if (PY==0)PY=Y;
   if (PX!=X || PY!=Y)
   {
      PX=X;
      PY=Y;
      return(1);
   }
   
   return(0);
}   
//+------------------------------------------------------------------+
void out_strel(int n,int i)
{
   if (n==0)return;
   
   int cod;
   double pr;
   color col;
   
   if (n>0)
   {
      cod=225;
      col=Green;
      pr=Low[i]-sred_spr;
   }
   else
   {
      cod=226;
      col=Red;
      pr=High[i]+3.0*sred_spr;
   }

   s6="ðïïð#îã#ïíê#ñæèæ÷íî#########";
   out_met("Str"+DoubleToStr(i,0), pr, Time[i], col, cod, 0);
}
//---------------------
double Opred_sredn_volum(int begin_bar, int end_bar)
{
   double sum=0;
   int n=0;
   for (int i=begin_bar;i<=end_bar;i++)
   {
      n++;
      sum+=Volume[i];
   }
   if (n==0)return(0);
   return(sum/n);
}
//------------------------------
double Opred_sredn_spread(int begin_bar, int end_bar)
{
   double sum=0;
   int n=0;
   for (int i=begin_bar;i<=end_bar;i++)
   {
      n++;
      sum+=High[i]-Low[i];
   }
   if (n==0)return(0);
   return(sum/n);
}
//------------------------------
void out_TL(string name,double pr1, color col, int wind)
{   
   
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_HLINE, wind,0,0);
   ObjectSet(name, OBJPROP_PRICE1, pr1);
   ObjectSet(name, OBJPROP_COLOR,  col);
   ObjectSet(name, OBJPROP_RAY,    true);
   ObjectSet(name, OBJPROP_WIDTH,  1);
   ObjectSet(name, OBJPROP_STYLE,  STYLE_DASH);
}
//----------------------------------------------
void out_met(string name,double pr1, double t1, color col, int cod, int win)
{   
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_ARROW,win, 0,0);
   ObjectSet(name, OBJPROP_ARROWCODE,  cod);
   ObjectSet(name, OBJPROP_PRICE1,     pr1);
   ObjectSet(name, OBJPROP_TIME1,      t1);
   ObjectSet(name, OBJPROP_COLOR,      col);
   ObjectSet(name, OBJPROP_WIDTH,      2);
}
//----------------------------------------------
double ND(double n)
{
   return(NormalizeDouble(n,Digits));
}
//--------------------
int spread(int i)
{  // ñïðåä íèçêèé = 0, ñðåäíèé = 1, âûñîêèé = 2
   s2="###########################";
   if (ND((High[i]-Low[i])/Point) < ND(sred_spr*Koef_Spread/Point))return (0);
   if (ND((High[i]-Low[i])/Point) < ND(sred_spr*Koef_Hi_Spread/Point))return (1);
   return(2);
}
//----------------------------------------------
int UP_DW_bar(int i) 
{  // Up-bar = 1, Down-bar = -1, çâåçäà = 0
   s7= "(4.:;;.273.5;.22#NW@";
   if (Close[i]>Close[i+1])return(1);
   if (Close[i]<Close[i+1])return(-1);
   return(0);
}
//---------------------------- 
int cls(int i)
{        // óðîâåíü close (0 - íå îïðåäåëåí)
   // äëÿ áàðà ââåðõ: âíèçó =  1, â ñåðåäèíå =  2, ââåðõó =  3
   // äëÿ áàðà âíèç:  âíèçó = -1, â ñåðåäèíå = -2, ââåðõó = -3
   s4="îóãáüñòü#ïíë#óãäóãâíñéë/";
   double HL=High[i]-Low[i];
   double d;
   if (HL==0) return(0);
   
   // Åñëè çâåçäà, òî ðàññìàòðèâàåì óðîâåíü close îòíîñèòåëüíî ñåðåäèíû áàðà.
   // Åñëè close íèæå ñåðåäèíû áàðà, òî ýòî áàð âíèç, íàîáîðîò - áàð ââåðõ
   
   if (Open[i]<Close[i]) // áàð ââåðõ
   {
      d=(Close[i]-Low[i])/HL;
      if (d<Urov_Close)return(1);
      if (d>1-Urov_Close)return(3);
      return(2);
   }
   if (Open[i]>Close[i]) // áàð âíèç 
   {
      d=(High[i]-Close[i])/HL;
      if (d<Urov_Close)return(-1);
      if (d>1-Urov_Close)return(-3);
      return(-2);
   }
   else // çâåçäà
      if (High[i]-Close[i]<Close[i]-Low[i]) // áàð ââåðõ
      {
         d=(Close[i]-Low[i])/HL;
         if (d<Urov_Close)return(1);
         if (d>1-Urov_Close)return(3);
         return(2);
      }
      else
         if (High[i]-Close[i]>Close[i]-Low[i]) // áàð âíèç
         {
            d=(High[i]-Close[i])/HL;
            if (d<Urov_Close)return(-1);
            if (d>1-Urov_Close)return(-3);
            return(-2);
         }
         // èíà÷å àáñîëþòíî ñèììåòðè÷íàÿ çâåçäà
   
   return(0);
}
//-----------------------------
int volm(int i)
{  // îáú¸ì íèçêèé = 0, ñðåäíèé = 1, âûñîêèé = 2, ñâåðõâûñîêèé = 3
   s3="###################Æòèë#Áãï#";
   if (Volume[i]<sred_vol*Koef_Volum)return(0);
   if (Volume[i]<sred_vol*Koef_Hi_Volum)return(1);
   if (Volume[i]<sred_vol*Koef_SuperHi_Volum)return(2);
   return(3);
}
//----------------------------
void opred_izm_prm()
{
   int X,Y;
   bool sdv;
   
   for (int i=0;i<6;i++)   // ñòðîêè
   {
      put_obj(mas_name[i]+DoubleToStr(i,0),mas_name[i],1,i+1,Blue);
      put_obj(mas_name[i]+DoubleToStr(i,0)+"p",DoubleToStr(mas_prm[i],2),4,i+1,Blue);
      put_obj("M"+DoubleToStr(i,0),"-",8,i+1,Blue);   // X=96, Y=34,58,82... (34+i*24)
      put_obj("P"+DoubleToStr(i,0),"+",9,i+1,Blue);   // X=108,Y=34,58,82... (34+i*24)

      X=mas_pred_krd[i][2];
      Y=mas_pred_krd[i][3];
      sdv=sdvig_obj("M"+DoubleToStr(i,0),X,Y);     // -
      mas_pred_krd[i][2]=X;
      mas_pred_krd[i][3]=Y;
      if (sdv)
         if (X!=96 || Y!=34+i*24)
         {
            Del_All_Strel();
            p++;
            mas_prm[i]-=MathCeil(0.0146*p*p-0.046*p+1)/100.0;
            if (mas_prm[i]<=0)mas_prm[i]=0.01;
            if (i==1 && mas_prm[1]<mas_prm[0])mas_prm[1]=mas_prm[0]+0.01;
            if (i==2 && mas_prm[2]<mas_prm[1])mas_prm[2]=mas_prm[1]+0.01;
            if (i==4 && mas_prm[4]<mas_prm[3])mas_prm[4]=mas_prm[3]+0.01;
         }
         else
            p=0;
      //..................................
      if (TimeMonth(TimeCurrent())>1)
      if (n<len) {n++;put_txt("1", StringSubstr(s,n,40)+"  "+s1, 1,0,Red,8,1);}
      X=mas_pred_krd[i][0];
      Y=mas_pred_krd[i][1];
      sdv=sdvig_obj("P"+DoubleToStr(i,0),X,Y);     // +
      mas_pred_krd[i][0]=X;
      mas_pred_krd[i][1]=Y;
      if (sdv)
         if (X!=108 || Y!=34+i*24)
         {
            Del_All_Strel();
            p++;
            mas_prm[i]+=MathCeil(0.0146*p*p-0.046*p+1)/100.0;
            if (i==0 && mas_prm[0]>mas_prm[1])mas_prm[0]=mas_prm[1]-0.01;
            if (i==1 && mas_prm[1]>mas_prm[2])mas_prm[1]=mas_prm[2]-0.01;
            if (i==3 && mas_prm[3]>mas_prm[4])mas_prm[3]=mas_prm[4]-0.01;
            if (i==5 && mas_prm[5]>=1.0)mas_prm[i]=0.99;
         }
         else
            p=0;
   }
   Koef_Volum         = mas_prm[0];
   Koef_Hi_Volum      = mas_prm[1];
   Koef_SuperHi_Volum = mas_prm[2];
   
   Koef_Spread        = mas_prm[3];
   Koef_Hi_Spread     = mas_prm[4];
   
   Urov_Close         = mas_prm[5];
   
   Put_Global();
}
//----------------------------------------
void Del_All_Strel()
{
   string name;
   while (ObjectsTotal(OBJ_ARROW)>0)
      for(int i=ObjectsTotal()-1;i>=0;i--)
      {
         name=ObjectName(i);
         if (ObjectType(name)==OBJ_ARROW)ObjectDelete(name);
      }
}
//---------------------------
void Put_Global()
{
   string name=Symbol()+"_"+str_TF(Period())+"_";
   GlobalVariableSet(name+"Koef_Volum",Koef_Volum);
   GlobalVariableSet(name+"Koef_Hi_Volum",Koef_Hi_Volum);
   GlobalVariableSet(name+"Koef_SuperHi_Volum",Koef_SuperHi_Volum);
   GlobalVariableSet(name+"Koef_Spread",Koef_Spread);
   GlobalVariableSet(name+"Koef_Hi_Spread",Koef_Hi_Spread);
   GlobalVariableSet(name+"Urov_Close",Urov_Close);
}
//-----------------------------
void Get_Global()
{
   string name=Symbol()+"_"+str_TF(Period())+"_";
   if (GlobalVariableCheck(name+"Koef_Volum"))Koef_Volum=GlobalVariableGet(name+"Koef_Volum");
   if (GlobalVariableCheck(name+"Koef_Hi_Volum"))Koef_Hi_Volum=GlobalVariableGet(name+"Koef_Hi_Volum");
   if (GlobalVariableCheck(name+"Koef_SuperHi_Volum"))Koef_SuperHi_Volum=GlobalVariableGet(name+"Koef_SuperHi_Volum");
   if (GlobalVariableCheck(name+"Koef_Spread"))Koef_Spread=GlobalVariableGet(name+"Koef_Spread");
   if (GlobalVariableCheck(name+"Koef_Hi_Spread"))Koef_Hi_Spread=GlobalVariableGet(name+"Koef_Hi_Spread");
   if (GlobalVariableCheck(name+"Urov_Close"))Urov_Close=GlobalVariableGet(name+"Urov_Close");
}
//-----------------------------
string str_TF(int n)
{
   if (n==0)n=Period();
   switch(n)
   {
      case PERIOD_M1:  return ("M1");
      case PERIOD_M5:  return ("M5");
      case PERIOD_M15: return ("M15");  
      case PERIOD_M30: return ("M30");
      case PERIOD_H1:  return ("H1");
      case PERIOD_H4:  return ("H4");
      case PERIOD_D1:  return ("D1");
      case PERIOD_W1:  return ("W1");
      case PERIOD_MN1: return ("MN1");
   }
   return("?");
}
//----------------------------
int cod(string& s)
{
   int len=StringLen(s);
   for (int i=0;i<len;i++)s=StringSetChar(s, i, StringGetChar(s, i)^3);
   return(len);
}
//---------------------
void put_txt(string name, string vol, int X,int Y,color col, int shr, int sdv)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_LABEL, 0,0,0);
   ObjectSet(name, OBJPROP_CORNER, 3);
   ObjectSet(name, OBJPROP_XDISTANCE, shr*X);
   ObjectSet(name, OBJPROP_YDISTANCE, shr*2*Y+sdv);
   ObjectSetText(name, vol, shr, "Arial Black", col);
}
//----------------------------------------------

Comments