Программа MQL неожиданно прервана - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Причина деинициализации 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);
     }
  }
1 голос
/ 14 апреля 2019

Вы должны проверить функции OnTimer и OnTick .

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

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