Возможно ли избегнуть много "или" (||) в условиях, вызывающих одно и то же действие? - страница 7

 

Какая плодотворная ночь была у меня сегодня! Пока спал, мне столько тут накидали интересного, за что вам безгранично благодарен! И ваши утра тоже оказались мудренее вечера!

Беглый просмотр всего предложенного как всегда вызывает ещё вопросы, но пока только хочу выяснить, а возможно последнее выражение сделать только с одним Action(), т.к. оно достаточно обширное:

if (!A) if (!B) if (!C) if (!D)
else Action();


Как мне кажется, это может быть оперативнее. Правда, не исключает проверку всех условий, если выполнится только последнее, или я ошибаюсь, что было бы лучше для меня.

Как думаете? 

 
FAQ:
кому не нравится "гребанный MQL4", тот может и пойдет отсюда бегом, бегом. Потому что непонятно что он здесь делает. несмотря на все заслуги и древность аккаунта.
Поясните, пожалуйста, непосвящённому!
 
Meat:
Вообще самый быстрый вариант будет такой:

Впрочем, строчку else result=false лучше совместить с первой строчкой, на скорости это практически не отразится. Да и вообще, если A, B, C и D содержат простые условия (с минимумом арифметических действий, без вызова всяких математических функций и прочих прибамбасов), то особого выигрыша в производительности ты не получишь от такой оптимизации (если конечно эта конструкция у тебя выполняется не десятки миллионов раз). А вот загромождение кода может быть существенным.

Я уже писал по этому поводу в одной из веток, что ко всему надо подходить рационально.  Мне почему-то кажется, что у тебя в коде полно более важных мест, оптимизация которых действительно дала бы колоссальный выигрыш в производительности.  Начать нужно с основного алгоритма. У большинства новичков происходят тупая проверка на каждом тике всех условий, касающиеся ТС или открытых ордеров. Отсюда и тормоза.  Хотя в большинстве случаев достаточно проверять лишь граничные условия, например достижение хаем и лоем определённого значения, либо появление нового бара. И лишь после этого выполнять дальнейшие проверки. 

Ну и кроме того, при ресурсоёмких вычислениях нужно задуматься о переносе этих вычислений в DLL. А то сидеть и ждать по 13 минут на грёбанном MQL4 (хотя можно получить тот же результат за 2-3 минуты) как-то ущербно :)


  хотя с первой частью абсолютно согласен.
 
icas:

Так еще быстрее. 

Вспомнил байку:

"На заседании правления компании было 2 вопроса:

 1. Решение о строительстве синхрофазотрона.

 2. Решение о строительстве велопарковки для сотрудников.

 По первому вопросу обсуждение длилось 1-ну минуту,

 по 2-му прения продолжались более 2-х часов." 

  Ага , точно ... Про велопаркОвку...
 
borilunad:

Какая плодотворная ночь была у меня сегодня! Пока спал, мне столько тут накидали интересного, за что вам безгранично благодарен! И ваши утра тоже оказались мудренее вечера!

Беглый просмотр всего предложенного как всегда вызывает ещё вопросы, но пока только хочу выяснить, а возможно последнее выражение сделать только с одним Action(), т.к. оно достаточно обширное:

Как мне кажется, это может быть оперативнее. Правда, не исключает проверку всех условий, если выполнится только последнее, или я ошибаюсь, что было бы лучше для меня.

Как думаете? 

Не, так не выходит. Во-первых, после if() что-то должно стоять, хотя бы просто точка с запятой (т.е. пустой оператор). Во-вторых, к какому из if относится по задумке ваш else? Если только к последнему (как написано у вас), то Action выполнится только, если условие D истинно при условии, что А,В и С ложны. Желательно всегда расставлять фигурные скобки, чтобы четко видеть логику.

 
FAQ:

Спасибо! Я пока избегаю употребление DLL и прочего заМКЛого.

Пользуюсь случаем, отвечу Алексею (Меаt), что все открытия позиций проводятся на новом баре, правда, на М1, но всё остальное работает на каждом тике. Также использую много необходимых функций (если каждый раз всё проверять в старте, тогда действительно код будет тяжёлым). Даже есть один MathPow(), который попробую заменить на предложенную Математиком экспоненту. А так, все необходимые переборы для модификаций и закрытий. Как без этого?

 
Обратите внимание на контроль и пересчет ордеров. именно этого в советниках обычно больше всего.
 
alsu:

Не, так не выходит. Во-первых, после if() что-то должно стоять, хотя бы просто точка с запятой (т.е. пустой оператор). Во-вторых, к какому из if относится по задумке ваш else? Если только к последнему (как написано у вас), то Action выполнится только, если условие D истинно при условии, что А,В и С ложны. Желательно всегда расставлять фигурные скобки, чтобы четко видеть логику.

Cпасибо! Но необходимо только одно Action();! Но пока не знаю как! Подскажете?

 
FAQ:
Обратите внимание на контроль и пересчет ордеров. именно этого в советниках обычно больше всего.
Но они неизбежны, иначе будут ошибки!
 

Я в своих программах при множестве if-ов использую такую контрукцию, при этом на первых местах ставлю условия которые чаще других будут давать false:

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
А если уж надо проверить очень много if-ов, то примерно так:
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}