//+------------------------------------------------------------------+
//|                                      StochTrendEntrySignals.mq4  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-35, banzai"
#property link      "http://www.forex-tsd.com/indicators-metatrader-4/"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime //  uptrend
#property indicator_width1 1
#property indicator_color2 Red //  downtrend
#property indicator_width2 1

extern string note3 = "Stochastic Entry #1";
extern string note4 = "---------------------------";
extern string note5 = "Chart Time Frame";
extern string note6 = "0 = Current Time Frame";
extern string note7 = "1=M1, 5=M5, 15=M15, 30=M30";
extern string note8 = "60=H1, 240=H4, 1440=D1";
extern string note9 = "10080=W1, 43200=MN1";
extern int       TimeFrame1   =  15;
extern int       KPeriod1     =  5;
extern int       DPeriod1     =  3;
extern int       Slowing1     =  3;
extern string note10 = "0=sma, 1=ema, 2=smma, 3=lwma";
extern int       MAMethod1    =   0;
extern string note11 = "0=high/low, 1=close/close";
extern int       PriceField1  =   0;
extern string note12 = "use WingDings font";
extern int UpTrendEntrySymbol1=225;
extern int DownTrendEntrySymbol1=226;
extern bool PercentKDcrossAlert1 = false;
extern bool PercentKDcrossEmailAlert1 = false;
extern string note40 = "---------------------------";
extern string note41 = "Stochastic Trend";
extern int       TimeFrame4   =  240;
extern int       KPeriod4     =  15;
extern int       DPeriod4     =  3;
extern int       Slowing4     =  3;
extern int       MAMethod4    =  0;
extern int       PriceField4  =  0;
extern bool PercentKDcrossAlert4 = false;
extern bool PercentKDcrossEmailAlert4 = false;
extern string note49 = "---------------------------";
extern string note52 = "the Y coordinate to display the arrows";
extern double YCoordinate=1.0;
extern int    MaximumBars=192;

double StochEntryUp1[], StochEntryDown1[], StartingUpTrend[], StartingDownTrend[];
double HTFUpTrend[], HTFDownTrend[], UpTrendLine[], DownTrendLine[];
string AlertPrefix;
string GetTimeFrameStr() {
   switch(Period())
   {
      case 1 : string TimeFrameStr="M1"; break;
      case 5 : TimeFrameStr="M5"; break;
      case 10 : TimeFrameStr="M10"; break;
      case 15 : TimeFrameStr="M15"; break;
      case 30 : TimeFrameStr="M30"; break;
      case 60 : TimeFrameStr="H1"; break;
      case 120 : TimeFrameStr="H2"; break;
      case 240 : TimeFrameStr="H4"; break;
      case 480 : TimeFrameStr="H8"; break;
      case 1440 : TimeFrameStr="D1"; break;
      case 10080 : TimeFrameStr="W1"; break;
      case 43200 : TimeFrameStr="MN1"; break;
      default : TimeFrameStr=Period();
   } 
   return (TimeFrameStr);
   }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {     
      SetIndexStyle(0,DRAW_ARROW);
      SetIndexArrow(0, UpTrendEntrySymbol1);
      SetIndexBuffer(0, StochEntryUp1);
      SetIndexStyle(1,DRAW_ARROW);
      SetIndexArrow(1, DownTrendEntrySymbol1);
      SetIndexBuffer(1, StochEntryDown1);
      
      AlertPrefix=Symbol()+" ("+GetTimeFrameStr()+"):  ";
  return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar()
{
   static datetime lastbar;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
}   
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double H4Trend1now, H4Trend2now, stochastic1now, stochastic2now, 
   H4Trend1previous, H4Trend2previous, stochastic1previous, stochastic2previous, 
   H4Trend1after, H4Trend2after, stochastic1after, stochastic2after;
   double Range, AvgRange;
   int counted_bars=IndicatorCounted(), y=0;
   datetime TimeArray[];
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame4); 
   
   for(i = 0; i <= MaximumBars; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+15;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      if (Time[i]<TimeArray[y]) y++; 
      
      stochastic1now = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,i);
      stochastic1previous = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,i+1);
      stochastic1after = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,i-1);
      stochastic2now = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,i);
      stochastic2previous = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,i+1);
      stochastic2after = iStochastic(NULL,TimeFrame1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,i-1);
           
      H4Trend1now = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,0,y);
      H4Trend2now = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,1,y);
      H4Trend1previous = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,0,y+1);
      H4Trend1after = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,0,y-1);
      H4Trend2previous = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,1,y+1);
      H4Trend2after = iStochastic(NULL,TimeFrame4,KPeriod4,DPeriod4,Slowing4,MAMethod4,PriceField4,1,y-1);
      Range=AvgRange/15;      

         if (H4Trend1now > H4Trend2now) {
                   if ((stochastic2now <= 50) && (stochastic1now > stochastic2now) && (stochastic1previous < stochastic2previous) && (stochastic1after > stochastic2after)) {
                      StochEntryUp1[i] = Low[i] - Range*YCoordinate;
                      if (PercentKDcrossAlert1 && NewBar()) 
                         Alert(AlertPrefix+"Stoch ("+KPeriod1+","+DPeriod1+","+Slowing1+") %K crosses UP %D\nBUY signal @ Ask = $",Ask,"; Bid = $",Bid,"\nDate & Time = ",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()));
                	    if (PercentKDcrossEmailAlert1 && NewBar()) 
                         SendMail(AlertPrefix,"Stoch ("+KPeriod1+","+DPeriod1+","+Slowing1+") %K crosses UP %D\nBUY signal @ Ask = $"+DoubleToStr(Ask,4)+", Bid = $"+DoubleToStr(Bid,4)+", Date & Time = "+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime()));
                   }
         }
         else if (H4Trend1now < H4Trend2now) {
                   if ((stochastic2now >= 50) && (stochastic1now < stochastic2now) && (stochastic1previous > stochastic2previous) && (stochastic1after < stochastic2after)) {
                      StochEntryDown1[i] = High[i] + Range*YCoordinate;
                      if (PercentKDcrossAlert1 && NewBar())
                         Alert(AlertPrefix+"Stoch ("+KPeriod1+","+DPeriod1+","+Slowing1+") %K crosses DOWN %D\nSELL signal @ Ask = $",Ask,"; Bid = $",Bid,"\nDate & Time = ",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()));
               	    if (PercentKDcrossEmailAlert1 && NewBar())  
                         SendMail(AlertPrefix,"Stoch ("+KPeriod1+","+DPeriod1+","+Slowing1+") %K crosses DOWN %D\nSELL signal @ Ask = $"+DoubleToStr(Ask,4)+", Bid = $"+DoubleToStr(Bid,4)+", Date & Time = "+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime()));
              	    }
         }
   }
   return(0);
}

