Ошибка "Loop detected"

 
Ошибка "Loop detected"
При выполнении цикла возникает ошибка "Loop detected", после которой работа эксперта прекращается. Сообщение об ошибке выводится в журнал. Цикл не бесконечный, сообщение появляется на различных итерациях (от 3000 до 5000). В чем проблема?
 
Loop detected - это не ошибка
При работе эксперта мы встроили проверку на количество итераций (кол-во исполненных внутренних инструкций P-кода). Если произведено более 300000 итераций, то виртуальная машина исполнения кода считает что попали в бесконечный цикл и прекращает выполнение принудительно.

Скорее всего значение в 300000 итераций маловато. Мы увеличим значение по умолчанию и добавим дополнительные функции по изменению этого предела прямо из кода эксперта.
 
Но в моем цикле меньше, чем 300000 итераций
В цикле максимум Bars*10 итераций. Т.е. два вложенных цикла: один for i=1 to bars, вложенный в него for i1=1 to 10. !!!
 
итерации
К сожалению, Вы путаете "счетчики своих циклов" и количество выполняемых инструкций скомпилированного 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", если же он пустой, то все Ок. Это в новой версии МТ.
 
используйте 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 млн инструкций в секунду.
Причина обращения: