а ну и раз такая петрушка то и полный размер файла 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
Подскажите как получить в собственном коде полный путь к своему же 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); }
с советником ок )
А с нидикатором как получить в собственном коде полный путь к своему же 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); }
Вот так вроде заработало
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
В 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
Еще раз брагодарю вас за библиотеку!
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, '\\'); // Находим последнее вхождение "\"
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
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите как получить в собственном коде полный путь к своему же ex5 ?
1) MQLInfoString(__FILE__) пробывал но он возвращает имя исходного mq5 c которого был скомпилен сам ex5 и я так понмаю этот путь зашит в сам ex5. И если ex5 переименовать то имя не соответсвует переименованному ex5.
2) MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME
Есть еще альтернативы прочесть свое имя ex5 и желательно с полным путем