Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 495

 

По первому случаю разобрался - поставил в скобки по два сравнения и не ругается - неужели была логическая ошибка - т.е. результаты сравнения могла замениться из-за "или"?

Остался открытый вопрос со вторым выражением - что там не так - есть идеи?

 
-Aleks-:

По первому случаю разобрался - поставил в скобки по два сравнения и не ругается - неужели была логическая ошибка - т.е. результаты сравнения могла замениться из-за "или"?

Остался открытый вопрос со вторым выражением - что там не так - есть идеи?

Надо помнить что проверка условия в новом mql4 производится не полностью. То-есть в условии

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

если Low[x] не больше PriceBuy то дальше проверка проводится не будет. Об этом и сообщается в описании ошибки. Соответственно если первую пару заключить в скобки, то при невыполнении этой пары будет проверена вторая пара условий.

Второй вопрос.

for(calc_day;calc_day>0; calc_day--)

Чему равно calc_day??? Может быть меньше нуля? Компилятор не знает что заложено в логике... Вот и предупреждает о возможном не эффективном цикле.

 
Alexey Viktorov:

Надо помнить что проверка условия в новом mql4 производится не полностью. То-есть в условии

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

если Low[x] не больше PriceBuy то дальше проверка проводится не будет. Об этом и сообщается в описании ошибки. Соответственно если первую пару заключить в скобки, то при невыполнении этой пары будет проверена вторая пара условий.

Спасибо за ответ!

Удивлен - так как визуально логика отрабатывала всегда верно, хммм...


Alexey Viktorov:
 

Второй вопрос.

for(calc_day;calc_day>0; calc_day--)

Чему равно calc_day??? Может быть меньше нуля? Компилятор не знает что заложено в логике... Вот и предупреждает о возможном не эффективном цикле.

Число calc_day всегда больше 0, при иных значениях код не вызывается.
 
-Aleks-:

Спасибо за ответ!

Удивлен - так как визуально логика отрабатывала всегда верно, хммм...

До 6** билдов так и было, проверялась вся цепочка условий и всё работало, но теперь всё изменилось. Да и в старых билдах в этом случае неоднозначность условия. Как задумано?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

или так?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Человеческий мозг может разобраться, но что делать компилятору? У него-то мозгов нету...

-Aleks-:

Число calc_day всегда больше 0, при иных значениях код не вызывается.

Расскажи это компилятору...

 
Alexey Viktorov:

До 6** билдов так и было, проверялась вся цепочка условий и всё работало, но теперь всё изменилось. Да и в старых билдах в этом случае неоднозначность условия. Как задумано?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

или так?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Человеческий мозг может разобраться, но что делать компилятору? У него-то мозгов нету...


Расскажи это компилятору...

Убедительно - буду бдительней.

а как рассказать компилятору? Написать,но поймет ли

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

До 6** билдов так и было, проверялась вся цепочка условий и всё работало, но теперь всё изменилось. Да и в старых билдах в этом случае неоднозначность условия. Как задумано?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

или так?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Человеческий мозг может разобраться, но что делать компилятору? У него-то мозгов нету...


Расскажи это компилятору...

check operator precedence for possible error; use parentheses to clarify precedence - это не ошибка. Это предупреждение. Встречаются в старых кодах.

Добавили его скорее для пользователя, нежели для компилятора. Компилятор руководствуется приоритетом операций. Там все однозначно. Приоритет у && выше, чем у ||, соответственно правильно расставить скобки так:

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

upd: В данном случае и для МТ4 и для МТ5 приоритет одинаковый.

 
-Aleks-:

Убедительно - буду бдительней.

а как рассказать компилятору? Написать,но поймет ли

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
Так попробуйте
 
Alexey Kozitsyn:

check operator precedence for possible error; use parentheses to clarify precedence - это не ошибка. Это предупреждение. Встречаются в старых кодах.

Добавили его скорее для пользователя, нежели для компилятора. Компилятор руководствуется приоритетом операций. Там все однозначно. Приоритет у && выше, чем у ||, соответственно правильно расставить скобки так:

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

upd: В данном случае и для МТ4 и для МТ5 приоритет одинаковый.

Ну по сути, да, предупреждение не ошибка. Но как отработает начальный вариант if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy ) ? Или руки обломятся поставить пару скобок?

 
-Aleks-:

Убедительно - буду бдительней.

а как рассказать компилятору? Написать,но поймет ли

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

Ну по сути, да, предупреждение не ошибка. Но как отработает начальный вариант if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy ) ? Или руки обломятся поставить пару скобок?

Отработается он так, как я написал выше.

А компилятор на то и предупреждает, чтобы пользователь не ленился и ставил скобки, дабы избежать возможных не очевидных ошибок. 

Причина обращения: