//+------------------------------------------------------------------+
//|                                               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


//---- 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 int    MaxColumn      = 4;


//maximum 12 symbols
string asPairs[] = 
   {
   "EURUSD","GBPUSD","USDJPY","USDCHF","AUDUSD","USDCAD",
   "NZDUSD","EURJPY","GBPJPY","AUDJPY","NZDJPY","GBPCHF"
   }; 
string asIndic[] = {"AO", "STO", "ADX", "RSI"};   
/*
   ARRAY DOUBLE :
   1st Dimension is for Pair
   2nd Dimensiaon is for indicaor (AO, STO, ADX, RSI)
   3rd Indicator value 0 for Red, 1 for Green
*/     
int aiIndicators[][4][2]; 


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   ArrayResize(aiIndicators,ArraySize(asPairs));
   layout();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectsDeleteAll(); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    counted_bars=IndicatorCounted();
   int i,j,k,m;
   //----

   //populate indicators color
   for(i=0; i<ArraySize(asPairs); i++)
   {
      //aiIndicators[][4][2]; 
      for (k=0; k<2; k++)
      {
         aiIndicators[i][IDXAO][k]  = getAOColor (k, asPairs[i]);
         aiIndicators[i][IDXSTO][k] = getSTOColor(k, asPairs[i]);
         aiIndicators[i][IDXADX][k] = getADXColor(k, asPairs[i]);
         aiIndicators[i][IDXRSI][k] = getRSIColor(k, asPairs[i]);
      }
      
   }
   
   for(i=0; i<ArraySize(asPairs); i++)
   {
      for (j=0; j<ArraySize(asIndic); j++) //indicators
      {
         for (k=0; k<2; k++)
         {
            //EURUSD-AO-Bar1
            string objname = asPairs[i]+"-"+asIndic[j]+"-Bar"+k;
            ObjectSet(objname, OBJPROP_COLOR,aiIndicators[i][j][k]);
         }    
      }      
   }   
   
   return(0);
}
void layout()
{   
   int i,j,k, xpair, y, x;//, miny;
   int row;
   int dot;
   int miny1=50, miny2=200, miny3=350;
   int miny[] = {50,200,350,500};
   int maxcol = 3;
   //int maxrow = 3;
   
   for(i=0; i<ArraySize(asPairs); i++) //pair
   {      
      row = MathCeil(i/MaxColumn);
      
      xpair = ( (i-(row*MaxColumn)) *210)+30;

      
      y=miny[row];
      
      //draw pair label
      objCreate(asPairs[i], xpair, y-35, asPairs[i]+","+getTfName(TimeFrame), 10,"Verdana Bold",Silver);
      
      for (j=0; j<ArraySize(asIndic); j++) //indicators
      {     
         x =xpair;
         objCreate(asPairs[i]+"-"+asIndic[j], x, y, asIndic[j],8,"Verdana Bold",DimGray); 
         x +=30;
         for (k=1; k>=0; k--) //indicator color of bar 1 and 0
         {                                     
            objCreate(asPairs[i]+"-"+asIndic[j]+"-Bar"+k, x, y-7, "n",20,"Wingdings",DimGray);             
            x+=20;   
         }
         y+=20;
     } 
   }
   
   
} 

void objCreate(string name,int x,int y,string text="-",int size=42,
               string font="Arial",color colour=CLR_NONE)
{
 ObjectCreate(name,OBJ_LABEL,0,0,0);
 ObjectSet(name,OBJPROP_CORNER,0);
 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,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(NULL, 0, ADXPeriod, PRICE_CLOSE, MODE_MAIN, i);
   double val1 = iADX(sym, TimeFrame, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI,  shift);
   double val2 = iADX(sym, TimeFrame, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, shift);
   
   if (val1 > val2 ) return(UPCLR);
   else if (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);
}
//+------------------------------------------------------------------+