//+----------------------------------------------------------------------------+
//|                                                          i-Sadukey_v1.mq4  |
//+----------------------------------------------------------------------------+
#property copyright "www,forex-station.com"
#property link      "www,forex-station.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrLimeGreen
#property indicator_color2  clrRed
#property indicator_width1  3
#property indicator_width2  3
#property indicator_minimum 0
#property indicator_maximum 1

//
//
//
//
//

extern ENUM_TIMEFRAMES TimeFrame        = PERIOD_CURRENT;  // Time frame
extern ENUM_MA_METHOD  MaMethod         = MODE_EMA;
extern int             MaPeriod         = 1;
extern int             NormalizedDigits = 5;
extern bool            alertsOn         = true;
extern bool            alertsOnCurrent  = true;
extern bool            alertsMessage    = true;
extern bool            alertsSound      = true;
extern bool            alertsNotify     = false;
extern bool            alertsEmail      = false;

//
//
//
//
//

double Buffer1[]; 
double Buffer2[]; 
double trend[];
double ma[];
double mac[];
double mao[],count[];
string indicatorFileName;
#define _mtfCall(_buff,_y) iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,MaMethod,MaPeriod,NormalizedDigits,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,_buff,_y)

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int init() 
{ 
   IndicatorBuffers(7);
      SetIndexBuffer(0,Buffer1); SetIndexStyle(0,DRAW_HISTOGRAM); 
      SetIndexBuffer(1,Buffer2); SetIndexStyle(1,DRAW_HISTOGRAM); 
      SetIndexBuffer(2,trend);
      SetIndexBuffer(3,ma);
      SetIndexBuffer(4,mac);
      SetIndexBuffer(5,mao);
      SetIndexBuffer(6,count);
      
      indicatorFileName = WindowExpertName();
       TimeFrame         = MathMax(TimeFrame,_Period);  
         
   IndicatorShortName(timeFrameToString(TimeFrame)+" i_Sadukey ");
return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i,counted_bars = prev_calculated;
      if(counted_bars < 0) return(-1);
      if(counted_bars > 0) counted_bars--;
            int limit=MathMin(rates_total-counted_bars,rates_total-1); count[0] = limit;
            if (TimeFrame!=_Period)
            {
               limit = (int)MathMax(limit,MathMin(rates_total-1,_mtfCall(6,0)*TimeFrame/_Period));
               for (i=limit;i>=0; i--)
               {
                  int y = iBarShift(NULL,TimeFrame,time[i]);
                     Buffer1[i] = _mtfCall(0,y);
                     Buffer2[i] = _mtfCall(1,y);      
               }
                  
    return(rates_total);
     }               
   
     //
     //
     //
     //
     //
   
     for(i=limit; i>=0; i--)
     {
        ma[i]  = iMA(NULL,0,MaPeriod,0,MaMethod,PRICE_WEIGHTED,i);
        mac[i] = iMA(NULL,0,MaPeriod,0,MaMethod,PRICE_CLOSE,i);
        mao[i] = iMA(NULL,0,MaPeriod,0,MaMethod,PRICE_OPEN,i);
        double value1 =  
          0.11859648*(ma[i]   +mac[i])   *0.5 
         +0.11781324*(ma[i+1] +mac[i+1]) *0.5 
         +0.11548308*(ma[i+2] +mac[i+2]) *0.5 
         +0.11166411*(ma[i+3] +mac[i+3]) * 0.5
         +0.10645106*(ma[i+4] +mac[i+4]) * 0.5
         +0.09997253*(ma[i+5] +mac[i+5]) * 0.5
         +0.09238688*(ma[i+6] +mac[i+6]) * 0.5
         +0.08387751*(ma[i+7] +mac[i+7]) * 0.5
         +0.07464713*(ma[i+8] +mac[i+8]) * 0.5
         +0.06491178*(ma[i+9] +mac[i+9]) * 0.5
         +0.05489443*(ma[i+10]+mac[i+10])* 0.5
         +0.04481833*(ma[i+11]+mac[i+11])* 0.5
         +0.03490071*(ma[i+12]+mac[i+12])* 0.5
         +0.02534672*(ma[i+13]+mac[i+13])* 0.5
         +0.01634375*(ma[i+14]+mac[i+14])* 0.5
         +0.00805678*(ma[i+15]+mac[i+15])* 0.5
         +0.00062421*(ma[i+16]+mac[i+16])* 0.5
         -0.00584512*(ma[i+17]+mac[i+17])* 0.5
         -0.01127391*(ma[i+18]+mac[i+18])* 0.5
         -0.01561738*(ma[i+19]+mac[i+19])* 0.5
         -0.01886307*(ma[i+20]+mac[i+20])* 0.5
         -0.02102974*(ma[i+21]+mac[i+21])* 0.5
         -0.02216516*(ma[i+22]+mac[i+22])* 0.5
         -0.02234315*(ma[i+23]+mac[i+23])* 0.5
         -0.02165992*(ma[i+24]+mac[i+24])* 0.5
         -0.02022973*(ma[i+25]+mac[i+25])* 0.5
         -0.01818026*(ma[i+26]+mac[i+26])* 0.5
         -0.01564777*(ma[i+27]+mac[i+27])* 0.5
         -0.01277219*(ma[i+28]+mac[i+28])* 0.5
         -0.00969230*(ma[i+29]+mac[i+29])* 0.5
         -0.00654127*(ma[i+30]+mac[i+30])* 0.5
         -0.00344276*(ma[i+31]+mac[i+31])* 0.5
         -0.00050728*(ma[i+32]+mac[i+32])* 0.5
         +0.00217042*(ma[i+33]+mac[i+33])* 0.5
         +0.00451354*(ma[i+34]+mac[i+34])* 0.5
         +0.00646441*(ma[i+35]+mac[i+35])* 0.5
         +0.00798513*(ma[i+36]+mac[i+36])* 0.5
         +0.00905725*(ma[i+37]+mac[i+37])* 0.5
         +0.00968091*(ma[i+38]+mac[i+38])* 0.5
         +0.00987326*(ma[i+39]+mac[i+39])* 0.5
         +0.00966639*(ma[i+40]+mac[i+40])* 0.5
         +0.00910488*(ma[i+41]+mac[i+41])* 0.5
         +0.00824306*(ma[i+42]+mac[i+42])* 0.5
         +0.00714199*(ma[i+43]+mac[i+43])* 0.5
         +0.00586655*(ma[i+44]+mac[i+44])* 0.5
         +0.00448255*(ma[i+45]+mac[i+45])* 0.5
         +0.00305396*(ma[i+46]+mac[i+46])* 0.5
         +0.00164061*(ma[i+47]+mac[i+47])* 0.5
         +0.00029596*(ma[i+48]+mac[i+48])* 0.5
         -0.00093445*(ma[i+49]+mac[i+49])* 0.5
         -0.00201426*(ma[i+50]+mac[i+50])* 0.5
         -0.00291701*(ma[i+51]+mac[i+51])* 0.5
         -0.00362661*(ma[i+52]+mac[i+52])* 0.5
         -0.00413703*(ma[i+53]+mac[i+53])* 0.5
         -0.00445206*(ma[i+54]+mac[i+54])* 0.5
         -0.00458437*(ma[i+55]+mac[i+55])* 0.5
         -0.00455457*(ma[i+56]+mac[i+56])* 0.5
         -0.00439006*(ma[i+57]+mac[i+57])* 0.5
         -0.00412379*(ma[i+58]+mac[i+58])* 0.5
         -0.00379323*(ma[i+59]+mac[i+59])* 0.5
         -0.00343966*(ma[i+60]+mac[i+60])* 0.5
         -0.00310850*(ma[i+61]+mac[i+61])* 0.5
         -0.00285188*(ma[i+62]+mac[i+62])* 0.5
         -0.00273508*(ma[i+63]+mac[i+63])* 0.5
         -0.00274361*(ma[i+64]+mac[i+64])* 0.5
         +0.01018757*(ma[i+65]+mac[i+65])* 0.5;


        double value2= 
          0.11859648*(ma[i]   +mao[i])   *0.5 
         +0.11781324*(ma[i+1] +mao[i+1]) *0.5 
         +0.11548308*(ma[i+2] +mao[i+2]) *0.5 
         +0.11166411*(ma[i+3] +mao[i+3]) * 0.5
         +0.10645106*(ma[i+4] +mao[i+4]) * 0.5
         +0.09997253*(ma[i+5] +mao[i+5]) * 0.5
         +0.09238688*(ma[i+6] +mao[i+6]) * 0.5
         +0.08387751*(ma[i+7] +mao[i+7]) * 0.5
         +0.07464713*(ma[i+8] +mao[i+8]) * 0.5
         +0.06491178*(ma[i+9] +mao[i+9]) * 0.5
         +0.05489443*(ma[i+10]+mao[i+10])* 0.5
         +0.04481833*(ma[i+11]+mao[i+11])* 0.5
         +0.03490071*(ma[i+12]+mao[i+12])* 0.5
         +0.02534672*(ma[i+13]+mao[i+13])* 0.5
         +0.01634375*(ma[i+14]+mao[i+14])* 0.5
         +0.00805678*(ma[i+15]+mao[i+15])* 0.5
         +0.00062421*(ma[i+16]+mao[i+16])* 0.5
         -0.00584512*(ma[i+17]+mao[i+17])* 0.5
         -0.01127391*(ma[i+18]+mao[i+18])* 0.5
         -0.01561738*(ma[i+19]+mao[i+19])* 0.5
         -0.01886307*(ma[i+20]+mao[i+20])* 0.5
         -0.02102974*(ma[i+21]+mao[i+21])* 0.5
         -0.02216516*(ma[i+22]+mao[i+22])* 0.5
         -0.02234315*(ma[i+23]+mao[i+23])* 0.5
         -0.02165992*(ma[i+24]+mao[i+24])* 0.5
         -0.02022973*(ma[i+25]+mao[i+25])* 0.5
         -0.01818026*(ma[i+26]+mao[i+26])* 0.5
         -0.01564777*(ma[i+27]+mao[i+27])* 0.5
         -0.01277219*(ma[i+28]+mao[i+28])* 0.5
         -0.00969230*(ma[i+29]+mao[i+29])* 0.5
         -0.00654127*(ma[i+30]+mac[i+30])* 0.5
         -0.00344276*(ma[i+31]+mao[i+31])* 0.5
         -0.00050728*(ma[i+32]+mao[i+32])* 0.5
         +0.00217042*(ma[i+33]+mao[i+33])* 0.5
         +0.00451354*(ma[i+34]+mao[i+34])* 0.5
         +0.00646441*(ma[i+35]+mao[i+35])* 0.5
         +0.00798513*(ma[i+36]+mao[i+36])* 0.5
         +0.00905725*(ma[i+37]+mao[i+37])* 0.5
         +0.00968091*(ma[i+38]+mao[i+38])* 0.5
         +0.00987326*(ma[i+39]+mao[i+39])* 0.5
         +0.00966639*(ma[i+40]+mao[i+40])* 0.5
         +0.00910488*(ma[i+41]+mao[i+41])* 0.5
         +0.00824306*(ma[i+42]+mao[i+42])* 0.5
         +0.00714199*(ma[i+43]+mao[i+43])* 0.5
         +0.00586655*(ma[i+44]+mao[i+44])* 0.5
         +0.00448255*(ma[i+45]+mao[i+45])* 0.5
         +0.00305396*(ma[i+46]+mao[i+46])* 0.5
         +0.00164061*(ma[i+47]+mao[i+47])* 0.5
         +0.00029596*(ma[i+48]+mao[i+48])* 0.5
         -0.00093445*(ma[i+49]+mao[i+49])* 0.5
         -0.00201426*(ma[i+50]+mao[i+50])* 0.5
         -0.00291701*(ma[i+51]+mao[i+51])* 0.5
         -0.00362661*(ma[i+52]+mao[i+52])* 0.5
         -0.00413703*(ma[i+53]+mao[i+53])* 0.5
         -0.00445206*(ma[i+54]+mao[i+54])* 0.5
         -0.00458437*(ma[i+55]+mao[i+55])* 0.5
         -0.00455457*(ma[i+56]+mao[i+56])* 0.5
         -0.00439006*(ma[i+57]+mao[i+57])* 0.5
         -0.00412379*(ma[i+58]+mao[i+58])* 0.5
         -0.00379323*(ma[i+59]+mao[i+59])* 0.5
         -0.00343966*(ma[i+60]+mao[i+60])* 0.5
         -0.00310850*(ma[i+61]+mao[i+61])* 0.5
         -0.00285188*(ma[i+62]+mao[i+62])* 0.5
         -0.00273508*(ma[i+63]+mao[i+63])* 0.5
         -0.00274361*(ma[i+64]+mao[i+64])* 0.5
         +0.01018757*(ma[i+65]+mao[i+65])* 0.5;

         Buffer1[i]= NormalizeDouble(value1,NormalizedDigits);
         Buffer2[i]= NormalizeDouble(value2,NormalizedDigits);
         trend[i] = (i<Bars-1) ? (Buffer1[i]>Buffer2[i]) ? 1 : (Buffer1[i]<Buffer2[i]) ? -1 : trend[i+1] : 0;  
         Buffer1[i] = (trend[i] == 1) ? 1 : EMPTY_VALUE;
         Buffer2[i] = (trend[i] ==-1) ? 1 : EMPTY_VALUE;   
   }
   manageAlerts();
   return(0); 
   }

//+-------------------------------------------------------------------
//|                                                                  
//+-------------------------------------------------------------------
//
//
//
//
//

void manageAlerts()
{
   if (alertsOn)
   {
      int whichBar = 1; if (alertsOnCurrent) whichBar = 0;
      if (trend[whichBar] != trend[whichBar+1])
      {
         if (trend[whichBar] ==  1) doAlert(whichBar,"BUY");
         if (trend[whichBar] == -1) doAlert(whichBar,"SELL");
      }
   }
}

//
//
//
//
//

void doAlert(int forBar, string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
   if (previousAlert != doWhat || previousTime != Time[forBar]) {
       previousAlert  = doWhat;
       previousTime   = Time[forBar];

       //
       //
       //
       //
       //

        message = timeFrameToString(_Period)+" "+_Symbol+" at "+TimeToStr(TimeLocal(),TIME_SECONDS)+" Sadukey Signal: "+doWhat;
             if (alertsMessage) Alert(message);
             if (alertsNotify)  SendNotification(message);
             if (alertsEmail)   SendMail(_Symbol+" sadukey ",message);
             if (alertsSound)   PlaySound("alert2.wav");
   }
}

//
//
//
//
//

string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

string timeFrameToString(int tf)
{
   for (int i=ArraySize(iTfTable)-1; i>=0; i--) 
         if (tf==iTfTable[i]) return(sTfTable[i]);
                              return("");
}


