//+------------------------------------------------------------------+
//|                                               ay-TrendFinder.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#define IDXAO  0
#define IDXSTO 1
#define IDXADX 2
#define IDXRSI 3
#define UPCLR   LimeGreen
#define DOWNCLR Red
#define SAMECLR Yellow
#define OBJPREF "ay-tf-"

//---- input parameters
extern string spr0           = "H1:60, H4:240, DAILY: 1440, WEEKLY: 10080, MONTHLY: 43200";
extern int    TimeFrame      = 240;
extern string spr1           = "=====================";
extern int    StochPeriod1   = 5;
extern int    DPeriod1       = 3;
extern int    SlowingPeriod1 = 3;
extern string spr2           = "=====================";
extern int    ADXPeriod      = 13;
extern string spr3           = "=====================";
extern int    RSIPeriod      = 8;
extern int    RSIUp          = 55;
extern int    RSIDown        = 45;
extern string spr4           = "=====================";
extern bool   EnableAlert    = true;

//maximum 12 symbols

string asIndic[] = {"AO", "STO", "ADX", "RSI"};   
     
int aiIndicators[4][2]; 


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

   layout();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   int objs = ObjectsTotal();
   string name;
   for(int cnt=ObjectsTotal()-1;cnt>=0;cnt--)
   {
      name=ObjectName(cnt);
      if (StringSubstr(name,0,StringLen(OBJPREF)) == OBJPREF) ObjectDelete(name); 
      WindowRedraw();
   }  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    counted_bars=IndicatorCounted();
   int i,j,k,m;
   //----

   

   //populate indicators color
      //aiIndicators[4][2]; 
      for (k=0; k<2; k++)
      {
         aiIndicators[IDXAO][k]  = getAOColor (k, Symbol());
         aiIndicators[IDXSTO][k] = getSTOColor(k, Symbol());
         aiIndicators[IDXADX][k] = getADXColor(k, Symbol());
         aiIndicators[IDXRSI][k] = getRSIColor(k, Symbol());
      }        
      
      //update dashborad
      for (j=0; j<ArraySize(asIndic); j++) //indicators
      {
         for (k=0; k<2; k++)
         {
            string objname = OBJPREF+asIndic[j]+"-Bar"+k;
            ObjectSet(objname, OBJPROP_COLOR,aiIndicators[j][k]);
         }    
      }      
      
      
      //Alert
      if (!EnableAlert) return(0);
      
      if (   aiIndicators[IDXAO][0]  == UPCLR
          && aiIndicators[IDXSTO][0] == UPCLR
          && aiIndicators[IDXADX][0] == UPCLR
          && aiIndicators[IDXRSI][0] == UPCLR                    
          )
      alertOnce("TrendFinder, "+Symbol()+ ":" + getTfName(TimeFrame) + "  -  BUY Signal, " + DoubleToStr(Close[0], Digits),  0);
      
      if (   aiIndicators[IDXAO][0]  == DOWNCLR
          && aiIndicators[IDXSTO][0] == DOWNCLR
          && aiIndicators[IDXADX][0] == DOWNCLR
          && aiIndicators[IDXRSI][0] == DOWNCLR
          
          )
      alertOnce("TrendFinder, "+Symbol()+ ":" + getTfName(TimeFrame) + "  -  SELL Signal, " + DoubleToStr(Close[0], Digits), 1);      
   
   return(0);
}
void layout()
{   
   int j,k, y, x;   
   y=40;
   
   objCreate(Symbol() + getTfName(TimeFrame), 30, 20, Symbol() + ", "+getTfName(TimeFrame),9,"Tahoma Bold",Silver);
   for (j=0; j<ArraySize(asIndic); j++) //indicators
   {     
      x =70;
      objCreate(asIndic[j], x, y, asIndic[j],8,"Verdana Bold",DimGray); 
      x -=25;
   
      for (k=1; k>=0; k--) //indicator color of bar 1 and 0
      {                         
         objCreate(asIndic[j]+"-Bar"+k, x, y-3, "n",14,"Wingdings",DimGray);             
         x-=15;   
      }
      y+=20;
   } 
   
   
} 

void objCreate(string name,int x,int y,string text="-",int size=42,
               string font="Arial",color colour=CLR_NONE)
{
 ObjectCreate(OBJPREF+name,OBJ_LABEL,0,0,0);
 ObjectSet(OBJPREF+name,OBJPROP_CORNER,1);
 ObjectSet(OBJPREF+name,OBJPROP_COLOR,colour);
 ObjectSet(OBJPREF+name,OBJPROP_XDISTANCE,x);
 ObjectSet(OBJPREF+name,OBJPROP_YDISTANCE,y);
 ObjectSetText(OBJPREF+name,text,size,font,colour);
}  

color getAOColor(int shift, string sym)
{
   double val1 = iAO(sym,TimeFrame, shift);
   double val2 = iAO(sym,TimeFrame, shift + 1);  
   
   if (val1 > val2 ) return(UPCLR);
   else if (val1 < val2 ) return(DOWNCLR);
   else return(SAMECLR);
}

color getSTOColor(int shift, string sym)
{
   double sto = iStochastic(sym,TimeFrame,StochPeriod1,DPeriod1,SlowingPeriod1,MODE_SMA,0,MODE_MAIN,shift)-50; 
   
   if (sto > 0 ) return(UPCLR);
   else if (sto < 0 ) return(DOWNCLR);
   else return(SAMECLR);
}

color getADXColor(int shift, string sym)
{
   double ADX0 = iADX(sym, TimeFrame, ADXPeriod, PRICE_CLOSE, MODE_MAIN,    shift);
   double val1 = iADX(sym, TimeFrame, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI,  shift);
   double val2 = iADX(sym, TimeFrame, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, shift);
   
   if (ADX0 >= 15 && val1 > val2 ) return(UPCLR);
   else if (ADX0 >= 15 && val1 < val2 ) return(DOWNCLR);
   else return(SAMECLR);   
}  

color getRSIColor(int shift, string sym)
{
   double val = iRSI(sym, TimeFrame, RSIPeriod, PRICE_CLOSE, shift); 
   
   if(val >= RSIUp) return(UPCLR);
   else if(val <= RSIDown) return(DOWNCLR);
   else return(SAMECLR); 

} 

string getTfName(int tf)
{
  string n;
  switch (tf)
  {
    case PERIOD_MN1:  
      n= "MN1"; break;
    case PERIOD_W1:   
      n= "W1";  break;
    case PERIOD_D1:   
      n= "D1";  break;
    case PERIOD_H4:   
      n= "H4";  break;
    case PERIOD_H1:   
      n= "H1";  break;
    case PERIOD_M30:  
      n= "M30"; break;
    case PERIOD_M15:   
      n= "M15";  break;
    case PERIOD_M5:   
      n= "M5";  break;
    case PERIOD_M1:   
      n= "M1";  break;   
  }
  
  return(n);
}

void alertOnce(string msg, int sign)
{
   static int lastsign  = 0; //0 for buy, 1 for sell
   if(lastsign != sign)
   {
      Alert(msg);
      lastsign  = sign;      
   }   
   
}
//+------------------------------------------------------------------+