Как получить собственное имя и путь файла ex5 ? - страница 2

 

Ну тогда финальная версия для индикаторов и экспертов что возвращает корректно имя ex5 даже переименнованного :

string GetFileNameFromPath(string FullPath)
{
    int LastBackslash = StringLastIndexOf(FullPath, '\\'); // Находим последнее вхождение "\"
    
    if (LastBackslash >= 0)
        return StringSubstr(FullPath, LastBackslash + 1); // Извлекаем имя файла

    return FullPath; // Если `\` не найден, возвращаем весь путь (на случай, если это просто имя файла)
}

// Функция для поиска последнего вхождения символа в строке
int StringLastIndexOf(const string Str, const short Char)
{
    int Pos = StringLen(Str) - 1;

    while (Pos >= 0 && Str[Pos] != Char)
        Pos--;

    return Pos;
}
// Пример использования:
void OnStart()
{
    string FullPath = MQLInfoString(MQL_PROGRAM_PATH);
    Print("Full Path: ", FullPath);

    string FileName = GetFileNameFromPath(FullPath);
    Print("Extracted File Name: ", FileName);
}
1 (AUDNZD,M5) Full Path: C:\Program Files\RoboForex MT5 Terminal\MQL5\Indicators\1.ex5

1 (AUDNZD,M5) Extracted File Name: 1.ex5

переименовал 1.ex5 в 2.ex5 без перекомпиляции: 

2 (AUDNZD,M5) Full Path: C:\Program Files\RoboForex MT5 Terminal\MQL5\Indicators\2.ex5

2 (AUDNZD,M5) Extracted File Name: 2.ex5



 
string FileName = MQLInfoString(MQL_PROGRAM_NAME); // GetFileNameFromPath(FullPath);
 
fxsaber #:


2)  
MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME

первый мой пост прочтите оно у меня коряво работало... 

INDICATOR_SHORTNAME и имя файла это не одно и то же. Поэтому нет! 

 
Alex Renko #:

2)  MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME

Не должно быть так.

а тут тогда как ? почему оно коряво через  раз работает ? первы мой пост прочтите

MQL_PROGRAM_NAME всегда находится в конце MQL_PROGRAM_PATH. Иначе - баг. Если есть код воспроизведения бага, поделитесь для багрепорта.

 
fxsaber #:

Не должно быть так.

MQL_PROGRAM_NAME всегда находится в конце MQL_PROGRAM_PATH. Иначе - баг. Если есть код воспроизведения бага, поделитесь для багрепорта.

та я вот тестирую сейчас все работает... щас поищу почему не работало... гдето был кодик... минуту

 

Берем стандартный Accelerator.mq5 

Меняем OnInit на код:

void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtACBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtFastBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtAOBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtSMABuffer,INDICATOR_CALCULATIONS);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT);
//--- name for DataWindow
   IndicatorSetString(INDICATOR_SHORTNAME,"AC1");
//--- get handles
   ExtFastSMAHandle=iMA(NULL,0,FAST_PERIOD,0,MODE_SMA,PRICE_MEDIAN);
   ExtSlowSMAHandle=iMA(NULL,0,SLOW_PERIOD,0,MODE_SMA,PRICE_MEDIAN);
   
   Print(MQLInfoString(MQL_PROGRAM_NAME));
  }

Сохраняем как Accelerator1.mq5 и компилим

Делаем все тоже самое  для  Accelerator2.mq5 и компилим:

void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtACBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtFastBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtAOBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtSMABuffer,INDICATOR_CALCULATIONS);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT);
//--- name for DataWindow
   IndicatorSetString(INDICATOR_SHORTNAME,"AC2");
//--- get handles
   ExtFastSMAHandle=iMA(NULL,0,FAST_PERIOD,0,MODE_SMA,PRICE_MEDIAN);
   ExtSlowSMAHandle=iMA(NULL,0,SLOW_PERIOD,0,MODE_SMA,PRICE_MEDIAN);
   
   Print(MQLInfoString(MQL_PROGRAM_NAME));
  }

только меняем имя 

  IndicatorSetString(INDICATOR_SHORTNAME,"AC2");

Проверяем принты двух разных индиктаоров: 

2025.01.30 14:27:36.089 Accelerator1 (AUDNZD,M5) AC1

2025.01.30 14:27:40.285 Accelerator2 (AUDNZD,M5) AC2


Вывод?  

MQLInfoString(MQL_PROGRAM_NAME)

тоже самое что 

IndicatorSetString(INDICATOR_SHORTNAME,"xxx")

в индикаторах ?

 
Alex Renko #:

Вывод?

Обсуждение.

 
Alex Renko #:
MQLInfoString(MQL_PROGRAM_NAME)


void OnInit()
{
//--- indicator digits
  IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- indicator short name
  string PROGRAM_NAME=MQLInfoString(MQL_PROGRAM_NAME);
  IndicatorSetString(INDICATOR_SHORTNAME,"A/D");
//--- index buffer
  SetIndexBuffer(0,ExtADbuffer);
//--- set index draw begin
  PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
  Print(MQLInfoString(MQL_PROGRAM_NAME)," | ",PROGRAM_NAME); 
}
 
   Print("1: ", MQLInfoString(MQL_PROGRAM_PATH));
   Print("1: ", MQLInfoString(MQL_PROGRAM_NAME));
   IndicatorSetString(INDICATOR_SHORTNAME, "qwert");
   Print("2: ", MQLInfoString(MQL_PROGRAM_PATH));
   Print("2: ", MQLInfoString(MQL_PROGRAM_NAME));


2025.01.30 16:10:21.392 ATR_test_123456 (AUDCAD,H1)     1: C:\Program Files\RoboForex - MetaTrader 5\MQL5\Indicators\Examples\ATR_test_123456.ex5
2025.01.30 16:10:21.392 ATR_test_123456 (AUDCAD,H1)     1: ATR_test_123456
2025.01.30 16:10:21.392 ATR_test_123456 (AUDCAD,H1)     2: C:\Program Files\RoboForex - MetaTrader 5\MQL5\Indicators\Examples\ATR_test_123456.ex5
2025.01.30 16:10:21.392 ATR_test_123456 (AUDCAD,H1)     2: qwert
 
Короче это баг который не пофиксят. А именно в индикаторах если в OnInit первым будет стоять опеределение 
IndicatorSetString(INDICATOR_SHORTNAME
то далее в Init если будете вызывать функцию 
MQLInfoString(MQL_PROGRAM_NAME)

то она будет принимать значение INDICATOR_SHORTNAME. 


Для тех кому важно проверять какое имя именно юзает юзер на своей стороне вами скомпиленное или декампил и что важно переименован ли ex5 или был ли взломан и с какого именно mq5 он компилился вот финальный код:

string SoftNameVersion = "IndicatorExample1.ex5" // must be same as your final ex5 

int OnInit()
{
// ----- your code ------
   // init of INDICATOR_SHORTNAME must be at the end of OnInit - otherwise its kill MQLInfoString(MQL_PROGRAM_NAME)
   string Sourse_path = __FILE__; // we receive name of MQ5 sourse file that was used to compile ex5
   // we replace "mq5" to ".ex5"
   string ex5_path = StringSubstr(Sourse_path, 0, StringLen(Sourse_path) - 4) + ".ex5";
   Print("ex5_path:         ",ex5_path);
   
   string FullPath = MQLInfoString(MQL_PROGRAM_PATH);
   string FileNameFromPath = GetFileNameFromPath(FullPath);
   Print("FileNameFromPath: ", FileNameFromPath); // this is name of ex5 from user program path
    
   string PROGRAM_NAME = MQLInfoString(MQL_PROGRAM_NAME)+".ex5"; // GetFileNameFromPath(FullPath);
   Print("MQL_PROGRAM_NAME: ", PROGRAM_NAME); // this is name of ex5 from user program name

   // Indicator Short Name init
   IndicatorSetString(INDICATOR_SHORTNAME, SoftNameVersion); //must be at the end of OnInit - otherwise its kill MQLInfoString(MQL_PROGRAM_NAME)
   Print("SoftNameVersion:  ",SoftNameVersion);
   
   if(FileNameFromPath != PROGRAM_NAME 
   || FileNameFromPath != SoftNameVersion 
   || PROGRAM_NAME != SoftNameVersion
   || ex5_path != FileNameFromPath
   || ex5_path != PROGRAM_NAME
   || ex5_path != SoftNameVersion
   )
   {
   Print("Old or Cracked version of soft - please download New at www.....");
   return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
  }

// Additioanld Functions

//-------------------------------------------------------------------------------------
string GetFileNameFromPath(string FullPath)
{
    int LastBackslash = StringLastIndexOf(FullPath, '\\'); // Находим последнее вхождение "\"
    
    if (LastBackslash >= 0)
        return StringSubstr(FullPath, LastBackslash + 1); // Извлекаем имя файла

    return FullPath; // Если `\` не найден, возвращаем весь путь (на случай, если это просто имя файла)
}
//-------------------------------------------------------------------------------------
// Функция для поиска последнего вхождения символа в строке
int StringLastIndexOf(const string Str, const short Char)
{
    int Pos = StringLen(Str) - 1;

    while (Pos >= 0 && Str[Pos] != Char)
        Pos--;

    return Pos;
}
//-------------------------------------------------------------------------------------