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

 
Artyom Trishkin :

hesaplamalar nelerdir?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Her şeyi anladım, soru kaldırıldı, sizden haber aldım ve OnTick() bölgesinde bir değişken bildirmenin kötü olduğunu ve döngü içinde de hesaplamalar yapılabileceğini fark ettim.

Bitti, her şey çalışıyor teşekkürler, fiyatları almaya devam ediyor. Çok teşekkürler.

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky :

Her şeyi anladım, soru kaldırıldı, sizden haber aldım ve OnTick() bölgesinde bir değişken bildirmenin kötü olduğunu ve döngü içinde de hesaplamalar yapılabileceğini fark ettim.

Bitti, her şey çalışıyor teşekkürler, fiyatları almaya devam ediyor. Çok teşekkürler.

Bu, döngü içindeki hesaplamalarınız değil, bu döngünün oluşturulduğu gerekli verileri elde etmektir.

Ancak döngü içindeki hesaplamalardan kaçınılmalıdır.

Genel olarak, yaklaşımı hemen yeniden gözden geçirmeniz gerekir. Verileri bir döngü içinde alırsınız. İlk sayaç verisinden sonra döngüyü bozarsınız. Bütün bunlar, istenen sonucu döndürmek için bir işlev kavramına tamamen gömülüdür.

Tüm döngüyü bir işleve dönüştürün ve bulunursa ondan çubuk numarasını veya bulunmazsa WRONG_VALUE - döndürün.

sonra: n=Func() ;

ve ardından WRONG_VALUE değerine eşit değilse n'yi amaçlandığı gibi kullanın. İşleve "konuşan" bir ad verin. Ve OnTick() içindeki kod daha kısa olacak ve mantık daha net olacak - fazladan hiçbir şey yüklenmeyecek.

 
Artyom Trishkin :

Tüm döngüyü bir işleve dönüştürün ve bulunursa ondan çubuk numarasını veya bulunmazsa WRONG_VALUE - döndürün.

sonra: n=Func() ;

ve ardından WRONG_VALUE değerine eşit değilse n'yi amaçlandığı gibi kullanın. İşleve "konuşan" bir ad verin. Ve OnTick() içindeki kod daha kısa olacak ve mantık daha net olacak - fazladan hiçbir şey yüklenmeyecek.

Yaşa ve öğren. Çok ilginç, akşam savaşacağım, kesinlikle başaracağım. Bu arada rapor olarak ve sizlere çok teşekkür ederek fiyatları da aldım..... Başarılı bir gündü :-))

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }
 

Bu soruya yardımcı olabilecek arkadaşlar https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - yorum çok mu ileri gitti? Bir de artım başlatmanız gerekiyorsa, eksiltmeye başlamanız gerekiyorsa, herhangi bir yönde çalışabilen bir döngü nasıl oluşturulur gibi bir soru var? İşte nasıl olacağına dair örnek bir diyagram.

(Bir şey olduysa) {değerler değişkenlere atanır} o zaman bir döngü çağrılır ve hesaplamaları döngünün değerlerine bağlı olacak bir gövde içerecektir.

for (artırma veya azaltma üzerindeki değişkenlere bağlı olarak)

{ gövde }

Koşulu çoğaltmanın bir yolu yoktur; döngüde bir kez belirtilmelidir. Bunu yapabilmek mümkün mü.

 

Ve tekrar iyi akşamlar. Henüz bir işlev olarak bir işlev yayınlamadım, ancak yeni bir soru ortaya çıktı. Ekteki resim yeni bir sinyalin (Ok) ortaya çıktığını gösteriyor ve yorumlarda danışmanın bunu algılamadığı görülüyor, hala 11 mum önce olanı aşırı Yukarı ok olarak görüyor.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky :

11 mum geri.

Göstergenin zaten yeni bir sinyal verdiği ortaya çıktı (tabloda başlatıldığı danışmana paralel olarak), danışmanda OnTick dışında hiçbir olay yok ve danışman sinyali görmüyor.

 
Sergey Voytsekhovsky :

Ve tekrar iyi akşamlar. Henüz bir işlev olarak bir işlev yayınlamadım, ancak yeni bir soru ortaya çıktı. Ekteki resim yeni bir sinyalin (Ok) ortaya çıktığını gösteriyor ve yorumlarda danışmanın bunu algılamadığı görülüyor, hala 11 mum önce olanı aşırı Yukarı ok olarak görüyor.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Boş olmayan bir arabellek değeri bulurken, günlükte n çubuğuna karşılık gelen zamanı yazdırın. Hangi barı bulduğu görülecektir. Tamponu geriye doğru okuyor olabilirsiniz.

 

Uzmanlar, lütfen bana danışmanın neden aşırı oku görmediğini söyleyin, zaten gösterge arabelleğinde, veri penceresine bakılırsa, danışman OnTik'i yokluyor, başka neye ihtiyacı var ??? Yukarıdaki tam kod.


 
Artyom Trishkin :

Boş olmayan bir arabellek değeri bulurken, günlükte n çubuğuna karşılık gelen zamanı yazdırın. Hangi barı bulduğu görülecektir. Tamponu geriye doğru okuyor olabilirsiniz.

Tamam yaptım, zaman doğru olanı gösteriyor, okun ayarlandığı mumun açılma zamanı. Kodu ekliyorum, bir resim ekliyorum.

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }


 

Günlük resimde görünmüyorsa, işte birkaç aşırı giriş


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00