1 //+------------------------------------------------------------------+
\r
3 //| Volatility Quality |
\r
4 //| by raff1410@o2.pl |
\r
5 //+------------------------------------------------------------------+
\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
46 bool TurnedUp = false;
\r
47 bool TurnedDn = false;
\r
48 datetime timeprev1=0;
\r
49 datetime timeprev2=0;
\r
51 //+------------------------------------------------------------------+
\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
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
93 string short_name = "VQ" + TimeFrameStr + " | " + Length + " , " + Method + " , " + Smoothing + " , " + Filter + " | ";
\r
94 IndicatorShortName(short_name);
\r
99 //+------------------------------------------------------------------+
\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
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
121 SumVQ[i + 1] = Close[i + 1];
\r
122 SumVQ_MTF[i + 1] = Close[i + 1];
\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
138 if (TimeFrame>Period())
\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
147 for (i = CountBars; i >= 0; i--)
\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
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
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
170 if (Alerts == true)
\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
179 if (Alerts == true)
\r
182 if (UpArrow[0+p]!=EMPTY_VALUE && TurnedUp==false)
\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
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
192 TurnedDn = false; TurnedUp = true;
\r
194 if (DnArrow[0+p]!=EMPTY_VALUE && TurnedDn==false)
\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
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
204 TurnedUp = false; TurnedDn = true;
\r