Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 495
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По первому случаю разобрался - поставил в скобки по два сравнения и не ругается - неужели была логическая ошибка - т.е. результаты сравнения могла замениться из-за "или"?
Остался открытый вопрос со вторым выражением - что там не так - есть идеи?
По первому случаю разобрался - поставил в скобки по два сравнения и не ругается - неужели была логическая ошибка - т.е. результаты сравнения могла замениться из-за "или"?
Остался открытый вопрос со вторым выражением - что там не так - есть идеи?
Надо помнить что проверка условия в новом 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??? Может быть меньше нуля? Компилятор не знает что заложено в логике... Вот и предупреждает о возможном не эффективном цикле.
Надо помнить что проверка условия в новом 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??? Может быть меньше нуля? Компилятор не знает что заложено в логике... Вот и предупреждает о возможном не эффективном цикле.
Спасибо за ответ!
Удивлен - так как визуально логика отрабатывала всегда верно, хммм...
До 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, при иных значениях код не вызывается.Расскажи это компилятору...
До 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);
До 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 приоритет одинаковый.
Убедительно - буду бдительней.
а как рассказать компилятору? Написать,но поймет ли
if (calc_day<0) calc_day=calc_day*(-1);
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 ) ? Или руки обломятся поставить пару скобок?
Убедительно - буду бдительней.
а как рассказать компилятору? Написать,но поймет ли
if (calc_day<0) calc_day=calc_day*(-1);
Ну по сути, да, предупреждение не ошибка. Но как отработает начальный вариант if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy ) ? Или руки обломятся поставить пару скобок?
Отработается он так, как я написал выше.
А компилятор на то и предупреждает, чтобы пользователь не ленился и ставил скобки, дабы избежать возможных не очевидных ошибок.