Merge branch 'master' of git://repo.or.cz/mqlkit
[mqlkit.git] / indicators / VQ.mq4
blob38a1dd3c5c5a84a91b36ba478bd77205d1316eb1
1 //+------------------------------------------------------------------+\r
2 //|                                                           VQ.mq4 |\r
3 //|                                               Volatility Quality |\r
4 //|                                                by raff1410@o2.pl |\r
5 //+------------------------------------------------------------------+\r
6 \r
7 #property  indicator_separate_window\r
8 #property  indicator_buffers 5\r
9 #property  indicator_color1  Yellow\r
10 #property  indicator_color2  Green\r
11 #property  indicator_color3  Red\r
12 #property  indicator_color4  Yellow\r
13 #property  indicator_color5  Cyan\r
14 #property  indicator_width1  2\r
15 #property  indicator_width2  2\r
16 #property  indicator_width3  2\r
18 extern   bool     Crash = false;\r
20 extern   int      TimeFrame = 0;\r
21 extern   int      Length = 5;\r
22 extern   int      Method = 3;\r
23 extern   int      Smoothing = 1;\r
24 extern   int      Filter = 5;\r
26 extern   bool     RealTime = true;\r
27 extern   bool     Steady  = false;\r
28 extern   bool     Color = true;\r
29 extern   bool     Alerts = true;\r
30 extern   bool     EmailON = false;\r
31 extern   bool     SignalPrice = true;\r
32 extern   color    SignalPriceBUY = Yellow;\r
33 extern   color    SignalPriceSELL = Aqua;\r
34 extern   int      CountBars = 1485;\r
37 double   VQ[];\r
38 double   SumVQ[];\r
39 double   SumVQ_MTF[];\r
40 double   DIR[];\r
41 double   UpBuffer[];\r
42 double   DnBuffer[];\r
43 double   UpArrow[];\r
44 double   DnArrow[];\r
46 bool     TurnedUp = false;\r
47 bool     TurnedDn = false;\r
48 datetime timeprev1=0;\r
49 datetime timeprev2=0;\r
50 int p=0;\r
51 //+------------------------------------------------------------------+\r
53 int init()\r
54 {\r
55 IndicatorBuffers(8);\r
56 SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);\r
57 SetIndexBuffer(0,SumVQ);\r
58 SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);\r
59 SetIndexBuffer(1,UpBuffer);\r
60 SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);\r
61 SetIndexBuffer(2,DnBuffer);\r
62 SetIndexStyle(3,DRAW_ARROW);\r
63 SetIndexArrow(3,233);\r
64 SetIndexBuffer(3,UpArrow);\r
65 SetIndexStyle(4,DRAW_ARROW);\r
66 SetIndexArrow(4,234);\r
67 SetIndexBuffer(4,DnArrow);\r
68 SetIndexBuffer(5,VQ);\r
69 SetIndexBuffer(6,DIR);\r
70 SetIndexBuffer(7,SumVQ_MTF);\r
72 if (Length < 2) Length = 2;\r
73 if (Method < 0) Method = 0;\r
74 if (Method > 3) Method = 3;\r
75 if (Smoothing < 0) Smoothing = 0;\r
76 if (Filter < 0) Filter = 0;\r
78 if ((TimeFrame < Period()) && (TimeFrame != 0)) TimeFrame = Period();\r
79 switch(TimeFrame)\r
80    {\r
81    case 1:     string TimeFrameStr = "M1"; break;\r
82    case 5:            TimeFrameStr = "M5"; break;\r
83    case 15:           TimeFrameStr = "M15"; break;\r
84    case 30:           TimeFrameStr = "M30"; break;\r
85    case 60:           TimeFrameStr = "H1"; break;\r
86    case 240:          TimeFrameStr = "H4"; break;\r
87    case 1440:         TimeFrameStr = "D1"; break;\r
88    case 10080:        TimeFrameStr = "W1"; break;\r
89    case 43200:        TimeFrameStr = "MN1"; break;\r
90    default:           TimeFrameStr = "";\r
91    }\r
93 string short_name = "VQ" + TimeFrameStr + " |  " + Length + " , " + Method + " , " + Smoothing + " , " + Filter + "  | ";\r
94 IndicatorShortName(short_name);\r
96 return(0);\r
97 }\r
99 //+------------------------------------------------------------------+\r
101 int start()\r
103 if (Bars < 100) {IndicatorShortName("Bars less than 100"); return(0);}\r
105 if(timeprev1<iTime(NULL,TimeFrame,0)) {TurnedDn = false; TurnedUp = false; timeprev1=iTime(NULL,TimeFrame,0);}\r
107 if (!RealTime)\r
109    if(timeprev2==iTime(NULL,TimeFrame,0)) return(0);\r
110    timeprev2=iTime(NULL,TimeFrame,0);\r
111    p=TimeFrame/Period()+1; if (p==0) p=1;\r
114 double TR = 0, MH = 0, ML = 0, MO = 0, MC = 0, MC1 = 0;\r
116 if (CountBars>iBars(NULL,TimeFrame) || CountBars>Bars-Length-1) CountBars=MathMin(Bars-Length-1,iBars(NULL,TimeFrame)-Length-1);\r
117 if (Crash && CountBars>0){CountBars=CountBars-10; IndicatorShortName("Crash: "+CountBars+"     ");}\r
118 if (Crash && CountBars<0) IndicatorShortName("Crash");\r
120 int i = CountBars;\r
121 SumVQ[i + 1] = Close[i + 1];\r
122 SumVQ_MTF[i + 1] = Close[i + 1];\r
123 while (i >= 0)\r
124    {\r
125    MH = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,i);\r
126    ML = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,i);\r
127    MO = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,i);\r
128    MC = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,i);\r
129    MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,i + Smoothing);\r
130    if (Steady==true) {MC=iMA(NULL,TimeFrame,Length,0,Method,PRICE_MEDIAN,i); MC1=iMA(NULL,TimeFrame,Length,0,Method,PRICE_MEDIAN,i+Smoothing);}\r
131    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);\r
132    SumVQ[i] = SumVQ[i + 1] + VQ[i];\r
133    if (Filter > 0) if (MathAbs(SumVQ[i] - SumVQ[i + 1]) < Filter * Point) SumVQ[i] = SumVQ[i + 1];\r
134    if (TimeFrame > Period()) SumVQ_MTF[i] = SumVQ[i];\r
135    i--;\r
136    }\r
138    if (TimeFrame>Period())\r
139    {\r
140      datetime TimeArray1[]; \r
141      ArrayCopySeries(TimeArray1,MODE_TIME,Symbol(),TimeFrame); \r
142      int limit=CountBars+TimeFrame/Period();\r
143      for(i=0, int y=0;i<limit;i++) {if (Time[i]<TimeArray1[y]) y++;  SumVQ[i]=SumVQ_MTF[y];}\r
144    }\r
147 for (i = CountBars; i >= 0; i--)\r
148    {\r
149    DIR[i] = DIR[i + 1];\r
150    if (SumVQ[i] - SumVQ[i + 1] > 0) DIR[i] = 1;\r
151    if (SumVQ[i + 1] - SumVQ[i] > 0) DIR[i] = -1;\r
152    if (Color == true)\r
153       {\r
154       if (DIR[i] > 0)\r
155          {\r
156          UpBuffer[i] = SumVQ[i];\r
157          if (DIR[i + 1] < 0) UpBuffer[i + 1] = SumVQ[i + 1];\r
158          DnBuffer[i] = EMPTY_VALUE;\r
159          }\r
160          else\r
161          {\r
162          if (DIR[i] < 0)\r
163             {\r
164             DnBuffer[i] = SumVQ[i];\r
165             if (DIR[i + 1] > 0) DnBuffer[i + 1] = SumVQ[i + 1];\r
166             UpBuffer[i] = EMPTY_VALUE;\r
167             }\r
168          }\r
169       }\r
170    if (Alerts == true)\r
171       {\r
172       UpArrow[i] = EMPTY_VALUE; DnArrow[i] = EMPTY_VALUE;\r
173       if ((DIR[i] == 1) && (DIR[i + 1] == -1)) UpArrow[i] = SumVQ[i + 1] - (Ask - Bid);\r
174       if ((DIR[i] == -1) && (DIR[i + 1] == 1)) DnArrow[i] = SumVQ[i + 1] + (Ask - Bid);\r
175       }\r
176    }\r
177    \r
178    \r
179 if (Alerts == true)\r
181    string AlertTXT;\r
182    if (UpArrow[0+p]!=EMPTY_VALUE && TurnedUp==false)\r
183       {\r
184         AlertTXT="VQ BUY:  "+Symbol()+" - "+Period()+"  at  "+ DoubleToStr(Close[0],Digits)+ "  -  "+ TimeToStr(CurTime(),TIME_SECONDS);\r
185         Alert(AlertTXT); if (EmailON) SendMail(AlertTXT,AlertTXT);\r
186         if (SignalPrice == true)\r
187         {\r
188           ObjectCreate("BUY SIGNAL: " + DoubleToStr(Time[0],0),OBJ_ARROW,0,Time[0],Close[0]);\r
189           ObjectSet("BUY SIGNAL: " + DoubleToStr(Time[0],0),OBJPROP_ARROWCODE,5);\r
190           ObjectSet("BUY SIGNAL: " + DoubleToStr(Time[0],0),OBJPROP_COLOR,SignalPriceBUY);\r
191         }\r
192         TurnedDn = false; TurnedUp = true;\r
193       }\r
194    if (DnArrow[0+p]!=EMPTY_VALUE && TurnedDn==false)\r
195       {\r
196         AlertTXT="VQ SELL:  "+Symbol()+" - "+Period()+"  at  "+ DoubleToStr(Close[0],Digits)+ "  -  "+ TimeToStr(CurTime(),TIME_SECONDS);\r
197         Alert(AlertTXT); if (EmailON) SendMail(AlertTXT,AlertTXT);\r
198         if (SignalPrice == true)\r
199         {\r
200           ObjectCreate("SELL SIGNAL: " + DoubleToStr(Time[0],0),OBJ_ARROW,0,Time[0],Close[0]);\r
201           ObjectSet("SELL SIGNAL: " + DoubleToStr(Time[0],0),OBJPROP_ARROWCODE,5);\r
202           ObjectSet("SELL SIGNAL: " + DoubleToStr(Time[0],0),OBJPROP_COLOR,SignalPriceSELL);\r
203         }\r
204         TurnedUp = false; TurnedDn = true;\r
205    }\r
207          \r
208          \r
209 return(0);\r