#property copyright "Copyright © 2010, Simon Kaufmann"
#property link      ""

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1

extern color   textcolor            = Black;
extern int     textsize             = 8;
extern color   Diamond_Bullish      = Green;
extern color   Diamond_Bearish      = Red;
extern color   Diamond_Neutral      = Gray;

string objprefix = "VSA-SCAN-";
string indi_name = "VSA Scan";

string tf_text[] = {"M5", "M15", "H1", "H4"}; 
int timeframe[] = {PERIOD_M5, PERIOD_M15, PERIOD_H1, PERIOD_H4};
int window;
static bool done;

int xoffset=80;
int yoffset=20;
int x, y, spacingx, spacingy;

datetime ctime, prevtime;

//+------------------------------------------------------------------+
//| 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 = 10; //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
   y = 0;
   for (int k = 0; k < ArraySize(timeframe); k++)
   {
      y = y + spacingy;
      objectCreate(Symbol() + tf_text[k],15,y,Symbol() + 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,int k,color colour=CLR_NONE)
{
   x = xoffset+(spacingx*(50-k)); y = spacingy+(spacingy*i*ArraySize(timeframe))+(spacingy*j);
   if (ObjectFind(name)>0) { ObjectDelete(name); }
   objectCreate(name,x+10,y,CharToStr(174),textsize,"Wingdings 2",colour);
   
}

color computeDiamond(string symbol, int timeframe, int m5shift) {
   double ma = NormalizeDouble(iMA(symbol, timeframe, 20, 0, MODE_SMA, PRICE_CLOSE, m5shift), Digits);
   double maPrev = NormalizeDouble(iMA(symbol, timeframe, 20, 0, MODE_SMA, PRICE_CLOSE, m5shift + 1), Digits);
   double close = NormalizeDouble(iClose(symbol, timeframe, m5shift), Digits);
   
   if (ma > maPrev) {
      if (close > ma) return(Diamond_Bullish);
   }
   if (ma < maPrev) {
      if (close < ma) return(Diamond_Bearish);
   }
   return(Diamond_Neutral);     
}

//----------------------------------------  
void scan()                                                          
{   
   ctime = iTime(NULL, PERIOD_M1, 0); 
   if (ctime == prevtime) { return(0); }  
   prevtime = ctime;
   
        
   // loop through timeframes
   for (int j = 0; j < ArraySize(timeframe); j++)
   {  
      for (int k = 1; k <= 50; k++) {
         // If MA are within a certain range of each other
         
         objectReset(Symbol()+DoubleToStr(timeframe[j],0)+DoubleToStr(k,0), 0, j, k, computeDiamond(Symbol(),timeframe[j],k));
      }
   }                                                                
}
  
  


