//+------------------------------------------------------------------+
//|                                               Bol_TP_Include.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
#define MB_OK                       	0x00000000
#define IDOK                           1
#define IDCANCEL                       2
#define WM_COMMAND                     0x0111
#define EA_NUMBER                      1

extern bool       Use_MagicNo    = true;
extern int        Personal_Magic = 0;

bool
   Can_Run    = true;

int
   MagicNumber,
   Magic_Seek_Limit = 100;
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
#import "user32.dll"
   //---- messages
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      MessageBoxA(int hWnd ,string lpText,string lpCaption,int uType);
#import

//+------------------------------------------------------------------+
int iAutoMagic()
{
string
   EA_GLOBAL_VAR_NAME,
   AutoMagic,
   Master_List[],
   Cur1 = StringSubstr(Symbol(),0,3),
   Cur2 = StringSubstr(Symbol(),3,3);
   SymbolsList(Master_List);
int
   EA_Instance_UID = 0,
   Magic1 = Get_Magic(Cur1, Master_List)+10,
   Magic2 = Get_Magic(Cur2,Master_List)+10,
   Period_ID = 0;
   if(Magic1==10001||Magic2==10001)Alert("Error finding currency. Error resolved internally but please advise the author of this error. ");
   switch (Period()){
      case PERIOD_MN1: Period_ID = 9; break;
      case PERIOD_W1:  Period_ID = 8; break;
      case PERIOD_D1:  Period_ID = 7; break;
      case PERIOD_H4:  Period_ID = 6; break;
      case PERIOD_H1:  Period_ID = 5; break;
      case PERIOD_M30: Period_ID = 4; break;
      case PERIOD_M15: Period_ID = 3; break;
      case PERIOD_M5:  Period_ID = 2; break;
      case PERIOD_M1:  Period_ID = 1; break;
   }
   EA_GLOBAL_VAR_NAME = StringConcatenate(Symbol(),Period_to_Text());
   if(Use_MagicNo)AutoMagic = StringConcatenate(EA_NUMBER, EA_Instance_UID, Magic1, Magic2, Period_ID,Personal_Magic);
   else AutoMagic = StringConcatenate(Personal_Magic,"");
   if(StringSubstr(WindowExpertName(),0,8)=="Bol_TP_v"){
      if (GlobalVariableCheck(EA_GLOBAL_VAR_NAME)){
         int result = MessageBoxA(0 ,"Warning!!! This EA is already running on the same pair and TF!!!"+"\n" + "EA will be inactive.",WindowExpertName(),MB_OK);
         Can_Run = false;
      }
      if (!GlobalVariableCheck(EA_GLOBAL_VAR_NAME)) GlobalVariableSet(EA_GLOBAL_VAR_NAME,StrToDouble(AutoMagic));
   }
   else{
      if(GlobalVariableCheck(EA_GLOBAL_VAR_NAME)){
         return(NormalizeDouble((GlobalVariableGet(EA_GLOBAL_VAR_NAME)),0));
      }
      while(!GlobalVariableCheck(EA_GLOBAL_VAR_NAME)){
         Personal_Magic++;
         AutoMagic = StringConcatenate(EA_NUMBER, EA_Instance_UID, Magic1, Magic2, Period_ID,Personal_Magic);
         if(Personal_Magic>Magic_Seek_Limit){
            Alert("Unable to determine Bol_TP MagicNumber. Please check Personal Magic is less than 100.");
            break;
         }
      }
   }
   return(StrToInteger(AutoMagic));
}   
//+------------------------------------------------------------------+
int SymbolsList(string &Master_Symbols[])
{
bool
   In_List =false;
string 
   SymbolsFileName="symbols.sel", 
   Currency[],
   Temp_Currency[],
   Symbols[];
int 
   Offset, 
   SymbolsNumber,
   hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
   if(hFile < 0) return(-1);
   SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116;
   ArrayResize(Symbols, SymbolsNumber);
   FileSeek(hFile, 4, SEEK_SET);
   for(int i = 0; i < SymbolsNumber; i++){  
      Symbols[i] = StringSubstr(FileReadString(hFile, 12),0,6);
      FileSeek(hFile, Offset, SEEK_CUR);
   }
   FileClose(hFile);
   SymbolsNumber--;
   ArrayResize(Master_Symbols,1);
   Master_Symbols[0]="USD";
   ArrayResize(Currency,SymbolsNumber*2);
   for(i = SymbolsNumber*2;i>=0;i=i-2){
      Currency[i] = StringSubstr(Symbols[i/2],0,3);
      Currency[i-1] = StringSubstr(Symbols[i/2],3,3);
   }
   for(i=ArraySize(Currency)-1;i>=0;i--){
      for(int x=ArraySize(Master_Symbols)-1;x>=0;x--){
         In_List=false;
         if(Currency[i]!=Master_Symbols[x])continue;
         if(Currency[i]==Master_Symbols[x]){
            In_List=true;
            break;
         }
      }
      if(!In_List){
         ArrayResize(Master_Symbols,ArraySize(Master_Symbols)+1);
         Master_Symbols[ArraySize(Master_Symbols)-1]=Currency[i];
      }
   }
   return(ArraySize(Master_Symbols));
}
//+------------------------------------------------------------------+
int Get_Magic(string Currency, string Currency_List[])
{
   for(int i=0;i<ArraySize(Currency_List);i++){
      if(Currency_List[i]==Currency)return(i);
   }
   return(10001);
}
//+------------------------------------------------------------------+
string Period_to_Text()
{
   switch(Period()){
      case PERIOD_MN1: return("MN1");
      case PERIOD_W1:  return("WK1");
      case PERIOD_D1:  return("DY1");
      case PERIOD_H4:  return("HR4");
      case PERIOD_H1:  return("HR1");
      case PERIOD_M30: return("M30");
      case PERIOD_M15: return("M15");
      case PERIOD_M5:  return("M05");
      case PERIOD_M1:  return("M01");
   }
}
//+------------------------------------------------------------------+