//+------------------------------------------------------------------+
//|                                               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    Lime
#define DOWNCLR  Red
#define OTHERCLR Yellow
#define OBJPREF  "ay-tf-"

//---- input parameters
extern string spr0           = "»»Display Setting";
extern int    RowPosition    = 1;
extern int    NumBars        = 10;
extern string spr1           = "»»use MN1, W1, D1, H4, H1 ...";
extern string TimeFrame      = "0";
extern string spr2           = "»»Stoch Setting";
extern int    StochPeriod1   = 5;
extern int    DPeriod1       = 3;
extern int    SlowingPeriod1 = 3;
extern string spr3           = "»»ADX Setting";
extern int    ADXPeriod      = 13;
extern int    ADXTrending    = 15;
extern string spr4           = "»»RSI Setting";
extern int    RSIPeriod      = 8;
extern int    RSIUp          = 55;
extern int    RSIDown        = 45;
extern string spr5           = "»»Alert Setting";
extern bool   EnableAlert    = true;
extern int    WindowId       = 0;

//maximum 12 symbols

string asIndic[] = {"AO", "STO", "ADX", "RSI"};   
     
int aiIndicators[][4]; 
int iBar0Sym  = 129;
int iBar10Sym = 164;
int iStartY   = 20;
int iRangeY   = 95; //distance between Row Display
int iTf;

string objpref;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   deinit();
   
   objpref = OBJPREF+"WID"+WindowId+"-"+TimeFrame;
   iTf = getTFByName(TimeFrame);

   if(NumBars < 2) NumBars = 2;
   ArrayResize(aiIndicators,NumBars);
   
   iStartY = iStartY + (RowPosition-1)*iRangeY;  
      
   layout();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
   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[NumBars][4]; 
      for (k=0; k<NumBars; k++)
      {
         aiIndicators[k][IDXAO]  = getAOColor (k, Symbol());
         aiIndicators[k][IDXSTO] = getSTOColor(k, Symbol());
         aiIndicators[k][IDXADX] = getADXColor(k, Symbol());
         aiIndicators[k][IDXRSI] = getRSIColor(k, Symbol());
      }        
      
      //update dashboard
      for (j=0; j<ArraySize(asIndic); j++) //indicators
      {
         for (k=0; k<NumBars; k++)
         {
            string objname = objpref+asIndic[j]+"-Bar"+k;
            ObjectSet(objname, OBJPROP_COLOR,aiIndicators[k][j]);
         }    
      }      
      
      
      //Alert
      if (!EnableAlert) return(0);

      if (   aiIndicators[0][IDXAO]  == UPCLR
          && aiIndicators[0][IDXSTO] == UPCLR
          && aiIndicators[0][IDXADX] == UPCLR
          && aiIndicators[0][IDXRSI] == UPCLR                    
          )                  
      alertOnce("TrendFinder, "+Symbol()+ "," + TimeFrame + "  -  BUY Signal, " + DoubleToStr(Close[0], Digits),  1);
      
      if (   aiIndicators[0][IDXAO]  == DOWNCLR
          && aiIndicators[0][IDXSTO] == DOWNCLR
          && aiIndicators[0][IDXADX] == DOWNCLR
          && aiIndicators[0][IDXRSI] == DOWNCLR
          
          )
      alertOnce("TrendFinder, "+Symbol()+ "," + TimeFrame + "  -  SELL Signal, " + DoubleToStr(Close[0], Digits), 2);      
   
   return(0);
}

void layout()
{   
   int j,k,y,x;   
   
   y=iStartY;
   objCreate(Symbol(), 15, y, Symbol() + ", "+TimeFrame,8,"Tahoma Bold",Silver);
   
   y+=20;
   x =(NumBars*11);
   for (k=NumBars-1; k>=0; k--)
   {
      int char;
      if (k<=9) char = iBar0Sym+k;
      else char = iBar10Sym;
      
      objCreate("Bar"+k, x, y, CharToStr(char),11,"Wingdings",Silver);
      x-=11;
   }
      
   y+=15;
   for (j=0; j<ArraySize(asIndic); j++) //indicators
   {     
      x =(NumBars*11)+15;
      objCreate(asIndic[j], x, y, asIndic[j],6,"Tahoma",Silver); 
      x -=15;
   
      for (k=NumBars-1; k>=0; k--) //indicator color of bar 1 and 0
      {                         
         objCreate(asIndic[j]+"-Bar"+k, x, y-2, "n",11,"Wingdings",Silver);             
         x-=11;   
      }
      y+=13;
   } 
      
} 

void objCreate(string name,int x,int y,string text="-",int size=42,
               string font="Arial",color colour=CLR_NONE)
{

   name = objpref+name;
   ObjectCreate(name,OBJ_LABEL,WindowId,0,0);
   ObjectSet(name,OBJPROP_CORNER,1);
   ObjectSet(name,OBJPROP_COLOR,colour);
   ObjectSet(name,OBJPROP_XDISTANCE,x);
   ObjectSet(name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,colour);
}  

color getAOColor(int shift, string sym)
{
   double val1 = iAO(sym,iTf, shift);
   double val2 = iAO(sym,iTf, shift + 1);  
   
   if (val1 > val2 ) return(UPCLR);
   else if (val1 < val2 ) return(DOWNCLR);
   else return(OTHERCLR);
}

color getSTOColor(int shift, string sym)
{
   double sto = iStochastic(sym,iTf,StochPeriod1,DPeriod1,SlowingPeriod1,MODE_SMA,0,MODE_MAIN,shift)-50; 
   
   if (sto > 0 ) return(UPCLR);
   else if (sto < 0 ) return(DOWNCLR);
   else return(OTHERCLR);
}

color getADXColor(int shift, string sym)
{
   double ADX0 = iADX(sym, iTf, ADXPeriod, PRICE_CLOSE, MODE_MAIN,    shift);
   double val1 = iADX(sym, iTf, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI,  shift);
   double val2 = iADX(sym, iTf, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, shift);
   
   if (ADX0 >= ADXTrending && val1 > val2 ) return(UPCLR);
   else if (ADX0 >= ADXTrending && val1 < val2 ) return(DOWNCLR);
   else return(OTHERCLR);   
}  

color getRSIColor(int shift, string sym)
{
   double val = iRSI(sym, iTf, RSIPeriod, PRICE_CLOSE, shift); 
   
   if(val >= RSIUp) return(UPCLR);
   else if(val <= RSIDown) return(DOWNCLR);
   else return(OTHERCLR); 

} 

int getTFByName(string TFName)
{
  int m;
  if      (TFName == "MN1" || TFName == "mn1") m = PERIOD_MN1;
  else if (TFName == "W1"  || TFName == "w1" ) m = PERIOD_W1;
  else if (TFName == "D1"  || TFName == "d1" ) m = PERIOD_D1;
  else if (TFName == "H4"  || TFName == "h4" ) m = PERIOD_H4;
  else if (TFName == "H1"  || TFName == "h1" ) m = PERIOD_H1;
  else if (TFName == "M30" || TFName == "m30") m = PERIOD_M30;
  else if (TFName == "M15" || TFName == "m15") m = PERIOD_M15;
  else if (TFName == "M5"  || TFName == "m5" ) m = PERIOD_M5;
  else if (TFName == "M1"  || TFName == "m1" ) m = PERIOD_M1;
  else m = Period();  
  
  return(m);  

}

void alertOnce(string msg, int sign)
{
   static int lastsign  = 0; //1 for buy, 2 for sell

   if(lastsign != sign)
   {
      Alert(msg);
      lastsign  = sign;      
   }   
   
}
//+------------------------------------------------------------------+