Currency heat map - any





//+------------------------------------------------------------------+
//|                                            Currency heat map.mq4 |
//|                                                           mladen |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1

//
//
//
//
//

extern string Currencies   = "USD;EUR;GBP;JPY;CHF;CAD;AUD;NZD";
extern string TimeFrames   = "H4;D1";
extern color  StrongUp     = LimeGreen;
extern color  WeakUp       = Green;
extern color  NoMove       = DimGray;
extern color  WeakDown     = FireBrick;
extern color  StrongDown   = Red;
extern color  DoesNotExist = Black;
extern bool   UseMSLineDrawFont = false;

//
//
//
//
//

string shortName;
int    shortLength;
int    window;  
string prefix="NA";
string suffix="NA";

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int    cpairsLen;
int    ctimesLen;
string cpairs[];
int    aTimes[];
string FontToUse = "Terminal";

//
//
//
//
//

int init()
{
   if (UseMSLineDrawFont) FontToUse = "MS LIneDraw";
   Currencies = StringUpperCase(StringTrimLeft(StringTrimRight(Currencies)));
   if (StringSubstr(Currencies,StringLen(Currencies),1) != ";")
                    Currencies = StringConcatenate(Currencies,";");

      //
      //
      //
      //
      //                                   

      int  s      = 0;
      int  i      = StringFind(Currencies,";",s);
      string current;
         while (i > 0)
         {
            current = StringSubstr(Currencies,s,i-s);
               ArrayResize(cpairs,ArraySize(cpairs)+1);
                           cpairs[ArraySize(cpairs)-1] = current;
                           s = i + 1;
                           i = StringFind(Currencies,";",s);
         }
      cpairsLen = ArraySize(cpairs);

      //
      //
      //
      //
      //

      TimeFrames = StringUpperCase(StringTrimLeft(StringTrimRight(TimeFrames)));
      if (StringSubstr(TimeFrames,StringLen(TimeFrames),1) != ";")
                       TimeFrames = StringConcatenate(TimeFrames,";");

         //
         //
         //
         //
         //                                   
            
         s = 0;
         i = StringFind(TimeFrames,";",s);
         int time;
            while (i > 0)
            {
               current = StringSubstr(TimeFrames,s,i-s);
               time    = stringToTimeFrame(current);
               if (time > 0) {
                     ArrayResize(aTimes,ArraySize(aTimes)+1);
                                 aTimes[ArraySize(aTimes)-1] = time; }
                                 s = i + 1;
                                     i = StringFind(TimeFrames,";",s);
            }
      ctimesLen = ArraySize(aTimes);
      
   //
   //
   //
   //
   //

      shortName   = MakeUniqueName("CHM ","");
      shortLength = StringLen(shortName);
      IndicatorShortName(shortName);
   return(0);
}

//
//
//
//
//

int deinit()
{
   clearObjects();
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int start()
{
   string name;
   int    gaph = (cpairsLen*66+10);
   int    gapv = (cpairsLen*15+20);
   int    i,k,t;

         window = WindowFind(shortName);  
         if (suffix=="NA" || prefix=="NA") getSuffixPrefix();   

   
   //
   //
   //
   //
   //

      for (t = 0; t < ctimesLen; t++ )
      {
         name = shortName+"t"+t+i;
         if (ObjectFind(name) == -1)
             ObjectCreate(name,OBJ_LABEL,window,0,0,0,0);
                ObjectSet(name,OBJPROP_XDISTANCE,5 +(t%2)*30);
                ObjectSet(name,OBJPROP_YDISTANCE,20+(t/2)*15);
                ObjectSetText(name,TimeFrameToString(aTimes[t]),10,"Arial Bold");

         //
         //
         //
         //
         //
         
         for (i = 0; i < cpairsLen; i++)
         {
            name = shortName+"h"+t+i;
            if (ObjectFind(name) == -1)
                ObjectCreate(name,OBJ_LABEL,window,0,0,0,0);
                   ObjectSet(name,OBJPROP_XDISTANCE,i*66+120+gaph*(t%2));
                   ObjectSet(name,OBJPROP_YDISTANCE,       1+gapv*(t/2));
                   ObjectSetText(name,cpairs[i],10,"Arial Bold");
            if ((t%2)>0) continue;
            name = shortName+"v"+t+i;
            if (ObjectFind(name) == -1)
               ObjectCreate(name,OBJ_LABEL,window,0,0,0,0);
                ObjectSet(name,OBJPROP_XDISTANCE,     65);
                ObjectSet(name,OBJPROP_YDISTANCE,i*15+20+gapv*(t/2));
                ObjectSetText(name,cpairs[i],10,"Arial Bold");
         }                
      }
      
   //
   //
   //
   //
   //      

   for (t = 0;   t < ctimesLen; t++)
   for (i = 0;   i < cpairsLen; i++)
   for (k = i+1; k < cpairsLen; k++)
   {
      string symbol = prefix+cpairs[i]+cpairs[k]+suffix;
      double price  = iMA(symbol,aTimes[t],1,0,MODE_SMA,PRICE_CLOSE,0);
      bool   normal = true;
      bool   exist  = true;
         
         if (price == 0)
            {
               symbol = prefix+cpairs[k]+cpairs[i]+suffix;
               price  = iMA(symbol,aTimes[t],1,0,MODE_SMA,PRICE_CLOSE,0);
               normal = false;
            }                  
         if (price == 0) exist = false;
            
      double close = iMA(symbol,aTimes[t],1,0,MODE_SMA,PRICE_CLOSE,1);
      double high  = iMA(symbol,aTimes[t],1,0,MODE_SMA,PRICE_HIGH ,1);
      double low   = iMA(symbol,aTimes[t],1,0,MODE_SMA,PRICE_LOW  ,1);
         
      //
      //
      //
      //
      //
       
      for (int l=0; l<2; l++)
      {  
         color  theColor = DoesNotExist;
            if (exist)
            {
               if (!normal)
                  while (true)
                  {
                     if (price > high)  { theColor = StrongUp;   break; }
                     if (price > close) { theColor = WeakUp;     break; }
                     if (price== close) { theColor = NoMove;     break; }
                     if (price < low)   { theColor = StrongDown; break; }
                                          theColor = WeakDown;   break; 
                  }
               else               
                  while (true)
                  {
                     if (price > high)  { theColor = StrongDown; break; }
                     if (price > close) { theColor = WeakDown;   break; }
                     if (price== close) { theColor = NoMove;     break; }
                     if (price < low)   { theColor = StrongUp;   break; }
                                          theColor = WeakUp;     break; 
               }
            }
            
            //
            //
            //
            //
            //
            
            name = shortName+t+k+i;
            if (ObjectFind(name) == -1)
                  ObjectCreate(name,OBJ_LABEL,window,0,0,0,0);
                  ObjectSet(name,OBJPROP_XDISTANCE,i*66+100+gaph*(t%2));
                  ObjectSet(name,OBJPROP_YDISTANCE,k*15+ 20+gapv*(t/2));
                  ObjectSetText(name,"ÛÛÛÛÛÛÛÛ",10,FontToUse,theColor);
            int tmp = k; k = i; i = tmp;
            normal = (!normal);
      }                                    
   }
   return(0);
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

string MakeUniqueName(string first, string rest)
{
   string result = first+(MathRand()%1001)+rest;

   while (WindowFind(result)> 0)
          result = first+(MathRand()%1001)+rest;
   return(result);
}

//
//
//
//
//

void clearObjects()
{
   for (int i = ObjectsTotal(); i>=0; i--)
   {
         string name = ObjectName(i);
         if (StringSubstr(name,0,shortLength) == shortName) ObjectDelete(name);
   }         
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int stringToTimeFrame(string tfs)
{
   int tf=0;
       tfs = StringTrimLeft(StringTrimRight(StringUpperCase(tfs)));
         if (tfs=="M1" || tfs=="1")     tf=PERIOD_M1;
         if (tfs=="M5" || tfs=="5")     tf=PERIOD_M5;
         if (tfs=="M15"|| tfs=="15")    tf=PERIOD_M15;
         if (tfs=="M30"|| tfs=="30")    tf=PERIOD_M30;
         if (tfs=="H1" || tfs=="60")    tf=PERIOD_H1;
         if (tfs=="H4" || tfs=="240")   tf=PERIOD_H4;
         if (tfs=="D1" || tfs=="1440")  tf=PERIOD_D1;
         if (tfs=="W1" || tfs=="10080") tf=PERIOD_W1;
         if (tfs=="MN" || tfs=="43200") tf=PERIOD_MN1;
  return(tf);
}
string TimeFrameToString(int tf)
{
   string tfs;
   switch(tf) {
      case PERIOD_M1:  tfs="M1"  ; break;
      case PERIOD_M5:  tfs="M5"  ; break;
      case PERIOD_M15: tfs="M15" ; break;
      case PERIOD_M30: tfs="M30" ; break;
      case PERIOD_H1:  tfs="H1"  ; break;
      case PERIOD_H4:  tfs="H4"  ; break;
      case PERIOD_D1:  tfs="D1"  ; break;
      case PERIOD_W1:  tfs="W1"  ; break;
      case PERIOD_MN1: tfs="MN";
   }
   return(tfs);
}

//
//
//
//
//

string StringUpperCase(string str)
{
   string   s = str;
   int      lenght = StringLen(str) - 1;
   int      char;
   
   while(lenght >= 0)
      {
         char = StringGetChar(s, lenght);
         
         //
         //
         //
         //
         //
         
         if((char > 96 && char < 123) || (char > 223 && char < 256))
                  s = StringSetChar(s, lenght, char - 32);
         else 
              if(char > -33 && char < 0)
                  s = StringSetChar(s, lenght, char + 224);
         lenght--;
   }
   return(s);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

#import "kernel32.dll"
    int _lclose (int);
    int _lopen  (string,int);
    int _llseek (int,int,int);
    int _lread  (int,string,int);
#import
#define sectorSize  1936
#define HFILE_ERROR -1

//
//
//
//
//

void getSuffixPrefix()
{ 
   int fileHandle = _lopen(TerminalPath()+"\\history\\"+AccountServer()+"\\symbols.raw",0);
   if (fileHandle == HFILE_ERROR) return;
    
   //
   //
   //
   //
   //

      prefix="";
      suffix="";
   
   //
   //
   //
   //
   //
   
   for(int i=0;; i++)
   {
      _llseek(fileHandle, i * sectorSize, 0);
      string symbolName = "123456789012";
                   if (_lread (fileHandle, symbolName, 12) != 12) break;
             symbolName = StringSubstr(symbolName, 0);
                   
             //
             //
             //
             //
             //
                   
             int pos = StringFind(symbolName,"EURUSD",0);
             if (pos > -1)
             {
                if (pos>0)
                     prefix = StringSubstr(symbolName,0,pos);
                else suffix = StringSubstr(symbolName,6,0);
                break;
             }
   } 
   _lclose(fileHandle);
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

Moving average indicator


Custom Indicators Used:
kernel32

Order Management characteristics:

Other Features: