MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 589

 
Alexey Viktorov :

1. Kontrol edin dedim, değiştirmeyin. Fraktal yoksa iFractals 0 döndürür. Düzenli olarak kullanmıyorum ve doğal olarak kurumamış hafızayı bu tür önemsiz şeylerle tıkamıyorum.

2. İşlev, çok kötü yazılmış olmasına rağmen, hala düzgün çalışıyor.

3. Son değer Yorum'da görüntülenir. Değişmek

ve kaç kez basılacağını görün

Pek çok, ama asla yalan değil. Sanki koşul her zaman karşılanıyormuş gibi. Ama yalan olmalı.

 
Ghabo :

Pek çok, ama asla yalan değil. Sanki koşul her zaman karşılanıyormuş gibi. Ama yanlış olmalı, ekranda durum şarta aykırı ama doğru.


İlk fraktal ve ikincisi ekranda işaretlenir. Ancak koşula göre, işlev birinciden daha düşük olanı bulana kadar daha fazla arar. Ve dördüncü fraktal birinciden daha düşük... Durumda yazan şey bu.

Koşul tamamlanırsa

       if (f!= 0 ) 
        {
        fr2= NormalizeDouble (f, d);
         if (fr2<fr1)
         return ( true );
           else break ;
        }

Bu da yanlış yazdıracaktır.

 
Alexey Viktorov :

İlk fraktal ve ikincisi ekranda işaretlenir. Ancak koşula göre, işlev birinciden daha düşük olanı bulana kadar daha fazla arar. Ve dördüncü fraktal birinciden daha düşük... Durumda yazan şey bu.

Koşul tamamlanırsa

Bu da yanlış yazdıracaktır.

durumu tersine çevirdi
 if (fr2>fr1) return ( true );
         else break ;

Yanlış yazdırır, ancak koşul karşılanır.

aqa1

 

İkinci döngü her zaman ilk döngüde bulunan fraktalın fiyatını verir.

   for (i=nf+ num_bar; i<k; i++) 
     {
      fx= iFractals (sy,tf, MODE_UPPER ,i);
       if (fx!= EMPTY_VALUE ) 
        {
        fr2= NormalizeDouble (fx, d);
         return ( NormalizeDouble (fr2, d));
         //if(fr2>fr1) return(true);
         //else break;
        }
     }
 
Ghabo :

İkinci döngü her zaman ilk döngüde bulunan fraktalın fiyatını verir.

Bence mantıkla ilgili bir problemin var.

Arama sırasını basit kelimelerle açıklamaya çalışın. Yazdığınız her şeyin doğru olup olmadığını düşünün. Ve ancak o zaman, sıra numarasıyla bulunan fraktalın fiyatını döndürecek bir arama işlevi yapın. Bir kez yaptığınızda, seri numarası ile belirtilen fraktalın doğru fiyatını döndürür, bu nedenle arka arkaya bir sonraki fraktalın fiyatını bulmak için mantık oluşturmaya başlayın (o anda fiyatını döndüren bir işleve zaten sahip olacaksınız). ). Ve sonra sadece bu fiyatları karşılaştırmak için kalır.

Ve hepiniz aynı anda bir yığın çitin içindesiniz.

 

Belki nasıl çalıştığını yanlış anlıyorum?

İlk önce bir fraktal buluyorum, ilki MA'nın üzerinde - (1 numaralı ekranda işaretli),

 int     i,k= iBars (sy,tf),kf,num_bar;

   for (i=nf+ 2 ; i<k; i++) 
     {
      f= iFractals (sy,tf, MODE_UPPER ,i);
      MA= iMA ( NULL , 0 , 35 , 0 , MODE_EMA , PRICE_CLOSE ,i);
       if (f!= EMPTY_VALUE ) 
        {
         // kf++;
         if (f>MA) {num_bar=i; fr1= NormalizeDouble (f, d); break ;}
         
        }
     }

ondan, tarihe bakıyorum, ilk karşılaştığım fraktal (ekranda 2 numara ile işaretlenmiş). Fraktal #2, fraktal #1'den büyükse, true değerini döndürürüm.

       for (i=nf+ num_bar; i<k; i++) 
     {
      fx= iFractals (sy,tf, MODE_UPPER ,i);
       if (fx!= EMPTY_VALUE ) 
        {
        fr2= NormalizeDouble (fx, d);
         if (fr2>fr1) return ( true );
         else break ;
        }
     }

Her şey yolunda mı?

aq11

 
Artyom Trishkin :

sıra numarasıyla bulunan fraktalın fiyatını döndürür.

Sayıya göre değil, fraktalın MA'nın üzerinde olması koşulunu arıyorum, sıra sayısı herhangi bir şey olabilir. Bu fraktalin birinci çevrimdeki fiyatı "fr1" değişkenine doğru yazılmıştır.

Eğer doğru anladıysam sorun ikinci devrede. 2 numaralı fraktalın fiyatı neden bulunamıyor, belli değil

 
Ghabo :

Sayıya göre değil, fraktalın MA'nın üzerinde olması koşulunu arıyorum, sıra sayısı herhangi bir şey olabilir. Bu fraktalin birinci çevrimdeki fiyatı "fr1" değişkenine doğru yazılmıştır.

Eğer doğru anladıysam sorun ikinci devrede. 2 numaralı fraktalın fiyatı neden bulunamıyor, belli değil

Tüm mantığı yeniden anlatmak zorundasın. Kendi başına düşünebileceğin bir şey var mı?

1. İlk döngüde, MA'nın üzerinde bir fraktal buluyoruz. num_bar değişkenine bar numarasını yazıyoruz (ekranda, bar No. 11)

2. İkinci döngüde, koşulu sağlayan ikinci fraktal aramaya başlarız. Aramaya num_bar... çubuğundan, yani 11 numaralı çubuktan başlıyoruz, çünkü nf sıfıra eşittir.

3. Fraktal bulundu. Değer öncekine eşittir. Koşul karşılanmayacak, çünkü koşulda o zaman > sonra < ama eşit değil. Ve eğer == koyarsanız, sadece diğer tarafta aynı çöp olacaktır.

Görünüşe göre, bir sonraki num_bar+1 veya hatta +2 çubuğundan ikinci fraktal aramanız gerekiyor.

 
Alexey Viktorov :

Tüm mantığı yeniden anlatmak zorundasın. Kendi başına düşünebileceğin bir şey var mı?

1. İlk döngüde, MA'nın üzerinde bir fraktal buluyoruz. num_bar değişkenine çubuğun numarasını yazıyoruz (ekranda, bar No. 11)

2. İkinci döngüde, koşulu sağlayan ikinci fraktalı aramaya başlarız. Aramaya num_bar... çubuğundan, yani 11 numaralı çubuktan başlıyoruz, çünkü nf sıfıra eşittir.

3. Fraktal bulundu. Değer öncekine eşittir. Koşul karşılanmayacak, çünkü koşulda o zaman > sonra < ama eşit değil. Ve eğer == koyarsanız, sadece diğer tarafta aynı çöp olacaktır.

Görünüşe göre bir sonraki num_bar+1 veya hatta +2 çubuğundan ikinci fraktal aramak gerekiyor.

Genel olarak, ilk iki paragraftaki eylemleri dile getirdim)

"num_bar+1" için teşekkür ederiz.

Minimumu bulamıyor.

Koşul karşılanmadı, ok ayarlandı, ok ayarlanmadı.

Koşul şu ki, fiyat ile MA'nın kesişme noktaları arasında MA'yı geçen mumun dip noktasından iLowest low'a olan mesafe 100'den büyük veya ona eşitse, bir ok koyarım.

   if (limit> 60 )limit= 60 ;
   for ( int i=limit; i> 0 ; i--)
     {
      M11= iMA ( NULL , 0 ,period,shift_,method,price,i+ 1 );
       if (open[i+ 1 ]>M11 && close[i+ 1 ]<M11){time_1=time[i+ 1 ];}

      indexS1= iBarShift ( NULL , PERIOD_CURRENT ,time_1, false );

       if (open[i+ 1 ]<M11 && close[i+ 1 ]>M11){time_2=time[i+ 1 ];}

      indexS2= iBarShift ( NULL , PERIOD_CURRENT ,time_2, false );

       //
       double val= 0 ;
       //--- расчет минимального значения цены на indexS1 последовательных барах 
       //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
       int val_index= iLowest ( NULL , 0 , MODE_LOW ,indexS1,i+indexS2);
       if (val_index!=- 1 ) val= Low [val_index];
       else PrintFormat ( "Ошибка вызова iLowest. Код ошибки=%d" , GetLastError ());

       if (low[indexS1]-val>= 100 * Point )
        {
        BufferPointDn1[i]=high[i];
        }
       //
     }

B'den A'ya, minimum C'yi buluyorum.

A-C=100 pip B noktasına bir ok koymalıdır.

Neden koymuyorsun?

düşük1

 
Ghabo :

Genel olarak, ilk iki paragraftaki eylemleri dile getirdim)

İkinci nokta biraz yanlıştı. Akıl yürütmenizde, nerede aramaya başladıklarının ve ne zaman hangi değeri elde ettiğimizin bir tanımı yoktu. Yani, biraz daha ileriye bakmanız gerektiği fikrini iten şey budur.

Gabo :

Minimumu bulamıyor.

Koşul karşılanmadı, ok ayarlandı, ok ayarlanmadı.

Koşul şu ki, fiyat ile MA'nın kesişme noktaları arasında MA'yı geçen mumun dip noktasından iLowest low'a olan mesafe 100'den büyük veya ona eşitse, bir ok koyarım.

B'den A'ya, minimum C'yi buluyorum.

A-C=100 pip B noktasına bir ok koymalıdır.

Neden koymuyorsun?

Bu kodda da bir şeyin mantığını yakalaması zor.

En azından, indexS1 ve indexS2 değişkenlerinin nerede ve nasıl bildirildiğini, her onayda sıfırlanıp sıfırlanmadıklarını bilmeniz gerekir.

MA bir boşluğa geçerse ne olur?


Ve bir soru daha: hata ayıklayıcıyı nasıl kullanacağınızı biliyor musunuz?