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

 

Подскажите как получить в собственном коде полный путь к своему же ex5 ? 

1) MQLInfoString(__FILE__) пробывал но он возвращает имя исходного mq5 c которого был скомпилен сам ex5 и я так понмаю этот путь зашит в сам ex5. И если ex5 переименовать то имя не соответсвует переименованному ex5. 
2)  MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME

Есть еще альтернативы прочесть свое имя ex5 и желательно с полным путем 

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
Для облегчения отладки и получения информации о работе mql5-программы введены специальные константы-макросы, значения которых устанавливается в...
 

а ну и раз такая петрушка то и полный размер файла ex5 как прочесть ? вот так ? будет ли он одинакм в разных операционных системах ? 

void ReadFileSize()
{
   // Абсолютный путь текущего компилируемого файла (.mq5)
   string full_path = MQLInfoString(__PATH__);
   
   // Заменяем расширение на ".ex5"
   string ex5_path = StringSubstr(full_path, 0, StringLen(full_path) - 4) + ".ex5";

   // Пытаемся открыть файл .ex5 в бинарном режиме
   int file_handle = FileOpen(ex5_path, FILE_READ | FILE_BIN);
   if (file_handle != INVALID_HANDLE)
   {
      // Получаем размер файла
      int file_size = FileSize(file_handle);

      // Закрываем файл
      FileClose(file_handle);


      // Выводим размер файла
      Print("Размер файла .ex5: ", file_size, " байт");
   }
   else
   {
      Print("Ошибка открытия файла .ex5: ", GetLastError());
   }
}
И все равно 

__PATH__

Абсолютный путь к текущему компилируемому файлу


а не к ex5

 
Alex Renko:

Подскажите как получить в собственном коде полный путь к своему же ex5 ?

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

string GetName( const long Chart = 0 )
{
  MqlParam Params[];
  string Names[];
  
  return(EXPERT::Parameters(Chart, Params, Names) ? Params[0].string_value : NULL);
//  return(MQLInfoString(MQL_PROGRAM_PATH));
}

int OnInit()
{
  Print(GetName()); // Experts\HelloWorld.ex5
  
  return(INIT_FAILED);
}

 
fxsaber #:

Спасибо за пекрасную библиотеку! ) Потестю

 
fxsaber #:
Print(GetName());

с советником ок ) 

А с нидикатором как получить в собственном коде полный путь к своему же ex5 и собственное имя ex5 ? ) 

Вот так вроде заработало

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

string GetIndicatorName()
{
  string FullPath = MQLInfoString(MQL_PROGRAM_PATH); // Получаем полный путь к индикатору
  int StartPos = StringFind(FullPath, "\\Indicators\\"); // Находим позицию папки Indicators

  if (StartPos >= 0)
  {
    // Обрезаем путь, чтобы получить имя файла .ex5
    return StringSubstr(FullPath, StartPos + 12);
  }

  return NULL;
}

int OnInit()
{
  Print(GetIndicatorName()); // Indicators\MyIndicator.ex5
  
  return(INIT_SUCCEEDED);
}
 
Alex Renko #:

А с нидикатором как получить в собственном коде полный путь к своему же ex5 и собственное имя ex5 ? ) 

В MT5 путь к EX5 не зависит от типа программы (скрипт, индикатор и т.д.). Поэтому индикатор может запускаться, например, из Scripts-папки.

MQL_PROGRAM_PATH
MQL_PROGRAM_NAME
 
Alex Renko #:
Вот так вроде заработало

1. Открываем в редакторе ATR.mq5

2. Сохраняем как ATR_test.mq5,

    добавляем в OnInit:

   Print(MQLInfoString(MQL_PROGRAM_PATH));
   Print(MQLInfoString(MQL_PROGRAM_NAME));

3. Компилируем

4. Переименовываем ATR_test.ex5 в ATR_test_123456.ex5

5. Добавляем  ATR_test_123456.ex5 на график и получаем:

2025.01.30 14:11:59.765 ATR_test_123456 (AUDCAD,H1)     C:\Program Files\RoboForex - MetaTrader 5\MQL5\Indicators\Examples\ATR_test_123456.ex5
2025.01.30 14:11:59.765 ATR_test_123456 (AUDCAD,H1)     ATR_test_123456
 
fxsaber #:

В MT5 путь к EX5 не зависит от типа программы (скрипт, индикатор и т.д.). Поэтому индикатор может запускаться, например, из Scripts-папки.

Пасиб! Учту! Проверил - запустил индикатор из папки EXPERTS - возвращает четко имя и путь! 


2025.01.30 13:19:42.809 TestFileNameInd (AUDNZD,M5) Full Path: C:\Program Files\RoboForex MT5 Terminal\MQL5\Experts\TestFileNameInd.ex5

2025.01.30 13:19:42.809 TestFileNameInd (AUDNZD,M5) Extracted File Name: TestFileNameInd.ex5


переименовал индикатор в  TestFileNameInd2.ex5

2025.01.30 13:22:00.924 TestFileNameInd2 (AUDNZD,M5) Full Path: C:\Program Files\RoboForex MT5 Terminal\MQL5\Experts\TestFileNameInd2.ex5

2025.01.30 13:22:00.924 TestFileNameInd2 (AUDNZD,M5) Extracted File Name: TestFileNameInd2.ex5



Еще раз брагодарю вас за библиотеку!


 
trader6_1 #:

1. Открываем в редакторе ATR.mq5

2. Сохраняем как ATR_test.mq5,

    добавляем в OnInit:

3. Компилируем

4. Переименовываем ATR_test.ex5 в ATR_test_123456.ex5

5. Добавляем  ATR_test_123456.ex5 на график и получаем:

 Print(MQLInfoString(MQL_PROGRAM_PATH));
 Print(MQLInfoString(MQL_PROGRAM_NAME));


Это не будет корректно работать ! 
Вот решение :

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003
int OnInit()
{
  Print(GetIndicatorName()); // Indicators\MyIndicator.ex5
  
  return(INIT_SUCCEEDED);
}

//-------------------------------------------------------------------------------------
string GetExpertName( const long Chart = 0 ) // Возвращает имя робота ex5 
                                     
{
  MqlParam Params[];
  string Names[];
  
  return(EXPERT::Parameters(Chart, Params, Names) ? Params[0].string_value : NULL);
//  return(MQLInfoString(MQL_PROGRAM_PATH));
}
//-------------------------------------------------------------------------------------
string GetIndicatorName()
{
  string FullPath = MQLInfoString(MQL_PROGRAM_PATH); // Получаем полный путь к индикатору
  Print("Full Path: ", FullPath); // Выводим полный путь

  int StartPos = StringFind(FullPath, "\\"); // Ищем последний слэш
  if (StartPos >= 0)
  {
    int LastBackslash = StringLastIndexOf(FullPath, "\\"); // Находим последнее вхождение "\"
    if (LastBackslash >= 0)
    {
      string FileName = StringSubstr(FullPath, LastBackslash + 1);
      Print("Extracted File Name: ", FileName); // Выводим только имя файла
      return FileName;
    }
  }

  return "";
}

// Функция для поиска последнего вхождения символа в строке
int StringLastIndexOf(string text, string search)
{
  int pos = -1;
  int i = 0;
  while (true)
  {
    int newPos = StringFind(text, search, i);
    if (newPos == -1) break;
    pos = newPos;
    i = newPos + 1;
  }
  return pos;
}
//-------------------------------------------------------------------------------------
 
Так дешевле.
int StringLastIndexOf( const string Str, const short Char )
{
  int Pos = ::StringLen(Str) - 1;

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

  return(Pos);
}


int LastBackslash = StringLastIndexOf(FullPath, '\\'); // Находим последнее вхождение "\"
 
trader6_1 #:

1. Открываем в редакторе ATR.mq5

2. Сохраняем как ATR_test.mq5,

    добавляем в OnInit:

3. Компилируем

4. Переименовываем ATR_test.ex5 в ATR_test_123456.ex5

5. Добавляем  ATR_test_123456.ex5 на график и получаем:

т.е этого достатотчно?

 Print(MQLInfoString(MQL_PROGRAM_PATH));
 Print(MQLInfoString(MQL_PROGRAM_NAME));


Скомпилил как Test.mq5

Переименовал  Test.ex5 в 1.ex5

2025.01.30 13:43:05.195 1 (AUDNZD,M5)   C:\Program Files\RoboForex MT5 Terminal\MQL5\Indicators\1.ex5
2025.01.30 13:43:05.195 1 (AUDNZD,M5)   1

переименовал в 2.ex5

2025.01.30 13:44:34.411 2 (AUDNZD,M5)   C:\Program Files\RoboForex MT5 Terminal\MQL5\Indicators\2.ex5
2025.01.30 13:44:34.411 2 (AUDNZD,M5)   2