Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен OpenCL? MQL5 предоставляет такую возможность!
Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:06 
admoon:

 Вопрос возник при отладке, в результате появилась эта 

Программа:

   {
  int i;
//---
    int co=0; 
  for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Результат (арлеты): 

2016.05.30 00:45:14.064 1 (EURUSD,H1)   11
2016.05.30 01:10:35.972 1 (EURUSD,H1)   10

........... и т.д. до 1.

 2016.05.30 00:45:14.064        1 (EURUSD,H1)   1

Правило:  Если выражение истинно, то выполняется оператор1.

В программе: оператор1 выполняется ВСЕГДА.
Так что же такое оператор if() в MQL5 и MQL4 на самом деле, кто знает? Объясните  пожалуйста мне, бестолковому. 



Файлы:
1.mq5 2 kb
Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:06  
Karputov Vladimir:

Просто не нужно писать всё в одну строчку и не стоит жалеть фигурных скобок:

   int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(w==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 и тогда сразу всё визуально станет понятно.
А понятно становится то, что переменная "w" вообще непонятно откуда взялась и какое имеет значение.

Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:08  

Artyom Trishkin:

admoon:

 Вопрос возник при отладке, в результате появилась эта 

Программа:

Результат (арлеты):
........... и т.д. до 1.
Правило:  Если выражение истинно, то выполняется оператор1.
В программе: оператор1 выполняется ВСЕГДА.
Так что же такое оператор if() в MQL5 и MQL4 на самом деле, кто знает? Объясните  пожалуйста мне, бестолковому.  

У вас так: если w равно 10, то выдать алерт. А w у вас глобальная, и равна десяти. И что не так по-вашему?


Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:09  
Artyom Trishkin:
У вас так: если w равно 10, то выдать алерт. А w у вас глобальная, и равна десяти. И что не так по-вашему?
admoon:
По моему if()должно сработать только один раз, при истинности условия в скобках. А по факту срабатывает при каждой проверке условия и все выражения в {} выполняются на каждом шаге и жуют машинное время. И причем здесь глобальность W? Просто удобнее менять шаг из терминала чем из редактора. Наверное, надо пояснить подробнее. При по шаговой проверке индикатора обнаружил  вот такой дребезг срабатываний в подпрограмме стоящей за if{} и в котором нет никакого w. А код что написан выше, это уже упрощение для пояснения сути вопроса. ПОЧЕМУ переменная CO выросла за цикл от 0 до 10? Почему Alert срабатывает на каждом шаге? Из-за глобальности  w ?!

 

Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:10  
admoon:
 

Комбинатор:

iClose + iBarShift. Тестер в МТ4 следит за корректностью текущей цены только тестируемого инструмента, корректность данных других инструментов вы должны обеспечить сами

И вряд ли у вас получится эффективно арбитражить в МТ4

Andrey Barinov:

Судя по всему у вас опечатка в коде, и хотели написать вот так:

   От ПЕРЕМЕНЫ мест слагаемых сумма не меняется. А суть вопроса в следующем: Почему переменная СО выросла за цикл от 0 до 11? Почему Alert срабатывает на каждом шаге? В коде ошибок нет.
Vladimir Karputov
Модератор
45448
Vladimir Karputov 2016.05.30 14:11  
Artyom Trishkin:


admoon:
   От ПЕРЕМЕНЫ мест слагаемых сумма не меняется. А суть вопроса в следующем: Почему переменная СО выросла за цикл от 0 до 11? Почему Alert срабатывает на каждом шаге? В коде ошибок нет.

Ещё раз повторю: в коде ошибок нет, но в логике - есть. У вас в вашей логике записано: если равна 10, то выдать алерт и увеличить co на единицу. Переменная задана глобальной, равна 10, и нигде не меняется в цикле. Именно потому условие всегда истинно.

ЗЫ. Не потому, что w глобальная, а потому, что ей присвоено значение 10. И в цикле проверяется значение 10

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий