Ну тогда финальная версия для индикаторов и экспертов что возвращает корректно имя ex5 даже переименнованного :
string GetFileNameFromPath(string FullPath)
{
int LastBackslash = StringLastIndexOf(FullPath, '\\'); // Находим последнее вхождение "\"if (LastBackslash >= 0)
return StringSubstr(FullPath, LastBackslash + 1); // Извлекаем имя файлаreturn FullPath; // Если `\` не найден, возвращаем весь путь (на случай, если это просто имя файла)
}
// Функция для поиска последнего вхождения символа в строкеint StringLastIndexOf(conststring Str, constshort Char)
{
int Pos = StringLen(Str) - 1;
while (Pos >= 0 && Str[Pos] != Char)
Pos--;
return Pos;
}
voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(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 accuracyIndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT);
//--- name for DataWindowIndicatorSetString(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 и компилим:
voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(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 accuracyIndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT);
//--- name for DataWindowIndicatorSetString(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));
}
Короче это баг который не пофиксят. А именно в индикаторах если в 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 pathstring 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(conststring Str, constshort Char)
{
int Pos = StringLen(Str) - 1;
while (Pos >= 0 && Str[Pos] != Char)
Pos--;
return Pos;
}
//-------------------------------------------------------------------------------------
Ну тогда финальная версия для индикаторов и экспертов что возвращает корректно имя ex5 даже переименнованного :
1 (AUDNZD,M5) Extracted File Name: 1.ex5
переименовал 1.ex5 в 2.ex5 без перекомпиляции:
2 (AUDNZD,M5) Extracted File Name: 2.ex5
2) MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME
первый мой пост прочтите оно у меня коряво работало...
INDICATOR_SHORTNAME и имя файла это не одно и то же. Поэтому нет!
2) MQLInfoString(MQL_PROGRAM_NAME) тоже пробывал - возвращает тоже самое что INDICATOR_SHORTNAME
Не должно быть так.
а тут тогда как ? почему оно коряво через раз работает ? первы мой пост прочтите
MQL_PROGRAM_NAME всегда находится в конце MQL_PROGRAM_PATH. Иначе - баг. Если есть код воспроизведения бага, поделитесь для багрепорта.
Не должно быть так.
MQL_PROGRAM_NAME всегда находится в конце MQL_PROGRAM_PATH. Иначе - баг. Если есть код воспроизведения бага, поделитесь для багрепорта.
та я вот тестирую сейчас все работает... щас поищу почему не работало... гдето был кодик... минуту
Берем стандартный Accelerator.mq5
Меняем OnInit на код:
Сохраняем как Accelerator1.mq5 и компилим
Делаем все тоже самое для Accelerator2.mq5 и компилим:
только меняем имя
Проверяем принты двух разных индиктаоров:
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)
MQLInfoString(MQL_PROGRAM_NAME)то она будет принимать значение INDICATOR_SHORTNAME.
Для тех кому важно проверять какое имя именно юзает юзер на своей стороне вами скомпиленное или декампил и что важно переименован ли ex5 или был ли взломан и с какого именно mq5 он компилился вот финальный код: