//+------------------------------------------------------------------+
//| MBKAsctrend3times.mq4 
//+------------------------------------------------------------------+
#property copyright "MBKAsctrend3times matt kennel"
#property link      "http://www.metatrader.org"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1  Blue
#property indicator_color2  Red

//
//
//
//
//

extern int    RISK            = 3;
extern int    WprLength1      = 9;
extern int    WprLength2      = 33; 
extern int    WprLength3      = 77;
extern int    LToffset        = -5; 
extern double w1              = 1.0; 
extern double w2              = 3.0; 
extern double w3              = 1.0; // relative weights

extern string note            = "turn on Alert = true; turn off = false";
extern bool   alertsOn        = true;
extern bool   alertsOnCurrent = false;
extern bool   alertsMessage   = true;
extern bool   alertsSound     = true;
extern bool   alertsEmail     = false;
extern bool   alertsNotify    = false;
extern string soundfile       = "alert2.wav";

extern string note7           = "Arrow Type";
extern string note8           = "0=default,1=Thick,2=Thin,3=Hollow";
extern string note9           = "4=Round,5=Fractal,6=Diagonal Thin";
extern string note10          = "7=Diagonal Thick,8=Diagonal Hollow";
extern string note11          = "9=Thumb,10=Finger";
extern int    ArrowType       = 1;
extern int    arrowthickness  = 2;

//
//
//
//
//

double CrossUp[];
double CrossDn[];
double trend[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(3);   
   if (ArrowType == 0) {
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0,DRAW_ARROW,0,arrowthickness); SetIndexArrow(0,119);
   SetIndexBuffer(1, CrossDn );  SetIndexStyle(1,DRAW_ARROW,0,arrowthickness); SetIndexArrow(1,119);
   }
   if (ArrowType == 1) {
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 233);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 234);
   }
   else if (ArrowType == 2) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 225);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 226);
   }
   else if (ArrowType == 3) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 241);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 242);
   }
   else if (ArrowType == 4) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 221);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 222);
   }
   else if (ArrowType == 5) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 217);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 218);
   }
   else if (ArrowType == 6) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 228);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 230);
   }
   else if (ArrowType == 7) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 236);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 238);
   }
   else if (ArrowType == 8) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 246);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 248);
   }
   else if (ArrowType == 9) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 67);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 68);
   }
   else if (ArrowType == 10) { 
   SetIndexBuffer(0, CrossUp);  SetIndexStyle(0, DRAW_ARROW,0,arrowthickness); SetIndexArrow(0, 71);
   SetIndexBuffer(1, CrossDn);  SetIndexStyle(1, DRAW_ARROW,0,arrowthickness); SetIndexArrow(1, 72);
   }
   SetIndexBuffer(2, trend);
return(0);
}

int deinit() {  return(0); }

//
//
//
//
//

int start() {
   int counted_bars=IndicatorCounted();
   int i,limit;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = MathMin(Bars-counted_bars,Bars-1);
         
   //
   //
   //
   //
   //
            
   for(i=limit; i>=0; i--)
   { 
      double wprval1 = (100-MathAbs(iWPR(NULL,0,WprLength1,i)));
      double wprval2 = (100-MathAbs(iWPR(NULL,0,WprLength2,i)));
      double wprval3 = (100-MathAbs(iWPR(NULL,0,WprLength3,i)));
      double sumweights = w1+w2+w3;
                    w1 /= sumweights;
                    w2 /= sumweights;
                    w3 /= sumweights; 
      double  wprvalue  =  w1*wprval1 + w2*wprval2 + w3*wprval3;
              trend[i]  = trend[i+1]; 
              if ((wprvalue < 33-RISK) && (wprval3 < 50-LToffset))  trend[i] = -1;
	           if ((wprvalue > 67+RISK) && (wprval3 >= 50+LToffset)) trend[i] = 1;
	
	           //
	           //
	           //
	           //
	           //
	      
	           CrossUp[i] = EMPTY_VALUE;
              CrossDn[i] = EMPTY_VALUE;
              if (trend[i] !=trend[i+1])
              if (trend[i] == 1)
                    CrossUp[i] = Low[i] - iATR(NULL,0,20,i)/2.0;
              else  CrossDn[i] = High[i]+ iATR(NULL,0,20,i)/2.0;
         }

         //
         //
         //
         //
         //
         
         if (alertsOn)
         {
           if (alertsOnCurrent)
                int whichBar = 0;
           else     whichBar = 1;
           if (trend[whichBar] != trend[whichBar+1])
           if (trend[whichBar] == 1)
                 doAlert("Buy");
           else  doAlert("Sell");       
   }
return(0);
}
//+------------------------------------------------------------------+


void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          //
          //
          //

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," MBKAsctrend3times ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol()," MBKAsctrend3times "),message);
             if (alertsNotify)  SendNotification(message);
             if (alertsSound)   PlaySound(soundfile);
      }
}

		