Ошибка "cannot set millisecond timer(100)"

 
Здравствуйте! У клиента при работе с моим советником возникла ошибка "cannot set millisecond timer(100)". Такое случилось впервые за всю историю советника. Изучала форум, но ответа на свой вопрос не нашла. Мне хотелось бы узнать, в чем здесь вообще может быть ошибка, то есть куда рыть, что спрашивать. Спасибо!
 
Есть очень схожая тема: cannot set millisecond timer (500)
cannot set millisecond timer (500)
cannot set millisecond timer (500)
  • www.mql5.com
Здравствуйте, клиент прислал лог файл, в котором я увидел такую запись cannot set millisecond timer (500) что она значит? и почему...
 
Maria Baburina:
Здравствуйте! У клиента при работе с моим советником возникла ошибка "cannot set millisecond timer(100)". Такое случилось впервые за всю историю советника. Изучала форум, но ответа на свой вопрос не нашла. Мне хотелось бы узнать, в чем здесь вообще может быть ошибка, то есть куда рыть, что спрашивать. Спасибо!
    Я добавил в OnInit():

      int err=-1;
      int count=5;
      {while((err!=0)&&(count>0))
      {
         ResetLastError();
         EventSetMillisecondTimer(MSTimerSet);                    //Установка таймера XXX миллисекунд
         err=GetLastError();
         Print("EventSetMillisecondTimer n=",count," err >>",err);
         {if(err!=0){Sleep(50);}}
      }}//while((err!=0)&&(count>0))

 
Yury Kirillov:
    Я добавил в OnInit():

      int err=-1;
      int count=5;
      {while((err!=0)&&(count>0))
      {
         ResetLastError();
         EventSetMillisecondTimer(MSTimerSet);                    //Установка таймера XXX миллисекунд
         err=GetLastError();
         Print("EventSetMillisecondTimer n=",count," err >>",err);
         {if(err!=0){Sleep(50);}}
      }}//while((err!=0)&&(count>0))

Спасибо!))
 

Тогда уж так:

   int error=-1;
   int counter=1;
   do
   {
      ResetLastError();
      EventSetMillisecondTimer(Timer);
      error=GetLastError();
      Print("EventSetMillisecondTimer. Attempt=",counter," Error=",error);
      if(error!=0) Sleep(1000);
      counter++;
   }
   while(error!=0 && !IsStopped());
 
Dmitriy Falkov:

Тогда уж так:

   int error=-1;
   int counter=1;
   do
   {
   }
   while(error!=0 && !IsStopped());
Бесконечный цикл? Ну-ну.
 

Тут смысл смотреть при запуске проинициализирован ли таймер. Из цикла можно выйти при удачной попытке (внутри код ошибки обновляется) или по отмене. Выходить из цикла и идти в нерабочий теймер бессмысленно, так как таймер не работает. Поэтому идет перебор пока не запустится таймер. При желании можно добавить самоубийство робота при ххх неудачной попытке.

Это не бесконечный цикл. В нем есть условие выхода. 

 
Dmitriy Falkov:

Тут смысл смотреть при запуске проинициализирован ли таймер. Из цикла можно выйти при удачной попытке (внутри код ошибки обновляется) или по отмене. Выходить из цикла и идти в нерабочий теймер бессмысленно, так как таймер не работает. Поэтому идет перебор пока не запустится таймер. При желании можно добавить самоубийство робота при ххх неудачной попытке.

Это не бесконечный цикл. В нем есть условие выхода. 

В цикле нет ничего, что решало бы проблему (по сути, MQL и не предоставляет такой возможности, т.к. это внутренняя ошибка терминала и фиксить её должна MQ). Без исправления ошибки получается бесконечный цикл. Наличие IsStopped ничего не решает, т.к. клиент может быть на VPS без пользователя. Нерабочий таймер - меньшая проблема, чем зацикленный скрипт - ведь можно предусмотреть работу по другим событиям, не только по таймеру.
 

Давайте объясню как я вижу проблему.

Я подключаюсь к VPS через mstsc. Запускаю терминал, а в нем запускаю робота, который работает по таймеру. Таймер может выдать ошибку по неизвестным причинам. А может и не выдать, а запуститься.

Этот цикл пытается установить таймер, пока он не запустится и не выдаст ошибку "0" (такая вероятность сохраняется, и можно запустить его с n-ной попытки). Как только это происходит, цикл завершается и программа переходит в таймер. Еще раз повторю: таймер работает, но по каким-то причинам может выдать ошибку и пойти дальше. Без данного цикла на стадии инициализации можно получить ошибку и перейти в нерабочий таймер, что неприемлемо.

Тут я вижу: прошла инициализация таймера или нет и принимаю решение, что делать дальше. Понятно, что я не буду запускать программу и оставлять её на самотек не убедившись, что она хотя бы запустилась (прошла стадию инициализации). Как только таймер запущен, он уже работает без проблем, и программу можно оставить отключившись от VPS.

 

В общем, я обратил внимание, что хороший стиль программирования предполагает такой код условия, что цикл 100% завершится, и он был намечен в исходном варианте, где счетчик судя по всему должен был уменьшаться на каждом проходе, но видимо оператор декремента съелся ;-). Если потенциально бесконечный цикл попадет к какому-нибудь пользователю, который не удосужится его проконтролировать, то программа будет точно также нерабочая. По событию тика разве нельзя проверять, был ли создан таймер, и если нет, то пытаться его создать?

В принципе, все это обсуждение - ни к чему, потому что налицо баг терминала. К сожалению, от MQ нет никаких разъяснений.

 
Yury kirillov :
    I added to OnInit ():

       int err = - 1 ; int count = 5 ;       { while ((err! = 0 ) && (count> 0 ))       { ResetLastError (); EventSetMillisecondTimer (MSTimerSet);                     // Set the timer XXX milliseconds          err = GetLastError (); Print ( "EventSetMillisecondTimer n =" , count, "err >>" , err);          { if (err! = 0 ) { Sleep ( 50 );}}       }}
      


        
        

        

// while ((err! = 0) && (count> 0))

Привет ребята,

Я использую функцию iCustom () в своем советнике, и когда я прикрепляю ее к графику, «не могу установить таймер (1)», показанный на вкладке эксперта!

Я добавил этот код в функцию OnInit (), но проблема все еще не решена!

Пожалуйста, помогите мне!

Спасибо за ваш отзыв заранее!

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