//+------------------------------------------------------------------+
//| 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