VQ2





//+------------------------------------------------------------------+
//|                                                                  |                                                 VQ.mq4 |
//|                                               Volatility Quality |
//|                                                by raff1410@o2.pl |
//+------------------------------------------------------------------+

#property  indicator_chart_window
#property  indicator_buffers 4
//#property  indicator_color1  Yellow
#property  indicator_color1  Green
#property  indicator_color2  Red
#property  indicator_color3  Yellow
#property  indicator_color4  Cyan
#property  indicator_width1  2
#property  indicator_width2  2
//#property  indicator_width3  2

extern   bool     Crash = false;

extern   int      TimeFrame = 0;
extern   int      Length = 5;
extern   int      Method = 3;
extern   int      Smoothing = 1;
extern   int      Filter = 5;

extern   bool     RealTime = true;
extern   bool     Steady  = false;
//extern   bool     Color = true;
extern   bool     Alerts = true;
extern   bool     EmailON = false;
extern   bool     SignalPrice = true;
extern   color    SignalPriceBUY = Yellow;
extern   color    SignalPriceSELL = Aqua;
extern   int      CountBars = 1485;


double   VQ[];
double   SumVQ[];
double   SumVQ_MTF[];
double   DIR[];
double   UpBuffer[];
double   DnBuffer[];
double   UpArrow[];
double   DnArrow[];

bool     TurnedUp = false;
bool     TurnedDn = false;
datetime timeprev1=0;
datetime timeprev2=0;
int p=0;
//+------------------------------------------------------------------+

int init()
{
IndicatorBuffers(8);
//SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
//SetIndexBuffer(0,SumVQ);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,UpBuffer);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,DnBuffer);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,233);
SetIndexBuffer(2,UpArrow);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3,234);
SetIndexBuffer(3,DnArrow);
SetIndexBuffer(4,SumVQ);
SetIndexBuffer(5,VQ);
SetIndexBuffer(6,DIR);
SetIndexBuffer(7,SumVQ_MTF);

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;

if ((TimeFrame < Period()) && (TimeFrame != 0)) TimeFrame = Period();
switch(TimeFrame)
   {
   case 1:     string TimeFrameStr = "M1"; break;
   case 5:            TimeFrameStr = "M5"; break;
   case 15:           TimeFrameStr = "M15"; break;
   case 30:           TimeFrameStr = "M30"; break;
   case 60:           TimeFrameStr = "H1"; break;
   case 240:          TimeFrameStr = "H4"; break;
   case 1440:         TimeFrameStr = "D1"; break;
   case 10080:        TimeFrameStr = "W1"; break;
   case 43200:        TimeFrameStr = "MN1"; break;
   default:           TimeFrameStr = "";
   }

string short_name = "VQ" + TimeFrameStr + " |  " + Length + " , " + 
Method + " , " + Smoothing + " , " + Filter + "  | ";
IndicatorShortName(short_name);

return(0);
}

//+------------------------------------------------------------------+

int start()
{
int counter;
double Range, AvgRange;
if (Bars < 100) {IndicatorShortName("Bars less than 100"); return(0);}

if(timeprev1<iTime(NULL,TimeFrame,0)) {TurnedDn = false; TurnedUp = 
false; timeprev1=iTime(NULL,TimeFrame,0);}

if (!RealTime)
{
   if(timeprev2==iTime(NULL,TimeFrame,0)) return(0);
   timeprev2=iTime(NULL,TimeFrame,0);
   p=TimeFrame/Period()+1; if (p==0) p=1;
}

double TR = 0, MH = 0, ML = 0, MO = 0, MC = 0, MC1 = 0;

if (CountBars>iBars(NULL,TimeFrame) || CountBars>Bars-Length-1) 
CountBars=MathMin(Bars-Length-1,iBars(NULL,TimeFrame)-Length-1);
if (Crash && CountBars>0){CountBars=CountBars-10; 
IndicatorShortName("Crash: "+CountBars+"     ");}
if (Crash && CountBars<0) IndicatorShortName("Crash");

int i = CountBars;
SumVQ[i + 1] = Close[i + 1];
SumVQ_MTF[i + 1] = Close[i + 1];
while (i >= 0)
   {
   MH = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,i);
   ML = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,i);
   MO = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,i);
   MC = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,i);
   MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,i + Smoothing);
   if (Steady==true) 
{MC=iMA(NULL,TimeFrame,Length,0,Method,PRICE_MEDIAN,i); 
MC1=iMA(NULL,TimeFrame,Length,0,Method,PRICE_MEDIAN,i+Smoothing);}
   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];
   if (TimeFrame > Period()) SumVQ_MTF[i] = SumVQ[i];
   i--;
   }

   if (TimeFrame>Period())
   {
     datetime TimeArray1[]; 
     ArrayCopySeries(TimeArray1,MODE_TIME,Symbol(),TimeFrame); 
     int limit=CountBars+TimeFrame/Period();
     for(i=0, int y=0;i<limit;i++) {if (Time[i]<TimeArray1[y]) y++;  
SumVQ[i]=SumVQ_MTF[y];}
   }


for (i = CountBars; i >= 0; i--)
  {
   Range=0;
   AvgRange=0;
   for (counter=i; counter<=i+9; counter++)
    {
     AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
    }
   Range=AvgRange/10;
   
   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 (Color == true)
     //{
      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];
           }
        }
     //}
   if (Alerts == true)
      {
      UpArrow[i] = EMPTY_VALUE; DnArrow[i] = EMPTY_VALUE;
      if ((DIR[i] == 1) && (DIR[i + 1] == -1)) UpArrow[i] = Low[i] - Range*0.5;
      if ((DIR[i] == -1) && (DIR[i + 1] == 1)) DnArrow[i] = High[i] + Range*0.5;
      }
   }
   
   
if (Alerts == true)
{
   string AlertTXT;
   if (UpArrow[0+p]!=EMPTY_VALUE && TurnedUp==false)
      {
        AlertTXT="VQ BUY:  "+Symbol()+" - "+Period()+"  at  "+ 
DoubleToStr(Close[0],Digits)+ "  -  "+ TimeToStr(CurTime(),TIME_SECONDS);
        Alert(AlertTXT); if (EmailON) SendMail(AlertTXT,AlertTXT);
        if (SignalPrice == true)
        {
          ObjectCreate("BUY SIGNAL: " + 
DoubleToStr(Time[0],0),OBJ_ARROW,0,Time[0],Close[0]);
          ObjectSet("BUY SIGNAL: " + 
DoubleToStr(Time[0],0),OBJPROP_ARROWCODE,5);
          ObjectSet("BUY SIGNAL: " + 
DoubleToStr(Time[0],0),OBJPROP_COLOR,SignalPriceBUY);
        }
        TurnedDn = false; TurnedUp = true;
      }
   if (DnArrow[0+p]!=EMPTY_VALUE && TurnedDn==false)
      {
        AlertTXT="VQ SELL:  "+Symbol()+" - "+Period()+"  at  "+ 
DoubleToStr(Close[0],Digits)+ "  -  "+ TimeToStr(CurTime(),TIME_SECONDS);
        Alert(AlertTXT); if (EmailON) SendMail(AlertTXT,AlertTXT);
        if (SignalPrice == true)
        {
          ObjectCreate("SELL SIGNAL: " + 
DoubleToStr(Time[0],0),OBJ_ARROW,0,Time[0],Close[0]);
          ObjectSet("SELL SIGNAL: " + 
DoubleToStr(Time[0],0),OBJPROP_ARROWCODE,5);
          ObjectSet("SELL SIGNAL: " + 
DoubleToStr(Time[0],0),OBJPROP_COLOR,SignalPriceSELL);
        }
        TurnedUp = false; TurnedDn = true;
   }
}
         
         
return(0);
}



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM

Implements a curve of type DRAW_ARROW

Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen
It sends emails