//+------------------------------------------------------------------+
//|                                     Strength Weakness Alerts.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Pink
#property indicator_color3 LimeGreen
#property indicator_color4 Red

extern bool showVSA = true;
extern bool showStochBB = true;
extern int NumberOfBars = 2000;
double Offset;
double Offset2;
extern int SignalSize = 0.5;
int ExtCountedBars=0;
double MA[];
double Spread[];
double Range;
double SprMovAvg = 4;
int c=0;
string spreadtype, spreadtype1, volumetype, volumetype1 ,updnbar, updnbar1, closebar, closebar1, VSAType, newVSA;

//extern int SpreadPeriod=30, VolumePeriod=30;

//extern double MAVol = 100;
int MAPeriod = 4;

double Strength[],Weakness[],S[],W[];


int Alertbars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
     
     
     IndicatorShortName("Strength Weakness Alerts");
     
      SetIndexBuffer(0,Strength);
      SetIndexStyle(0,DRAW_ARROW,0,SignalSize);
      SetIndexArrow(0, 120);
      SetIndexLabel(0,"Strength");
      SetIndexEmptyValue(0,0.0);

      SetIndexBuffer(1,Weakness);
      SetIndexStyle(1,DRAW_ARROW,0,SignalSize);
      SetIndexArrow(1, 120);
      SetIndexLabel(1,"Weakness");
      SetIndexEmptyValue(1,0.0);
      
      SetIndexBuffer(2,S);
      SetIndexStyle(2,DRAW_ARROW,0,SignalSize);
      SetIndexArrow(2,251);
      SetIndexLabel(2,"Demand");
      
      SetIndexBuffer(3,W);
      SetIndexStyle(3,DRAW_ARROW,0,SignalSize);
      SetIndexArrow(3, 251);
      SetIndexLabel(3,"Supply");

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
 int i; 

 if(Alertbars != Bars)
 { 
 //if(Strength[i+1] != 0.0)
 //Alert(Symbol() +" " + Period() +"  Strength != 0.0");

 if(Weakness[i+1] != 0.0)
 {
 Alert(Symbol() +" " + Period() +"  Weakness != 0.0");
 SendMail("Metatrader Alert", " Weakness Alert");
 Alertbars = Bars;
 }
 }

 if(Alertbars != Bars)
 { 
 if(Strength[i+1] != 0.0)
 {
 Alert(Symbol() +" " + Period() +"  Strength != 0.0");
 SendMail("Metatrader Alert", " Strength Alert");
 Alertbars = Bars;
 }
 }   
//----
   switch(Period()){
   case PERIOD_M1: Offset=3;Offset2=1;break;
   case PERIOD_M5: Offset=4;Offset2=2;break;
   case PERIOD_M15: Offset=8;Offset2=4;break;
   case PERIOD_M30: Offset=12;Offset2=6;break;
   case PERIOD_H1: Offset=16;Offset2=8;break;
   case PERIOD_H4: Offset=26;Offset2=12;break;
   case PERIOD_D1: Offset=80;Offset2=40;break;
   case PERIOD_W1: Offset=120;Offset2=50;break;
   case PERIOD_MN1: Offset=180;Offset2=70;break;
   }
      Offset = Offset*Point;
      Offset2 = Offset2*Point;
      
   for(i=0;i<=NumberOfBars;i++)
   {
   //--------
      if(Close[i+1]>Close[i+2])
      {
       updnbar="UP BAR";
      }
      if(Close[i+1]<Close[i+2])
      {
       updnbar="DOWN BAR";
      }
   //--------  
       if(Close[i+1]<=(((High[i+1]-Low[i+1])*0.30)+Low[i+1]))
       {
        closebar="DOWN CLOSE";
       }
       else if(Close[i+1]>=(High[i+1]-((High[i+1]-Low[i+1])*0.30)))
       {
        closebar="UP CLOSE";
       }
       else
       {
        closebar="MID CLOSE";
       }
       
   //-------------Copy------------------------------------------+
   
   if(Close[i+2]>Close[i+3])
      {
       updnbar1="UP BAR";
      }
      if(Close[i+2]<Close[i+3])
      {
       updnbar1="DOWN BAR";
      }
   //--------  
       if(Close[i+2]<=(((High[i+2]-Low[i+2])*0.30)+Low[i+2]))
       {
        closebar1="DOWN CLOSE";
       }
       else if(Close[i+2]>=(High[i+2]-((High[i+2]-Low[i+2])*0.30)))
       {
        closebar1="UP CLOSE";
       }
       else
       {
        closebar1="MID CLOSE";
       }
       
   //--------Calculation------------------------------------------+
   
      double main = iStochastic(NULL,0,14,3,3,MODE_SMA,0,MODE_MAIN,i+1);
      double signal = iStochastic(NULL,0,14,3,3,MODE_SMA,0,MODE_SIGNAL,i+1);
      double upper = iBands(NULL,0,20,2,2,PRICE_HIGH,MODE_UPPER,i+1);
      double lower = iBands(NULL,0,20,2,2,PRICE_LOW,MODE_LOWER,i+1);
      double point1 = iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,i+1);
      double point2 = iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,i+3);
      double point3 = iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,i+6);
      double main2 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,i+1);
      double signal2 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,i+1);
      
      int bar=Bars;
      
      //if(newbar==1)
      
      if(showVSA==true){
      //-------------Stoch BollingerBand condtion-------------------------
      if((Low[i+2]<= Open[i+1] && Open[i+2]<=Close[i+1] 
      && main > signal && (main <=30) && (Open[i+1]<=lower))
       
      //--------Strength Weakness condition--------------------------------
      || (updnbar1=="DOWN BAR" && closebar1=="DOWN CLOSE" 
      || closebar1=="MID CLOSE" && (updnbar=="UP BAR" && closebar=="UP CLOSE")     
      && Low[i+1]< Open[i] && Open[i+1]<Close[i] && (main2 <=30)))
      {
       Strength[i+1] = Low[i+1] - Offset;
 

       //newbar = 1;
      }
      
      else
      //-------------Stoch Bollinger Bands condition----------------------------
      if((High[i+2]>=Open[i+1] && Open[i+2]>=Close[i+1]  
      && main < signal && (main >=70) && (Open[i+1]>=upper)) 
      
      //-------------Strength Weakness condition--------------------------------
      || (updnbar1=="UP BAR" && closebar1=="UP CLOSE" 
      || closebar1=="MID CLOSE" && (updnbar=="DOWN BAR" && closebar=="DOWN CLOSE")    
      && High[i+1]>Open[i] && Open[i+1]>Close[i] && (main2 >=70)))
      {
       Weakness[i+1] = High[i+1] + Offset;
       //newbar = 1;
      }
      }
      
      //--------Oversold/Overbought peircing Bollinger Band---------------------------------
      if(showStochBB==true){
      double ma = iMA(NULL,0,5,-1,MODE_EMA,PRICE_CLOSE,i+1);
      double ma2 = iMA(NULL,0,5,-1,MODE_EMA,PRICE_CLOSE,i+2);
      
   
      if((main <=20 && Low[i+1]<lower && Low[i+2]<Low[i+1] && ma>ma2)
      || (main <=20 && point1>point2 && point2>point3 && updnbar=="UP BAR" && (closebar=="MID CLOSE" || closebar=="UP CLOSE")))
      {
       S[i+1] = Low[i+1] - Offset2;
       //newbar = 1;
      }
      
      else
      
      if((main >=80  && High[i+1]>upper && High[i+2]>High[i+1] && ma<ma2)
      || (main >=80 && point1<point2 && point2<point3 && updnbar=="DOWN BAR" && (closebar=="MID CLOSE" || closebar=="DOWN CLOSE")))
      {
       W[i+1] = High[i+1] + Offset2;
       //newbar = 1;
      }
     } 
   }  
   
//----
 

   
    
//----
   return(0);
  }
//+------------------------------------------------------------------+


 
//--------
/*string sp(int s)
{
      int spread,avgspread,cnt,collectspread;
      for(int i=SpreadPeriod;i>=1;i--)
      {
       spread=(High[s+i]-Low[s+i])/Point;
       collectspread+=spread;
      }
      avgspread=collectspread/(SpreadPeriod-1); 
      double curspread=(High[s+1]-Low[s+1])/Point; //Alert(avgspread);
      //double HMtimespread=curspread/avgspread;
      
      double narrowspread= avgspread* 0.8;
      double widespread= avgspread* 1.8;
      double ultraspread= avgspread* 2.0;
   
      if(curspread>=widespread && curspread<ultraspread)
      {
       spreadtype="WIDE SPREAD";
      }
      else if(curspread>=ultraspread)
      {
       spreadtype="ULTRAWIDE SPREAD";
      }
      else if(curspread<=narrowspread)
      {
       spreadtype="NARROW SPREAD";
      }
      else spreadtype="AVERAGE SPREAD";
return(spreadtype);
}
//--------
string vt(int s)
{
      double vol,collectvol,avgvol;
      for(int i=VolumePeriod;i>=1;i--)
      {
       vol=Volume[s+i];
       collectvol+=vol;
      }
      avgvol=collectvol/(VolumePeriod-1);
      
      double lowvol= avgvol*0.7;
      double highvol= avgvol*1.5;
      double ultravol= avgvol*2.0;
   
      if(Volume[s+2]>=highvol && Volume[s+2]<ultravol)
      {
       volumetype="HIGH VOLUME"; 
      }
      else 
      if(Volume[s+2]>=ultravol)
      {
       volumetype="ULTRA HIGH VOLUME";
      }
      else
      if(Volume[s+2]<=lowvol)
      {
       volumetype="LOW VOLUME";
      }
      else volumetype="AVERAGE VOLUME"; 
      
return(volumetype); 
}*/

//------------Second Version
      
      /*if(updnbar1=="DOWN BAR" && closebar1=="DOWN CLOSE" || closebar1=="MID CLOSE" && (updnbar=="UP BAR" && closebar=="UP CLOSE")     
      && Low[c+3]>=Low[c+1] || High[c+3]<=High[c+1]
      && main > signal && (main >10 && main <80))
      {
       Strength[c+1] = Low[c+1] - Offset;
      }
      
      else
      if(updnbar1=="UP BAR" && closebar1=="UP CLOSE" || closebar1=="MID CLOSE" && (updnbar=="DOWN BAR" && closebar=="DOWN CLOSE")    
      && High[c+3]<=High[c+1] || Low[c+3]<=Low[c+1]
      && main < signal && (main <=90 && main >20))
      {
       Weakness[c+1] = High[c+1] + Offset;
      }*/