//+------------------------------------------------------------------+
//|                                                     ADX Scan.mq4 |
//|                                 Copyright © 2010, Simon Kaufmann |
//|                                                                  |
//+------------------------------------------------------------------+

// best placed on a 1 minute chart to get most frequent updates

#property copyright "Copyright © 2010, Simon Kaufmann"
#property link      ""

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1

extern int     ADXPeriod      = 14;
extern int     AppliedPrice   = 0;
extern int     TrendThreshold = 25;
extern color   textcolor      = Snow;
extern int     textsize       = 6;

string objprefix = "ADX-SCAN-";
string indi_name = "ADX Scan";

string symbol[] = {"EURUSD", "GBPUSD", "AUDUSD", "AUDJPY", "USDJPY", "GBPJPY", "EURJPY", "CADJPY", "USDCAD", "EURCAD", "AUDCAD", "GBPCAD", "EURAUD", "AUDNZD", "NZDUSD", "USDCHF", "EURCHF", "EURGBP", "GBPAUD", "CHFJPY", "NZDJPY" };
string tf_text[] = {"M1", "M5", "M15", "H1"}; 
int timeframe[] = {PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_H1};
int window;
static bool done;

int xoffset=75;
int yoffset=20;
int x, y, spacingx, spacingy;

datetime ctime, prevtime;

double ADX0, ADX1, plusDI, minusDI;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorShortName(indi_name);
   
   string AddChar = StringSubstr(Symbol(),6,4);
   for (int cc = 0; cc <= ArraySize(symbol); cc++)
   {
      symbol[cc] = StringConcatenate(symbol[cc], AddChar);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   deleteObjects();     
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{  
   initGraph();
   scan();
   done = true;                                              
   return(0);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Custom indicator delete objects function                         |
//+------------------------------------------------------------------+

void deleteObjects()
{
   
   for(int i=ObjectsTotal();i >= 0;i--) 
   {
      if(StringSubstr(ObjectName(i),0,StringLen(objprefix))==objprefix) 
         ObjectDelete(ObjectName(i));    
   }  
}

 
//----------------------------------------   
void initGraph() 
{
   if (done) { return; }
   spacingx = textsize*7;
   spacingy = textsize+8;
   // draw up table of symbols and tf_text
   for (int i = 0; i < ArraySize(symbol); i++)
   { 
      x = xoffset+(spacingx*i);
      objectCreate(symbol[i],x, 5, symbol[i],textsize,"Arial",textcolor);
      for (int j = 0; j < ArraySize(timeframe); j++)
      {
         objectReset(symbol[i]+DoubleToStr(timeframe[j],0),x+10,y,Gray);
      }
   }
   // draw timeframe headers
   for (int k = 0; k < ArraySize(timeframe); k++)
   {
      y = yoffset + (spacingy*k);
      objectCreate(tf_text[k],15,y,tf_text[k],textsize,"Arial",textcolor);
   }
   done = true;
}


//+------------------------------------------------------------------+
void objectCreate(string name,int x,int y,string text="-",int size=42,
                  string font="Arial",color colour=CLR_NONE)
{
   ObjectCreate(objprefix+name,OBJ_LABEL,WindowFind(indi_name),0,0);
   ObjectSet(objprefix+name,OBJPROP_CORNER,0);
   ObjectSet(objprefix+name,OBJPROP_COLOR,colour);
   ObjectSet(objprefix+name,OBJPROP_XDISTANCE,x);
   ObjectSet(objprefix+name,OBJPROP_YDISTANCE,y);
   ObjectSetText(objprefix+name,text,size,font,colour);

}

void objectReset(string name,int i,int j,color colour=CLR_NONE)
{
   x = xoffset+(spacingx*i); y = yoffset+(spacingy*j);
   if (ObjectFind(name)>0) { ObjectDelete(name); }
   objectCreate(name,x+10,y,CharToStr(152),textsize,"Wingdings 2",colour);
}

//----------------------------------------  
void scan()                                                          
{   
   ctime = Time[0]; 
   if (ctime == prevtime) { return(0); }  
   prevtime = ctime;
   
   // loop through array of symbols
   for ( int i = 0; i< ArraySize(symbol); i++)
   {      
      // loop through timeframes
      for (int j = 0; j < ArraySize(timeframe); j++)
      {
         ADX0 = iADX(symbol[i],timeframe[j],ADXPeriod, AppliedPrice, MODE_MAIN, 0);
         ADX1 =  iADX(symbol[i],timeframe[j],ADXPeriod, AppliedPrice, MODE_MAIN, 1); 
         plusDI = iADX(symbol[i],timeframe[j],ADXPeriod, AppliedPrice, MODE_PLUSDI, 0);
         minusDI = iADX(symbol[i],timeframe[j],ADXPeriod, AppliedPrice, MODE_MINUSDI, 0);  
         
         // If ADX is rising and above the threshold - then we are in a trend
         if (  (ADX0 > ADX1) && (ADX0 > TrendThreshold) )
         {       
            if (plusDI > minusDI && plusDI > (TrendThreshold - 1)) { objectReset(symbol[i]+DoubleToStr(timeframe[j],0),i,j,PaleGreen); }
            if (minusDI> plusDI && minusDI > (TrendThreshold - 1))  { objectReset(symbol[i]+DoubleToStr(timeframe[j],0),i,j,IndianRed); }
         }
         else
         { 
            objectReset(symbol[i]+DoubleToStr(timeframe[j],0),i,j,Gray);
         }
      }
   }                                                                
}
  
  


