Как правильно удалять объекты на графике - страница 4

 

Петр, ваш подход тоже не подойдет, если в одно подокно нужно накидать несколько индикаторов рисующих объекты. Когда стояла такая задача делал просто - в окне свойств переменная 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 корректно, объекты просто присоединятся только к одному окну.

---

Использование глобальных переменных избыточно и возникают проблемы общего доступа к ним (не в индикаторах).

Использование дополнительного файла избыточно, приводит к проблемам переносимости, совместимости и читаемости кода.

Перенос кода в функции в данном случае избыточно, код становится менее читаемым.

 
gip писал(а) >>

Типичные алгоритмы рандомизаторов выдают последовательность чисел, повторяющихся через период рандомизатора. Для 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, т.е. через одно значение было повторение.
 
Integer >>:

Это можно проверить.

У меня выскочила "Oppa!" со значением 2, т.е. через одно значение было повторение.

Проверил. Да, устойчивость алгоритма -3 степень, то есть низкая. Действительно, лучше использовать  GetTickCount().

 
gip писал(а) >>

Проверил. Да, устойчивость алгоритма -3 степень, то есть низкая. Действительно, лучше использовать GetTickCount().

Алгоритм проверки с ошибкой. Сейчас исправлю.

 
Хотя у себя я оставлю MathRand, меня такая вероятность ошибки в практической работе вполне устраивает, а имена объектов я хочу видеть покороче. Я с ними ещё и на графике иногда работаю.
 
Integer писал(а) >>

Алгоритм проверки с ошибкой. Сейчас исправлю.

Исправил.

 

Еще вариант:

int start()
  {
//----

   int c=0;
      while(!IsStopped()){
         int x1=MathRand();
         int x2=MathRand();      
         c++;
            if(x1==x2){
               Alert("Ops!  Через "+c+" раз");
               c=0;
            }
      }
//----
   return(0);
  }
 

Уточнение: -4 степень.

int sum = 0;
for(int i = 0; i < 50000; i++)
{
   int x = MathRand();
   for(int k = 1; k < 66000; k++)
   {
      if (MathRand() == x)
      {
         sum += k;
         break;
      }
   }
}
Alert(sum/50000);

То есть в среднем одна ошибка на 10000 запусков.

Я за MathRand, педанты за GetTickCount() :)

 

может проще использовать в качестве постфикса в именованиях объектов имя индикатора и локальное время, когда он был инициализирован, для ручного цепляния этого должно быть достаточно, но для шаблонного не сгодится..

Причина обращения: