-
Notifications
You must be signed in to change notification settings - Fork 2
/
vq-bars.mq4
106 lines (106 loc) · 3.43 KB
/
vq-bars.mq4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//+------------------------------------------------------------------+ VQ.mq4 |
//| Volatility Quality |
//| by [email protected] |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2
//----
extern int Length=5;
extern int Method=3;
extern int Smoothing=1;
extern int Filter=5;
extern bool Steady =false;
//----
double VQ[];
double SumVQ[];
double DIR[];
double UpBuffer[];
double DnBuffer[];
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,UpBuffer);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,DnBuffer);
SetIndexBuffer(2,SumVQ);
SetIndexBuffer(3,VQ);
SetIndexBuffer(4,DIR);
//----
if (Length < 2) Length=2;
if (Method < 0) Method=0;
if (Method > 3) Method=3;
if (Smoothing < 0) Smoothing=0;
if (Filter < 0) Filter=0;
//----
string short_name="VQ | "+ Length + " , " +
Method + " , " + Smoothing + " , " + Filter + " | ";
IndicatorShortName(short_name);
SetIndexEmptyValue(0, 0.0);
SetIndexEmptyValue(1, 0.0);
SetIndexEmptyValue(2, 0.0);
SetIndexEmptyValue(3, 0.0);
return(0);
}
//+------------------------------------------------------------------+
int start()
{
double MH=0, ML=0, MO=0, MC=0, MC1=0;
int i, j, limit, counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
//----
if(counted_bars<1) i=Bars-Length-1;
else i=Bars-counted_bars;
if(counted_bars<1)
{
j=Bars-Length-1;
SumVQ[j + 1]=Close[j + 1];
}
while(i>=0)
{
MH=iMA(NULL,0,Length,0,Method,PRICE_HIGH,i);
ML=iMA(NULL,0,Length,0,Method,PRICE_LOW,i);
MO=iMA(NULL,0,Length,0,Method,PRICE_OPEN,i);
MC=iMA(NULL,0,Length,0,Method,PRICE_CLOSE,i);
MC1=iMA(NULL,0,Length,0,Method,PRICE_CLOSE,i+Smoothing);
if (Steady==true)
{
MC=iMA(NULL,0,Length,0,Method,PRICE_MEDIAN,i);
MC1=iMA(NULL,0,Length,0,Method,PRICE_MEDIAN,i+Smoothing);
}
if((MH - ML)>0) VQ[i]=MathAbs(((MC - MC1)/MathMax(MH - ML, MathMax(MH - MC1, MC1 - ML)) + (MC - MO)/(MH - ML)) * 0.5) * ((MC - MC1 + (MC - MO)) * 0.5);
SumVQ[i]=SumVQ[i + 1] + VQ[i];
if (Filter > 0) if (MathAbs(SumVQ[i] - SumVQ[i + 1]) < Filter * Point) SumVQ[i]=SumVQ[i + 1];
i--;
}
if(counted_bars<1) limit=Bars-Length-1;
else limit=Bars-counted_bars;
for(i=limit-1; i>=0; i--)
{
if (SumVQ[i] > SumVQ[i+1]) DIR[i]=1;
if (SumVQ[i] < SumVQ[i+1]) DIR[i]=-1;
if (SumVQ[i]== SumVQ[i+1]) DIR[i]=DIR[i + 1];
if (DIR[i] > 0)
{
UpBuffer[i]=High[i];
DnBuffer[i]=Low[i];
}
else
if (DIR[i] < 0)
{
DnBuffer[i]=High[i];
UpBuffer[i]=Low[i];
}
}
//----
return(0);
}
//+------------------------------------------------------------------+