!IsStopped() в пользовательских индикаторах - страница 2

 
paladin800:

Такие штуки чем проще надо делать:

#define NCHECK 1000
//...

for(int i = limit; i < rates_total && ((i % NCHECK) || !IsStopped()); i++)
{
   //...
}


 
TheXpert:

Такие штуки чем проще надо делать:


Сделал так как написано (#define NCHECK 1000 вставил перед OnInit), только компилятор пишет "expression not boolean" с жёлтым треугольником и курсор возле %. А с bool компилятор не ругается:

for(int i = limit; i < rates_total && (bool(i % NCHECK) || !IsStopped()); i++)

 
TheXpert:Такие штуки чем проще надо делать:

чет обсуждение в сторону ушло, но раз проще, так проще:

void OnStart(){
   for(int i=0;true;i++){
      Comment("i= ",i);
      Sleep(1);
   }
}
первый раз в жизни вижу такую конструкцию, выглядит чудно, но работает, даже !IsStopped() не нужен - исправно, без тормозов выгружается правым кликом мыши
 

Таки заставили.

Результаты удивили :)

   uint start = 0;
   uint differ = 1;
   
   start = GetTickCount();
   for (int i = 0; i < 1000000000; i++)
   {
      double v = MathExp((0.01424));
   }
   differ = GetTickCount() - start;
   Print("Without IsStopped -- ", differ);

   start = GetTickCount();
   for (int i = 0; (i < 1000000000) && !IsStopped(); i++)
   {
      double v = MathExp((0.01424));
   }
   differ = GetTickCount() - start;
   Print("With IsStopped -- ", differ);

   start = GetTickCount();
   for (int i = 0; (i < 1000000000) && (i % 1000 || !IsStopped()); i++)
   {
      double v = MathExp((0.01424));
   }
   differ = GetTickCount() - start;
   Print("With IsStopped 2 -- ", differ);
TestStopped (EURUSD,M15)    With IsStopped 2 -- 6848 // вот эта штука удивила сильно. может таки || неправильно работает?
TestStopped (EURUSD,M15)    With IsStopped -- 3791
TestStopped (EURUSD,M15)    Without IsStopped -- 3619

Так что думайте сами, решайте сами, я использую дальше, как и использовал, !IsStopped() без премудростей.

Если обнаружите ошибки, пишите.

 
TheXpert:

Таки заставили.

Результаты удивили :)

Ничего удивительного. Вы же добавили дорогую операцию постоянного получения остатка от деления в цикле. А это по ресурсам сопоставимо с исполнением тела цикла.

А IsStopped на самом деле в коде превращается в тройку ассемблерных операций вида, что работает очень быстро. То есть, никакого вызова функции нет.

mov    eax, _StoppedFlag
cmp    eax,0
jne    Exit_label


 
IgorM:

чет обсуждение в сторону ушло, но раз проще, так проще:

первый раз в жизни вижу такую конструкцию, выглядит чудно, но работает, даже !IsStopped() не нужен - исправно, без тормозов выгружается правым кликом мыши

Дело в том, что на некоторых системных функциях мы принудительно проверяем флаг остановки и выходим. В данном случае автоматическая проверка сработала на Sleep().

Без такого прозрачного механизма многие программы бы очень долго выгружались или попросту зависали.

Документация по MQL5: Предопределенные переменные / _StopFlag
Документация по MQL5: Предопределенные переменные / _StopFlag
  • www.mql5.com
Предопределенные переменные / _StopFlag - Документация по MQL5
 
papaklass:
А есть возможность посмотреть где-нибудь классификацию операций по "дороговизне"?

Померять.

Renat:

Ничего удивительного. Вы же добавили дорогую операцию постоянного получения остатка от деления в цикле. А это по ресурсам сопоставимо с исполнением тела цикла.

А IsStopped на самом деле в коде превращается в тройку ассемблерных операций вида, что работает очень быстро. То есть, никакого вызова функции нет.

Угу, примерно такие выводы из теста я и сделал. И честно говоря подозревал, что IsStopped просто обязана быть быстрой. Спасибо за подтверждение.