Loop detected - это не ошибка
При работе эксперта мы встроили проверку на количество итераций (кол-во исполненных внутренних инструкций P-кода). Если произведено более 300000 итераций, то виртуальная машина исполнения кода считает что попали в бесконечный цикл и прекращает выполнение принудительно.
Скорее всего значение в 300000 итераций маловато. Мы увеличим значение по умолчанию и добавим дополнительные функции по изменению этого предела прямо из кода эксперта.
При работе эксперта мы встроили проверку на количество итераций (кол-во исполненных внутренних инструкций P-кода). Если произведено более 300000 итераций, то виртуальная машина исполнения кода считает что попали в бесконечный цикл и прекращает выполнение принудительно.
Скорее всего значение в 300000 итераций маловато. Мы увеличим значение по умолчанию и добавим дополнительные функции по изменению этого предела прямо из кода эксперта.
итерации
К сожалению, Вы путаете "счетчики своих циклов" и количество выполняемых инструкций скомпилированного P-кода.
Ведь каждая команда языка высокого уровня компилируется в набор инструкций более низкого порядка.
Наш совет:
1) скачайте новую версию программы
с пределом в 1 000 000 итераций:
https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5setup.exe?utm_campaign=MQL5.community
2) пересмотрите весь код - вероятно Вы выполняете в нем очень много лишних вычислений. Оптимизируйте его.
К сожалению, Вы путаете "счетчики своих циклов" и количество выполняемых инструкций скомпилированного P-кода.
Ведь каждая команда языка высокого уровня компилируется в набор инструкций более низкого порядка.
Наш совет:
1) скачайте новую версию программы
с пределом в 1 000 000 итераций:
https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5setup.exe?utm_campaign=MQL5.community
2) пересмотрите весь код - вероятно Вы выполняете в нем очень много лишних вычислений. Оптимизируйте его.
Супер оптимизированный код
А вот и супер-сверх оптимизированный код:
//*****************
Variable: i(0), i1(0);
Define: nExit(0);
If nExit = 1 Then
Exit;
nExit = 1;
For i=2 to 6000
{
For i1=1 to 10
{
nExit=1;
//Print(i, " ", i1);
};
};
Print("END");
//******************
Если во вложенном цикле что-либо выполняется, то получаю сообщение "Loop detected", если же он пустой, то все Ок. Это в новой версии МТ.
А вот и супер-сверх оптимизированный код:
//*****************
Variable: i(0), i1(0);
Define: nExit(0);
If nExit = 1 Then
Exit;
nExit = 1;
For i=2 to 6000
{
For i1=1 to 10
{
nExit=1;
//Print(i, " ", i1);
};
};
Print("END");
//******************
Если во вложенном цикле что-либо выполняется, то получаю сообщение "Loop detected", если же он пустой, то все Ок. Это в новой версии МТ.
Супер оптимизированный код
А вот и супер-сверх оптимизированный код:
//*****************
Variable: i(0), i1(0);
Define: nExit(0);
If nExit = 1 Then
Exit;
nExit = 1;
For i=2 to 6000
{
For i1=1 to 10
{
nExit=1;
//Print(i, " ", i1);
};
};
Print("END");
//******************
Если во вложенном цикле что-либо выполняется, то получаю сообщение "Loop detected", если же он пустой, то все Ок. Это в новой версии МТ.
А вот и супер-сверх оптимизированный код:
//*****************
Variable: i(0), i1(0);
Define: nExit(0);
If nExit = 1 Then
Exit;
nExit = 1;
For i=2 to 6000
{
For i1=1 to 10
{
nExit=1;
//Print(i, " ", i1);
};
};
Print("END");
//******************
Если во вложенном цикле что-либо выполняется, то получаю сообщение "Loop detected", если же он пустой, то все Ок. Это в новой версии МТ.
используйте SetLoopCount(0);
Скачайте новую версию терминала MetaTrader 2.25 и используйте команду SetLoopCount(0); для отключения контроля зацикленности.
Но также обращаем Ваше внимание на то, что теперь также добавлен новый механизм контроля зацикленности по времени исполнения. Если эксперт тратит более 1 секунды (1000ms), то
он принудительно прерывается.
Почему? Дело в том, что при затратах более одной секунды (и процессор грузится на 100%), эксперт полностью тормозит работу терминала.
Пример зацикленного кода:
SetLoopCount(0); while(1) {};
на P4-1800 выдает следующее:
loop detected in 'test' (1016 ms, 4521984 instructions)
Исполнено около 4.5 млн инструкций в секунду.
Скачайте новую версию терминала MetaTrader 2.25 и используйте команду SetLoopCount(0); для отключения контроля зацикленности.
Но также обращаем Ваше внимание на то, что теперь также добавлен новый механизм контроля зацикленности по времени исполнения. Если эксперт тратит более 1 секунды (1000ms), то
он принудительно прерывается.
Почему? Дело в том, что при затратах более одной секунды (и процессор грузится на 100%), эксперт полностью тормозит работу терминала.
Пример зацикленного кода:
SetLoopCount(0); while(1) {};
на P4-1800 выдает следующее:
loop detected in 'test' (1016 ms, 4521984 instructions)
Исполнено около 4.5 млн инструкций в секунду.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
При выполнении цикла возникает ошибка "Loop detected", после которой работа эксперта прекращается. Сообщение об ошибке выводится в журнал. Цикл не бесконечный, сообщение появляется на различных итерациях (от 3000 до 5000). В чем проблема?