Петр, ваш подход тоже не подойдет, если в одно подокно нужно накидать несколько индикаторов рисующих объекты. Когда стояла такая задача делал просто - в окне свойств переменная SubWinName - имя подокна (оно устанавливается как IndicatorShortName() в init), и переменная ObjectID, все остальное (какие значения установить в SubWinName и в ObjectID) - проблемы пользователя. По большому счету - нет абсолютно правильного метода и абсолютно надежного метода получения ID для объектов. MathRound() - нет гарантии, что не будет двух одинаковых случайных чисел. GetTickCount() - тоже не факт, что не будет одинаковых значений. Счетчик на глобальных переменных - при аварийном завершении работы терминала не произойдет сброса (хотя это не помешает правильной работе при следующем запуске терминала, просто счетчик будет сдвинут. Вообще это метод с наибольшими гарантиями.
Типичные алгоритмы рандомизаторов выдают последовательность чисел, повторяющихся через период рандомизатора. Для mql заявлено 32тыс. То есть в нашем случае можно практически гарантировать уникальность числа. GetTickCount() является перенаправлением на одноименную функцию win32 API и тоже практически гарантирует уникальность, независимо от крэшей терминала.
---
Функцию Свинозавра я бы подкорректировал следующим образом:
int GetWinNumber(){string id =GetTickCount();IndicatorShortName(id);// подмена: имя индикатора = идентификатору (номеру) копии индикатораint win=WindowFind(id);// считан номер подокна с именем идентификатора (номера) копии индикатораIndicatorShortName(ShortName);// восстановлено имя индикатораreturn(win);// возврат номера подокна}
Хотя в большинстве случаев достаточно просто FindWindow(ShortName) или просто 0. Если в заголовке отображать и основные параметры индикатора, такая конструкция ( FindWindow(ShortName) ) будет работоспособной за исключением двух случаев: когда присоединяем несколько индикаторов в одно окно и когда присоединяем два индикатора с одинаковыми параметрами в разные окна. Что в общем-то никогда не делается. Первый случай лучше обрабатывать через Свинозаврскую функцию, второй случай обработается через FindWindow корректно, объекты просто присоединятся только к одному окну.
---
Использование глобальных переменных избыточно и возникают проблемы общего доступа к ним (не в индикаторах).
Использование дополнительного файла избыточно, приводит к проблемам переносимости, совместимости и читаемости кода.
Перенос кода в функции в данном случае избыточно, код становится менее читаемым.
Типичные алгоритмы рандомизаторов выдают последовательность чисел, повторяющихся через период рандомизатора. Для mql заявлено 32тыс. То есть в нашем случае можно практически гарантировать уникальность числа. GetTickCount() является перенаправлением на одноименную функцию win32 API и тоже практически гарантирует уникальность, независимо от крэшей терминала.
Это можно проверить.
int x=MathRand();
int c=0;
int c2=0;
int c3=0;
while(!IsStopped()){
c=0;
c2=0;
c3=0;
x=MathRand();
while(!IsStopped()){
c++;
if(c==EMPTY_VALUE){
c=0;
c2++;
if(c2==EMPTY_VALUE){
c2=0;
c3++;
if(c3==EMPTY_VALUE){
Alert("Второй круг");
}
}
}
if(x==MathRand()){
if(c<10){
Alert("Oppa! "+c);
}
break;
}
}
}
У меня выскочила "Oppa!" со значением 2, т.е. через одно значение было повторение.
Хотя у себя я оставлю MathRand, меня такая вероятность ошибки в практической работе вполне устраивает, а имена объектов я хочу видеть покороче. Я с ними ещё и на графике иногда работаю.
int start(){//----int c=0;while(!IsStopped()){int x1=MathRand();int x2=MathRand();
c++;if(x1==x2){Alert("Ops! Через "+c+" раз");
c=0;}}//----return(0);}
может проще использовать в качестве постфикса в именованиях объектов имя индикатора и локальное время, когда он был инициализирован, для ручного цепляния этого должно быть достаточно, но для шаблонного не сгодится..
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Петр, ваш подход тоже не подойдет, если в одно подокно нужно накидать несколько индикаторов рисующих объекты. Когда стояла такая задача делал просто - в окне свойств переменная SubWinName - имя подокна (оно устанавливается как IndicatorShortName() в init), и переменная ObjectID, все остальное (какие значения установить в SubWinName и в ObjectID) - проблемы пользователя. По большому счету - нет абсолютно правильного метода и абсолютно надежного метода получения ID для объектов. MathRound() - нет гарантии, что не будет двух одинаковых случайных чисел. GetTickCount() - тоже не факт, что не будет одинаковых значений. Счетчик на глобальных переменных - при аварийном завершении работы терминала не произойдет сброса (хотя это не помешает правильной работе при следующем запуске терминала, просто счетчик будет сдвинут. Вообще это метод с наибольшими гарантиями.
Типичные алгоритмы рандомизаторов выдают последовательность чисел, повторяющихся через период рандомизатора. Для mql заявлено 32тыс. То есть в нашем случае можно практически гарантировать уникальность числа. GetTickCount() является перенаправлением на одноименную функцию win32 API и тоже практически гарантирует уникальность, независимо от крэшей терминала.
---
Функцию Свинозавра я бы подкорректировал следующим образом:
Хотя в большинстве случаев достаточно просто FindWindow(ShortName) или просто 0. Если в заголовке отображать и основные параметры индикатора, такая конструкция ( FindWindow(ShortName) ) будет работоспособной за исключением двух случаев: когда присоединяем несколько индикаторов в одно окно и когда присоединяем два индикатора с одинаковыми параметрами в разные окна. Что в общем-то никогда не делается. Первый случай лучше обрабатывать через Свинозаврскую функцию, второй случай обработается через FindWindow корректно, объекты просто присоединятся только к одному окну.
---
Использование глобальных переменных избыточно и возникают проблемы общего доступа к ним (не в индикаторах).
Использование дополнительного файла избыточно, приводит к проблемам переносимости, совместимости и читаемости кода.
Перенос кода в функции в данном случае избыточно, код становится менее читаемым.
Типичные алгоритмы рандомизаторов выдают последовательность чисел, повторяющихся через период рандомизатора. Для mql заявлено 32тыс. То есть в нашем случае можно практически гарантировать уникальность числа. GetTickCount() является перенаправлением на одноименную функцию win32 API и тоже практически гарантирует уникальность, независимо от крэшей терминала.
Это можно проверить.
int x=MathRand(); int c=0; int c2=0; int c3=0; while(!IsStopped()){ c=0; c2=0; c3=0; x=MathRand(); while(!IsStopped()){ c++; if(c==EMPTY_VALUE){ c=0; c2++; if(c2==EMPTY_VALUE){ c2=0; c3++; if(c3==EMPTY_VALUE){ Alert("Второй круг"); } } } if(x==MathRand()){ if(c<10){ Alert("Oppa! "+c); } break; } } }У меня выскочила "Oppa!" со значением 2, т.е. через одно значение было повторение.Это можно проверить.
У меня выскочила "Oppa!" со значением 2, т.е. через одно значение было повторение.Проверил. Да, устойчивость алгоритма -3 степень, то есть низкая. Действительно, лучше использовать GetTickCount().
Проверил. Да, устойчивость алгоритма -3 степень, то есть низкая. Действительно, лучше использовать GetTickCount().
Алгоритм проверки с ошибкой. Сейчас исправлю.
Алгоритм проверки с ошибкой. Сейчас исправлю.
Исправил.
Еще вариант:
Уточнение: -4 степень.
То есть в среднем одна ошибка на 10000 запусков.
Я за MathRand, педанты за GetTickCount() :)
может проще использовать в качестве постфикса в именованиях объектов имя индикатора и локальное время, когда он был инициализирован, для ручного цепляния этого должно быть достаточно, но для шаблонного не сгодится..