Comportamento estranho do operador WHILE - página 3

 
Precisa ser AQUELE enquanto podemos usar PARA?
 

quando é isso enquanto se inicia e

quando é que isto pára ????

while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)
 
Isto nunca será verdade (The == operand - MQL4 forum)
if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift)
por isso, isto nunca é executado
StringHighStatus="True";
resultando em um loop infinito.
while(StringHighStatus=="False" || ...
  1. Se você tivesse impresso suas variáveis e entradas antes e dentro de suas declarações, você teria descoberto isso.
  2. Não use strings ou ints quando se refere a booleano.
    string StringHighStatus = "False";
    while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          StringHighStatus = "True";
    
    bool String HighStatus = False;
    while (!String HighStatus || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          String HighStatus = True;
    

 
WHRoeder:
Isto nunca será verdade (The == operand - MQL4 forum)
por isso, isto nunca é executado
resultando em um loop infinito.

Pensei a mesma coisa até que o testei, surpreendentemente a parte if(double === duplo) dele funciona, me faz pensar se a comparação de duplas é tratada de maneira diferente nas novas construções.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=0; i<100; i++)
   {if(iFractals(NULL, 0, MODE_UPPER, i) == iHigh(NULL, 0, i) && iFractals(NULL, 0, MODE_UPPER, i) > Close[0])
    Print("Fractals conditions met on bar ",i);
  }} 

EURUSD,M15: Condições de fractal atendidas na barra 98
EURUSD,M15: Condições de fractals atendidas na barra 95
EURUSD,M15: Condições de fractals atendidas na barra 91
EURUSD,M15: Condições de fractals atendidas na barra 81
EURUSD,M15: Condições de fractals atendidas na barra 77
EURUSD,M15: Condições de fractals atendidas na barra 68
EURUSD,M15: Condições de fractals atendidas na barra 61
EURUSD,M15: Condições de fractals atendidas na barra 48
EURUSD,M15: Condições de fractals atendidas na barra 39
EURUSD,M15: Condições dos fractais atendidas na barra 24
EURUSD,M15: Condições de fractals atendidas na barra 19
EURUSD,M15: Condições de fractals atendidas na barra 12
EURUSD,M15: Condições de fractals atendidas na barra 4

 
lord_hiro:

Obrigado GumRai por sua paciência.

Talvez eu esteja errado e de cabeça dura, mas não consigo entender a lógica...

Se o primeiro IF vira, como você sugere, o fio para "verdadeiro" a dizer SwinghHighShift=10, então a contagem não aumenta nesse ciclo; depois disso, o controle volta para o QUANTO: o ciclo deve terminar neste ponto porque o QUANTO contém um OU lógico e uma de suas condições é satisfeita.

Por outro lado, se a variável permanecer falsa, o contador deve atingir seu valor máximo e novamente você tem a condição de saída.

Acho que sua consideração seria verdadeira com um operador AND.

Seguindo sua interpretação, eu poderia pular o OU dentro do OU; eu poderia apenas colocar a primeira condição IF na corda: se se tornar "verdadeira", então a quebra terminará o OU, caso contrário o contador continuará até seu máximo.

O código se voltará para:


Mas isto ainda é uma alternativa e, infelizmente, não explica (para mim) porque o QUEM não cuida do OR.

Não há nada de errado com o OR ou com o OR lógico, você tem duas condições em seu OR, UM DAS quais deve ser quebrado antes que o OR possa sair.

É por isso que ela fica presa

  • O código entra em WHILE loop. Ambas as condiçoes são verdadeiras para começar.
  • O código passa pelo laço WHILE incrementando o SwingHighShift++ até que uma barra seja encontrada com fractais para satisfazer as condições do IF.
  • Mais cedo ou mais tarde, o código entra nos operadores IF quando os fractais atendem às condições.
  • O StringHighStatus é alterado para falso para que a primeira condição WHILE seja quebrada.
  • SwingHighShift++; NÃO é incrementado porque está na parte ELSE do operador IF (a condição IF foi cumprida, portanto a condição ELSE é ignorada).
  • A segunda condição WHILE ainda é verdadeira, então codifica novamente STILL ON THE SAME BAR AS LAST TIME.
  • o mesmo fractal satisfaz as condições IF novamente, exatamente como da última vez.
  • O código agora está agora preso para sempre na barra com o fractal que atende às condições IF porque SwingHighShift++ na parte ELSE não é incrementado quando as condições IF são verdadeiras.

Há apenas uma pequena chance de que enquanto o laço possa sair e é quando a condição IF não é cumprida para todas as 100 Barras (SwingBarCount), então a 2ª condição WHILE é quebrada antes da 1ª. Em seguida, os fractais satisfazem a condição IF e o código para quebrar a 1ª condição WHILE (modificar o StringHighStatus) é executado.

Você precisa pegar SwingHighShift++; fora do ELSE e colocá-lo por si só no laço enquanto após o operador IF, de modo que independentemente do que acontece com as condições IF ele ainda incrementa para que o laço possa passar para a próxima barra, ou usar a quebra após o bloco de código de desenho do objeto para quebrar o laço uma vez que o objeto é desenhado.

Você também precisa dar a seu objeto uma maneira de criar nomes diferentes para si mesmo, caso contrário, ele será desenhado apenas uma vez. (a menos que você queira que ele seja desenhado apenas uma vez).

 
Li novamente sobre seus posts neste tópico e vejo onde sua confusão surge agora. Você está pensando na lógica de ONDE e OU ao contrário. O OU não se trata de parar o QUEM. Trata-se de mantê-lo ativo quando qualquer uma das condições é válida. É assim, você tem duas luzes acendidas. Sua instrução é: Enquanto a luz 1 OU a luz 2 estiver acesa, continue fazendo alguma coisa. Obviamente, as duas luzes têm que estar apagadas antes de você parar, não apenas uma delas.
 
SDC:

Pensei a mesma coisa até que o testei, surpreendentemente a parte if(double === duplo) dele funciona, me faz pensar se a comparação de duplas é tratada de maneira diferente nas novas construções.

EURUSD,M15: Condições de fractais atendidas na barra 98
EURUSD,M15: Condições de fractais atendidas na barra 95
EURUSD,M15: Condições de fractais atendidas na barra 91
EURUSD,M15: Condições de fractais atendidas na barra 81
EURUSD,M15: Condições de fractais atendidas na barra 77
EURUSD,M15: Condições de fractais atendidas na barra 68
EURUSD,M15: Condições de fractais atendidas na barra 61
EURUSD,M15: Condições de fractais atendidas na barra 48
EURUSD,M15: Condições de fractais atendidas na barra 39
EURUSD,M15: Condições de fractais atendidas na barra 24
EURUSD,M15: Condições de fractais atendidas na barra 19
EURUSD,M15: Condições de fractais atendidas na barra 12
EURUSD,M15: Condições de fractais atendidas na barra 4


O motivo pelo qual funciona é porque o código está efetivamente comparando o mesmo valor

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) )

O tampão fractal terá um valor Vazio ou tirará o seu valor do alto da barra relevante.

O código é efetivamente

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE && iHigh(NULL,0,SwingHighShift==iHigh(NULL,0,SwingHighShift) 

Não vejo razão para que não possa ser substituído por

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
 
GumRai:

Não vejo razão para que não possa ser substituído por

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
Sim, eu acho que essa é uma maneira melhor de fazer isso.
 
SDC:
Li novamente sobre seus posts neste tópico e vejo onde sua confusão surge agora. Vocês estão pensando na lógica de ONDE e OU ao contrário. O OU não se trata de parar o QUEM. Trata-se de mantê-lo ativo quando qualquer uma das condições é válida. É assim, você tem duas luzes acendidas. Sua instrução é: Enquanto a luz 1 OU a luz 2 estiver acesa, continue fazendo alguma coisa. Obviamente, as duas luzes têm que estar apagadas antes de você parar, não apenas uma delas.


É isso aí!

Que vergonha para mim... :-)

Além disso, não é a primeira vez que uso QUANDO, mas comecei a pensar ao contrário e nunca saí do Meu Próprio loop :-/

E assim a sugestão dos deVries de substituir ||| por && vira à direita.

Muitas outras coisas para cuidar saíram deste tópico, ou seja, com o IF( === ) funcionando.

Obrigado a todos por sua paciência e pelo tempo que vocês gastaram para me fazer entender.

 

Eu gostaria de fazê-lo dessa forma, com uma pausa, para quebrar o loop while, é correto?

  int counter=0, MaxCount = 10000;
  while( true )
     {
      Print("Counter ", counter);
      counter++;
      if( counter == MaxCount ) break;
      }