#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);
}
}