WHILE operatörünün garip davranışı - sayfa 3

 
FOR'u kullanabilmemiz için WHILE olması gerekiyor mu?
 

bu ne zaman başlıyor ve

Bu ne zaman durur ???

 while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)
 
Bu asla doğru olmayacak ( == işlenen. - MQL4 forumu )
 if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)== iHigh ( NULL , 0 ,SwingHighShift)
bu nedenle, bu asla yürütülmez
StringHighStatus= "True" ;
sonsuz bir döngü ile sonuçlanır.
 while (StringHighStatus== "False" || ...
  1. Değişkenlerinizi ve girişlerinizi if ifadelerinden önce ve içeride yazdırmış olsaydınız, bunu çözerdiniz.
  2. Boolean demek istediğinizde karakter dizileri veya int'ler kullanmayın.
     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 :
Bu asla doğru olmayacak ( == işlenen. - MQL4 forumu )
bu nedenle, bu asla yürütülmez
sonsuz bir döngü ile sonuçlanır.

Test edene kadar aynı şeyi düşündüm, şaşırtıcı bir şekilde if(double == double) kısmı işe yarıyor, bu beni çiftlerin karşılaştırmasının yeni yapılarda farklı şekilde ele alınıp alınmadığını merak ediyor.

 //+------------------------------------------------------------------+
//| 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: Fraktal koşulları bar 98'de karşılandı
EURUSD,M15: 95 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları çubuk 91'de karşılandı
EURUSD,M15: 81 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları çubuk 77'de karşılandı
EURUSD,M15: Fraktal koşulları çubuk 68'de karşılandı
EURUSD,M15: 61 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: 48 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları 39. çubukta karşılandı
EURUSD,M15: Fraktal koşulları çubuk 24'te karşılandı
EURUSD,M15: Fraktal koşulları çubuk 19'da karşılandı
EURUSD,M15: Fraktal koşulları çubuk 12'de karşılandı
EURUSD,M15: 4. çubukta fraktal koşulları karşılandı

 
lord_hiro :

Sabrınız için teşekkürler GumRai.

Belki yanılıyorum ve dik kafalıyım ama mantığını anlayamıyorum...

İlk IF, sizin önerdiğiniz gibi, dizeyi SwinghHighShift=10'da "true" olarak döndürürse, o döngüde sayılan artmaz; bundan sonra kontrol WHILE'a geri döner: WHILE mantıksal bir VEYA içerdiğinden ve koşullarından biri sağlandığından döngü bu noktada sona ermelidir.

Tersine, değişken yanlış kalırsa, sayaç maksimum değerine ulaşmalıdır ve yine çıkış koşuluna sahipsiniz.

Bence düşünceniz bir AND operatörü ile doğru olacaktır.

Yorumunuzu takiben WHILE içindeki OR'yi atlayabilirim; İlk IF koşulunu dizgeye koyabilirim: "doğru" olursa, mola WHILE'ı sona erdirir, aksi takdirde sayaç maksimum değerine kadar devam eder.

Kod şuna dönecek:


Ancak bu hala bir geçici çözüm ve ne yazık ki, WHILE'ın OR ile neden ilgilenmediğini (bana) açıklamıyor.

WHILE veya mantıksal VEYA'da yanlış bir şey yok, WHILE'ınızda iki koşul var, WHILE'ın çıkabilmesi için HER İKİSİNİN de kırılması gerekiyor.

Bu yüzden sıkışıyor

  • Kod WHILE döngüsüne girer. Başlangıç için her iki koşul da doğrudur.
  • Kod, EĞER koşullarını karşılamak için fraktallarla bir çubuk bulunana kadar SwingHighShift++'ı artırarak WHILE döngüsü boyunca döner.
  • Fraktallar koşulları karşıladığında Er ya da geç Kod EĞER operatörlerine girer.
  • StringHighStatus false olarak değiştirilir, böylece ilk WHILE koşulu bozulur.
  • SwingHighShift++; IF operatörünün ELSE bölümünde olduğu için artırılmaz (IF koşulu karşılandığından ELSE yoksayılır).
  • İkinci WHILE koşulu hala doğrudur, bu nedenle kod tekrar SON ZAMANA GÖRE AYNI ÇUBUKTA HALA DEVAM ETMEKTEDİR.
  • aynı fraktal, geçen seferki gibi yine IF koşullarını karşılıyor.
  • ELSE bölümündeki SwingHighShift++, IF koşulları doğru olduğunda artırılmadığından, kod artık EĞER koşullarını karşılayan fraktal ile bu çubukta sonsuza kadar döngüde kalıyor.

while döngüsünün çıkma olasılığı çok düşüktür ve bu, 100 Bar'ın tamamı için IF koşulunun karşılanmadığı zamandır (SwingBarCount), bu nedenle 2. WHILE koşulu 1.'den önce bozulur. Ardından Fraktallar IF koşulunu karşılar ve 1. WHILE koşulunu kırmak için kod (StringHighStatus'u değiştirin) yürütülür.

Ya SwingHighShift++ almanız gerekir; ELSE'den çıkın ve IF operatöründen sonra while döngüsüne kendi başına koyun, böylece IF koşullarında ne olduğuna bakılmaksızın yine de artar, böylece döngü bir sonraki çubuğa geçebilir veya nesne çizim kod bloğundan sonra break kullanın. nesne çizildikten sonra sürenin dışına çıkın.

Ayrıca nesnenize kendisi için farklı isimler oluşturması için bir yol vermeniz gerekir, aksi takdirde yalnızca bir kez çizilecektir. (sadece bir kez çizilmesini istemiyorsanız).

 
Bu konudaki gönderilerinizi tekrar okudum, şimdi kafanızın nerede ortaya çıktığını görüyorum. WHILE ve OR mantığını tersten düşünüyorsunuz. VEYA, WHILE'ı durdurmakla ilgili değildir. Bu, her iki koşul da geçerli olduğunda onu devam ettirmekle ilgilidir... Bu şu şekilde, iki ışığınız yanıyor. Talimatınız, ışık 1 VEYA ışık 2 açıkken bir şeyler yapmaya devam edin. Açıkçası, bırakmadan önce sadece bir tanesi değil, her iki ışık da kapalı olmalıdır.
 
SDC :

Test edene kadar aynı şeyi düşündüm, şaşırtıcı bir şekilde if(double == double) kısmı işe yarıyor, bu beni çiftlerin karşılaştırmasının yeni yapılarda farklı şekilde ele alınıp alınmadığını merak ediyor.

EURUSD,M15: Fraktal koşulları bar 98'de karşılandı
EURUSD,M15: 95 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları çubuk 91'de karşılandı
EURUSD,M15: 81 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları çubuk 77'de karşılandı
EURUSD,M15: Fraktal koşulları çubuk 68'de karşılandı
EURUSD,M15: 61 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: 48 numaralı çubukta fraktal koşulları karşılandı
EURUSD,M15: Fraktal koşulları 39. çubukta karşılandı
EURUSD,M15: Fraktal koşulları çubuk 24'te karşılandı
EURUSD,M15: Fraktal koşulları çubuk 19'da karşılandı
EURUSD,M15: Fraktal koşulları çubuk 12'de karşılandı
EURUSD,M15: 4. çubukta fraktal koşulları karşılandı


Çalışmasının nedeni, kodun aynı değeri etkili bir şekilde karşılaştırmasıdır.

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

Fraktal tampon ya bir Empty değerine sahip olacak ya da değerini ilgili çubuğun en üstünden alacaktır.

kod etkili

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

değiştirilmemesi için hiçbir neden göremiyorum

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

değiştirilmemesi için hiçbir neden göremiyorum

 if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)!= EMPTY_VALUE )
Evet, bunu yapmanın daha iyi bir yolu olduğunu düşünüyorum.
 
SDC :
Bu konudaki gönderilerinizi tekrar okudum, şimdi kafanızın nerede ortaya çıktığını görüyorum. WHILE ve OR mantığını tersten düşünüyorsunuz. VEYA, WHILE'ı durdurmakla ilgili değildir. Bu, her iki koşul da geçerli olduğunda onu devam ettirmekle ilgilidir... Bu şu şekilde, iki ışığınız yanıyor. Talimatınız, ışık 1 VEYA ışık 2 açıkken bir şeyler yapmaya devam edin. Açıkçası, bırakmadan önce sadece bir tanesi değil, her iki ışık da kapalı olmalıdır.


Bu kadar!

Yazık bana... :-)

Üstelik bu WHILE'ı ilk kullanışım değil ama tersten düşünmeye başladım ve KENDİ döngüsünden hiç çıkmadım :-/

Ve böylece deVries'in || && ile sağa döner.

Bu konudan halledilmesi gereken başka birçok şey çıktı, yani IF( == ) işe yarıyor.

Sabrınız ve anlamamı sağlamak için harcadığınız zaman için hepinize teşekkür ederim.

 

Bu şekilde, bir ara vererek, while döngüsünü kırmak için yapardım, doğru mu?

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