Странное поведение оператора WHILE - страница 2

 

Это не имеет никакого значения, я думаю. Я мог бы также написать IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

Дело в том, почему IF определяет условие выхода, а затем WHILE реагирует на переменную bool, в то время как если я помещу то же условие внутрь WHILE, он не завершится?

 
lord_hiro:

Это не имеет никакого значения, я думаю. Я мог бы также написать IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

Дело в том, почему IF определяет условие выхода, а затем WHILE реагирует на переменную bool, в то время как если я помещу то же условие внутрь WHILE, он не завершится?


Мне кажется, что это работает

while (StringHighStatus == "False" &&  SwingHighShift <= SwingBarCount)

как

while (!EndCycle)
   {
   
  ...
      if( StringHighStatus == "True" ) EndCycle = TRUE;
      if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
   }
 
Да, иногда обратная логика позволяет добиться того, чего мы хотим.
 

deVries, возможно, я ошибаюсь, но мне кажется, что последовательность IF превращает булево значение в TRUE, как это делает логическое OR.

Если первое условие выполняется, то EndCycle превращается в TRUE, если второе - нет, то остается TRUE.

И наоборот, если первое условие не выполняется, а второе выполняется, то оно становится TRUE.

В это время WHILE распознает условие выхода.

Таким образом, два последовательных IF ведут себя как логическое OR, и то же самое делает последовательность IF...ELSE IF.

И это должно быть ИЛИ, оно не может быть И, иначе WHILE может застрять (условие на строке может быть ложным бесконечно).

Почему WHILE управляет единственной булевой переменной, значение которой устанавливается внутри цикла, в то время как он не может определить результат той же логической операции ИЛИ внутри своего определения условия?

Этот советник использовался многими людьми в прошлом, до билда 600, а также до 500, и это последний релиз. Никто не жаловался.

Поэтому мой вопрос: есть ли кто-нибудь, кто испытывает проблемы с оператором WHILE после сборки 600?

 
Ответ - да.... однако это может не иметь никакого отношения к сборке и иметь большое отношение к кодированию....LOL
 
So my question is: is there anyone experiencing troubles with the WHILE operator after build 600? 
Пробовали ли вы когда-нибудь выполнить очень простые логические операции, просто чтобы подтвердить, что все работает так, как нужно, или нет, вместо того, чтобы спросить?
 
lord_hiro:

deVries, возможно, я ошибаюсь, но мне кажется, что последовательность IF превращает булево значение в TRUE, как это делает логическое OR.

Если первое условие выполняется, то EndCycle превращается в TRUE, если второе - нет, то остается TRUE.

И наоборот, если первое условие не выполняется, а второе выполняется, то оно становится TRUE.

В это время WHILE распознает условие выхода.

Таким образом, два последовательных IF ведут себя как логическое OR, и то же самое делает последовательность IF...ELSE IF.

И это должно быть ИЛИ, оно не может быть И, иначе WHILE может застрять (условие на строке может быть ложным бесконечно).

Почему WHILE управляет единственной булевой переменной, значение которой устанавливается внутри цикла, в то время как он не может определить результат той же логической операции ИЛИ внутри своего определения условия?

Этот советник использовался многими людьми в прошлом, до билда 600, а также до 500, и это последний релиз. Никто не жаловался.

Поэтому мой вопрос: есть ли кто-нибудь, кто испытывает проблемы с оператором WHILE после сборки 600?

Я думаю, что вы имеете в виду следующее

while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)

Ваш код, если бы он был в точности таким, как вы написали, не выполнялся бы так, как вы ожидаете, ни с одним билдом, так что вы, должно быть, что-то изменили.

   while(StringHighStatus=="False" || SwingHighShift<=SwingBarCount)
     {

      if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) && iFractals(NULL,0,MODE_UPPER,SwingHighShift)>Close[0])
        {
         //IF THIS CONDITION IS TRUE AT, FOR EXAMPLE SwingHighShift=10
         StringHighStatus="True";
         SwingHigh=SwingHighShift;
         ObjectDelete("SwingHigh");
         ObjectCreate("SwingHigh",OBJ_VLINE,0,Time[SwingHigh],0);
         ObjectSet("SwingHigh",OBJPROP_COLOR,Red);
         //THEN StringHighStatus="True" BUT SwingHighShift IS NOT INCREASED IN THIS BLOCK OF CODE
         //SO WHEN CONTROL IS HANDED BACK TO THE WHILE OPERATOR, SwingHighShift WILL REMAIN UNCHANGED AT 10
         //SO THIS BLOCK OF CODE WILL BE REPEATED OVER AND OVER CHECKING BAR SHIFT 10, BECAUSE THERE IS NO WAY OUT!
         //HOW TO RESOLVE? SIMPLY USE         
         break;
        }
      else
        {
         SwingHighShift++;
        }

     }
 
deysmacro:
Вы когда-нибудь пробовали выполнить очень простые логические операции, просто чтобы убедиться, работает он как надо или нет, вместо того чтобы спрашивать?


Мой пост начался с примера WHILE, который, как мне показалось, возвращает необычное поведение, очень похожее на поведение советника, который мы сейчас обсуждаем, поэтому я сначала попробовал, а потом спросил.

Моя интерпретация этой очень простой отладки оказалась неверной, поэтому обсуждение перешло к самому советнику.

 

Спасибо GumRai за терпение.

Возможно, я ошибаюсь и не могу понять логику...

Если первый IF превращает, как вы предлагаете, строку в "true" при, скажем, SwinghHighShift=10, то счетчик не увеличивается в этом цикле; после этого управление возвращается в WHILE: цикл должен закончиться в этой точке, потому что WHILE содержит логическое ИЛИ и одно из его условий выполнено.

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

Я думаю, что ваше соображение было бы верным при использовании оператора AND.

Следуя вашей интерпретации, я могу пропустить OR внутри WHILE; я могу просто поставить первое условие IF на строке: если переменная станет "истинной", то прерывание завершит WHILE, в противном случае счетчик будет идти дальше до своего максимума.

Код будет выглядеть так:

   while(SwingHighShift<=SwingBarCount)
     {

      if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) && iFractals(NULL,0,MODE_UPPER,SwingHighShift)>Close[0])
        {
         
         StringHighStatus="True";
         SwingHigh=SwingHighShift;
         ObjectDelete("SwingHigh");
         ObjectCreate("SwingHigh",OBJ_VLINE,0,Time[SwingHigh],0);
         ObjectSet("SwingHigh",OBJPROP_COLOR,Red);
        
         break;
        }
      else
        {
         SwingHighShift++;
        }

     }


Но это все еще обходной путь, и, к сожалению, он не объясняет (как мне кажется), почему WHILE не справляется с ИЛИ.

 
lord_hiro:


Если первый IF превращает, как вы предлагаете, строку в "true" при, скажем, SwinghHighShift=10, то отсчет не увеличивается в этом цикле; после этого управление возвращается к WHILE: цикл должен закончиться в этой точке, потому что WHILE содержит логическое ИЛИ и одно из его условий выполнено.

Да, одно из условий while выполнено, но код в этом случае не завершается, он переходит к for и находится в бесконечном цикле.
Причина обращения: