Программа MQL неожиданно завершилась

#mql4

#mql4

Вопрос:

Я новичок в языке MQL, поэтому, пожалуйста, поправьте меня, если я описал что-то неправильно.

Я создал скрипт в редакторе сценариев для автоматического размещения заказов. Программа никогда не должна быть остановлена, кроме как путем завершения вручную. Мой код выглядит так:

 void onStart()
{      
    While(true)
    {
        Sleep(10000);
        MakeOrder(....);//of course actual code is much more complicated
    }
}
  

Единственными предустановленными функциями, которые я использую, являются торговые функции, математические функции и функции времени.

Код работает хорошо в большинстве случаев, которые могут продолжаться по крайней мере в течение 48 часов, но иногда он может неожиданно перестать сообщать о причине 4 deinit (которая является тем же кодом выхода, если я нажимаю stop кнопку при отладке) в течение одного часа после запуска. Похоже, что в MQL нет try...catch модуля, и получение ошибки в некоторых строках кода не остановит его. Интересно, что могло произойти за завершением? Или как я могу это проигнорировать, чтобы, по крайней мере, программа могла автоматически перезапускаться?

Ответ №1:

Вам следует проверить функции OnTimer и OnTick.

И рекомендуется использовать isStopped() в цикле While.

 void onStart()
{      
    while(!IsStopped())
    {
        Sleep(10000);
        MakeOrder(....);//of course actual code is much more complicated
    }
}
  

Ответ №2:

Причина неинициализации 4 : диаграмма была закрыта. В MT4 вам всегда нужно запускать скрипт на графике (окне), поэтому, конечно, если этот график по какой-либо причине закрыт, ваш скрипт завершит работу. Вы ничего не можете сделать, чтобы предотвратить это. Как и предлагалось, добавление isStopped() завершит ваш цикл (и сценарий), поэтому вы можете добавить некоторый код после цикла, чтобы уведомить вас о завершении работы скрипта.

Например :

 void OnStart()
  {
//---
   while(!IsStopped())
     {
      Sleep(10000);
      //MakeOrder(....);//of course actual code is much more complicated
     }
//---
   if(UninitializeReason()==REASON_CHARTCLOSE)
     {
      string msg="Chart is closed and the script is terminated.";
      Alert(msg);
      SendNotification(msg);
     }
  }