WHILE 연산자의 이상한 동작 - 페이지 3

 
FOR를 사용할 수 있는 동안 WHILE이어야 합니까?
 

시작하는 동안 이것은 언제이며

중지하는 동안 이것은 언제입니까 ???

 while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)
 
이것은 결코 사실이 아닐 것입니다( == 피연산자. - MQL4 포럼 )
 if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)== iHigh ( NULL , 0 ,SwingHighShift)
따라서 이것은 실행되지 않습니다
StringHighStatus= "True" ;
결과적으로 무한 루프가 발생합니다.
 while (StringHighStatus== "False" || ...
  1. if 문 앞과 안에 변수와 항목을 인쇄했다면 이것을 알아냈을 것입니다.
  2. 부울을 의미할 때 문자열이나 정수를 사용하지 마십시오.
     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 :
이것은 결코 사실이 아닐 것입니다( == 피연산자. - MQL4 포럼 )
따라서 이것은 실행되지 않습니다
결과적으로 무한 루프가 발생합니다.

테스트할 때까지 같은 생각을 했습니다. 놀랍게도 if(double == double) 부분이 제대로 작동합니다. 새 빌드에서 double의 비교가 다르게 처리되는지 궁금합니다.

 //+------------------------------------------------------------------+
//| 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: 막대 98에서 프랙탈 조건 충족
EURUSD,M15: 막대 95에서 프랙탈 조건 충족
EURUSD,M15: 막대 91에서 프랙탈 조건 충족
EURUSD,M15: 막대 81에서 프랙탈 조건 충족
EURUSD,M15: 막대 77에서 프랙탈 조건 충족
EURUSD,M15: 막대 68에서 프랙탈 조건 충족
EURUSD,M15: 막대 61에서 프랙탈 조건 충족
EURUSD,M15: 막대 48에서 프랙탈 조건 충족
EURUSD,M15: 막대 39에서 프랙탈 조건 충족
EURUSD,M15: 막대 24에서 프랙탈 조건 충족
EURUSD,M15: 막대 19에서 프랙탈 조건 충족
EURUSD,M15: 막대 12에서 프랙탈 조건 충족
EURUSD,M15: 막대 4에서 프랙탈 조건 충족

 
lord_hiro :

기다려 주셔서 감사합니다.

제가 틀릴 수도 있고 머리가 좋지 않을 수도 있지만 논리를 이해할 수 없습니다 ...

첫 번째 IF가 제안한 대로 SwinghHighShift=10에서 문자열이 "true"로 바뀌면 해당 주기에서 카운트가 증가하지 않습니다. 그 후 컨트롤은 WHILE로 돌아갑니다. WHILE에는 논리적 OR이 포함되어 있고 조건 중 하나가 충족되기 때문에 주기는 이 지점에서 끝나야 합니다.

반대로 변수가 false로 유지되면 카운터는 최대값에 도달해야 하며 다시 종료 조건을 갖게 됩니다.

나는 당신의 고려가 AND 연산자에 대해 사실일 것이라고 생각합니다.

귀하의 해석에 따라 WHILE 내부의 OR을 건너뛸 수 있습니다. 문자열에 첫 번째 IF 조건을 넣을 수 있습니다. "true"로 바뀌면 중단이 WHILE을 종료하고, 그렇지 않으면 카운터가 최대값까지 계속됩니다.

코드는 다음과 같이 바뀝니다.


그러나 이것은 여전히 해결 방법이며 슬프게도 WHILE이 OR을 처리하지 않는 이유를 (나에게) 설명하지 않습니다.

WHILE 또는 논리적 OR에는 아무런 문제가 없습니다. WHILE에 두 가지 조건이 있습니다. WHILE이 종료되기 전에 둘 다 깨져야 합니다.

이것이 막히는 이유입니다

  • 코드는 WHILE 루프에 들어갑니다. 두 조건 모두 처음에는 사실입니다.
  • 코드는 IF 조건을 충족하는 프랙탈 이 있는 막대를 찾을 때까지 SwingHighShift++를 증가시키는 WHILE 루프를 순환합니다.
  • 조만간 코드는 프랙탈이 조건을 충족할 때 IF 연산자를 입력합니다.
  • StringHighStatus가 false로 변경되어 첫 번째 WHILE 조건이 깨집니다.
  • 스윙하이시프트++; IF 연산자의 ELSE 부분에 있기 때문에 증가하지 않습니다(IF 조건이 충족되어 ELSE가 무시됨).
  • 두 번째 WHILE 조건은 여전히 참이므로 코드는 마지막 시간과 동일한 막대에서 계속 순환합니다.
  • 동일한 프랙탈이 지난 번과 마찬가지로 IF 조건을 다시 충족합니다.
  • IF 조건이 참일 때 ELSE 부분의 SwingHighShift++가 증가하지 않기 때문에 코드는 이제 IF 조건을 충족하는 프랙탈이 있는 해당 막대에서 영원히 반복됩니다.

while 루프가 종료될 가능성은 희박합니다. 즉, 전체 100개 막대(SwingBarCount)에 대해 IF 조건이 충족되지 않아 2번째 WHILE 조건이 1번째 전에 깨집니다. 그런 다음 Fractals는 IF 조건을 충족하고 첫 번째 WHILE 조건(StringHighStatus 수정)을 깨는 코드가 실행됩니다.

SwingHighShift++를 사용해야 합니다. ELSE에서 빠져 나와 IF 연산자 뒤의 while 루프에 단독으로 넣습니다. 따라서 IF 조건에 관계없이 루프가 다음 막대로 이동할 수 있도록 계속 증가하거나 개체 그리기 코드 블록 다음에 break를 사용합니다. 개체가 그려지면 잠시 휴식을 취하십시오.

또한 개체에 다른 이름을 만들 수 있는 방법을 제공해야 합니다. 그렇지 않으면 한 번만 그려집니다. (한 번만 그리기를 원하지 않는 한).

 
이 스레드에서 귀하의 게시물을 다시 읽어보니 지금 귀하의 혼란이 어디에서 발생하는지 알 수 있습니다. WHILE과 OR의 논리를 반대로 생각하고 있습니다. OR WHILE을 중지하는 것이 아닙니다. 어느 하나의 조건이 유효할 때 계속 진행하는 것입니다. 이렇게 하면 두 개의 조명이 켜집니다. 당신의 지시는 빛 1 또는 빛 2가 켜져 있는 동안 계속 무언가를 하라는 것입니다. 분명히 종료하기 전에 둘 중 하나만이 아니라 두 개의 표시등을 꺼야 합니다.
 
SDC :

테스트할 때까지 같은 생각을 했습니다. 놀랍게도 if(double == double) 부분이 제대로 작동합니다. 새 빌드에서 double의 비교가 다르게 처리되는지 궁금합니다.

EURUSD,M15: 막대 98에서 프랙탈 조건 충족
EURUSD,M15: 막대 95에서 프랙탈 조건 충족
EURUSD,M15: 막대 91에서 프랙탈 조건 충족
EURUSD,M15: 막대 81에서 프랙탈 조건 충족
EURUSD,M15: 막대 77에서 프랙탈 조건 충족
EURUSD,M15: 막대 68에서 프랙탈 조건 충족
EURUSD,M15: 막대 61에서 프랙탈 조건 충족
EURUSD,M15: 막대 48에서 프랙탈 조건 충족
EURUSD,M15: 막대 39에서 프랙탈 조건 충족
EURUSD,M15: 막대 24에서 프랙탈 조건 충족
EURUSD,M15: 막대 19에서 프랙탈 조건 충족
EURUSD,M15: 막대 12에서 프랙탈 조건 충족
EURUSD,M15: 막대 4에서 프랙탈 조건 충족


작동하는 이유는 코드가 동일한 값을 효과적으로 비교하기 때문입니다.

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

프랙탈 버퍼는 빈 값을 가지거나 관련 막대의 높은 값에서 값을 가져옵니다.

코드는 효과적으로

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

나는 그것을 대체 할 수없는 이유를 보지 못한다.

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

나는 그것을 대체 할 수없는 이유를 보지 못한다.

 if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)!= EMPTY_VALUE )
네, 그게 더 나은 방법이라고 생각합니다.
 
SDC :
이 스레드에서 귀하의 게시물을 다시 읽어보니 지금 귀하의 혼란이 어디에서 발생하는지 알 수 있습니다. WHILE과 OR의 논리를 반대로 생각하고 있습니다. OR WHILE을 중지하는 것이 아닙니다. 어느 하나의 조건이 유효할 때 계속 진행하는 것입니다. 이렇게 하면 두 개의 조명이 켜집니다. 당신의 지시는 빛 1 또는 빛 2가 켜져 있는 동안 계속 무언가를 하라는 것입니다. 분명히 종료하기 전에 둘 중 하나만이 아니라 두 개의 표시등을 꺼야 합니다.


그게 다야!

부끄럽다... :-)

또한 WHILE을 처음 사용하는 것은 아니지만 반대로 생각하기 시작했고 MY OWN 루프에서 나오지 않았습니다.-/

그래서 deVries의 교체 제안 || &&로 우회전.

이 주제에서 처리해야 할 다른 많은 것들이 나왔습니다. 즉, IF( == )가 작동합니다.

인내심과 시간을 내어 나를 이해해 주셔서 감사합니다.

 

나는 그런 식으로 휴식을 취하여 while 루프를 끊을 수 있습니다. 맞습니까?

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