Добрый день,
подскажите пожалуйста равносильны ли следующие записи.
if (A == true && func() == true) {что-то делаем}
и вот такая запись
if (A == true)
{
if(func() == true) {что-то делаем}
}
во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?
Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.
Спасибо!
https://www.mql5.com/ru/docs/basis/operations/bool
Раздел "Короткая оценка логических операций"
- www.mql5.com
Добрый день,
...
Спасибо!
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Правильно написанные условия - залог не преднамеренной оптимизации кода
Vitaly Muzichenko, 2017.01.25 00:47
Когда пишем условия if(... && ..), то мало кто задумывается об очерёдности исполнения кода, но разработчики позаботились о том, что правильно расставленные приоритеты - залог минимизации исполнения кода по времени и ресурсам.
Возьмём к примеру простой советник на трёх условиях для входа в рынок, пусть это будет МА55, 2 белых свечи и RSI.
Дальше условие выглядит так:
{
// BUY
}
По сути условие правильное и выполниться без проблем, но если учесть тот факт, что условие if имеет спецификацию очерёдности проверки исполнения, nо этот код лучше записать так:
{
// BUY
}
Условие if начинает
проверять условия поочерёдно, и если первое выполнилось, то идёт дальше, если второе не выполнилось - выход и третье уже не
проверяет, что экономит время и системные ресурсы.
При написании нужно учитывать какие условия первостепенные, а какие второстепенны, и проверку начинать именно с главных. В первом коде у нас стоит проверка МА самой первой, потом RSI и в конце проверка по свечам. Но если рассмотреть пример, то не сложно понять, что в самую первую очередь нужно проверять именно свечи, потом RSI и МА, тем более если она тяжёлая. Почему? Потому, что в самую первую очередь изменятся свечи, потом показания RSI и МА.
Если будет первой стоять проверка на свечи (Open[i]) и она не выполнится, то условие на вход уже не выполнено, и делать проверку дальше не имеет смысла, просчитывать RSI и МА.
Вывод: нужно первым делом проверять то, что быстрее всего может измениться, и в последнюю очередь - что изменяется раз в сутки, а не наоборот.
Простые примеры, которые можно проверить:
Alert не сработает, потому что Flag==false, и тратить ресурсы на дальнейшую проверку функции GetFunc() не имеет смысла
voidOnTick()
{
//--
if( Flag && GetFunc()== 1 ) {
Alert("До меня очередь не дошла");
}
//-
}
int GetFunc()
{
// ...
Alert("GetAlert()");
//-
return(1);
}
А вот этот код вызовет функцию GetFunc() и сработает Alert("GetAlert()"), но дальше не пойдёт, потому что Flag==false. В итоге условие if не выполнено, но дёрнули функцию GetFunc() затратив ресурсы, она выполнилась в полном объёме, но код внутри if не выполнен.
voidOnTick()
{
//--
if( GetFunc()== 1 && Flag ) {
Alert("До меня очередь не дошла");
}
//-
}
int GetFunc()
{
// ...
Alert("GetAlert()");
//-
return(1);
}
Вот тут всё отработает: условия проверку прошли, и код внутри if выполнится, так-же сработаю два Alert:
voidOnTick()
{
//--
if( Flag && GetFunc()== 1 ) {
Alert("До меня очередь тоже дошла");
}
//-
}
int GetFunc()
{
// ...
Alert("GetAlert()");
//-
return(1);
}
Мораль такова: при написании кода расставляем правильно приоритеты, тогда код без оптимизации будет работать быстрее и легче.
Возможно когда-то напишу о циклах, профи это не нужно, а вот начинающим может пригодится.
Не ничего лучше, чем взять и проверить :)
//+------------------------------------------------------------------+ //| 1.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" #property script_show_inputs //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { Print("Varian 1"); if(1==1 && Test()) { int d=0; } Print("Varian 2"); if(1==2 && Test()) { int d=0; } //--- } //+------------------------------------------------------------------+ //| Test | //+------------------------------------------------------------------+ bool Test() { Print(__FUNCTION__); return(true); } //+------------------------------------------------------------------+
Результат:
2019.07.06 19:46:14.100 1 (EURUSD,H1) Varian 1 2019.07.06 19:46:14.102 1 (EURUSD,H1) Test 2019.07.06 19:46:14.102 1 (EURUSD,H1) Varian 2
Добрый день,
подскажите пожалуйста равносильны ли следующие записи.
if (A == true && func() == true) {что-то делаем}
и вот такая запись
if (A == true)
{
if(func() == true) {что-то делаем}
}
во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?
Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.
Спасибо!
Равносильны. В первом случае, если A=false, функция не будет вызываться.
Всем спасибо за ответы!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день,
подскажите пожалуйста равносильны ли следующие записи.
if (A == true && func() == true) {что-то делаем}
и вот такая запись
if (A == true)
{
if(func() == true) {что-то делаем}
}
во втором случае гарантированно не проверяется второе условие, если первое ложь, а в первом?
Просто первый вариант наглядней и короче в записи, но второе условие функция и каждый раз ее выполнять нет смысла.
Спасибо!