Hatalar, hatalar, sorular - sayfa 12

 

Geceleri çok garip bir şey fark ettim, çubuğun başlangıç zamanı bir hatayla işleniyor - hata bir dakikadan fazlaydı. Şimdi kontrol etmeye karar verdim, bir test göstergesi oluşturdum

 #property indicator_chart_window
datetime old_time= 0 ;
int      MaxBars= 10 ;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()  { return ( 0 );}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                const int prev_calculated,
                const datetime & time[],
                const double & open[],
                const double & high[],
                const double & low[],
                const double & close[],
                const long & tick_volume[],
                const long & volume[],
                const int & spread[])
  {
   if (rates_total< 10 ) return ( 0 );  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if (prev_calculated== 0 ) 
      {
      old_time= 0 ;
      count_tick= 0 ;
      start_pos=rates_total- 3 ;
      }
   else start_pos=prev_calculated- 1 ;
//--- расчет 
   for ( int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct ( TimeCurrent (),str1); // время сервера
      TimeToStruct (time[i],      str2); // время бара  
      if (str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print ( "тик №=" ,count_tick, " i=" , i, " c=" ,close[i], " time[i]=" ,time[i], " time=" , TimeCurrent (), " delta=" ,str1.sec);
      }   
      } // end for(...
   return (rates_total);
  }
Kayıt

2010.06.18 10:42:03   prov_tick (EURUSD,M1)       tick #=6 i=50558 c=1,23797 saat[i]=2010.06.18 08:41:00 saat=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59   prov_tick (EURUSD,M1)       tick #=5 i=50557 c=1,23848 saat[i]=2010.06.18 08:40:00 saat=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01   prov_tick (EURUSD,M1)       tick #=4 i=50556 c=1.23862 saat[i]=2010.06.18 08:39:00 saat=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03   prov_tick (EURUSD,M1)       tick #=3 i=50555 c=1.23881 saat[i]=2010.06.18 08:38:00 saat=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30   prov_tick (EURUSD,M1)       tick #=2 i=50554 c=1,23859 saat[i]=2010.06.18 08:37:00 saat=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30   prov_tick (EURUSD,M1)       tick #=1 i=50553 c=1.23858 saat[i]=2010.06.18 08:36:00 saat=2010.06.18 08:38:31 delta=31

İlk iki tik açık, bu göstergenin lansmanı. Ve işte sonrakiler... Sunucu saatine göre yeni bir barın uzun süredir devam ettiği ve bu tik eski bara ait olduğu ortaya çıktı. Geceleri bu delta genellikle bir kabus olur...

Geliştiricilere soru bu bir hata mı? Yoksa böyle mi amaçlanıyordu?

ZY bunu günlüğe yazarken

2010.06.18 10:45:09   prov_tick (EURUSD,M1)       tick #=9 i=50561 c=1,23787 saat[i]=2010.06.18 08:44:00 saat=2010.06.18 08:45:12 delta=12

Dosyalar:
prov_tick.mq5  2 kb
 
Prival :

Geceleri çok garip bir şey fark ettim, çubuğun başlangıç zamanı bir hatayla işleniyor - hata bir dakikadan fazlaydı. Şimdi kontrol etmeye karar verdim, bir test göstergesi oluşturdum


Çıktıya oranları_toplam değerini eklerseniz, mevcut dakikaları bir önceki çubuğun dakikalarıyla karşılaştırdığınızda hataların oluştuğunu göreceksiniz.

 2010.06 . 18 11 : 53 : 18     prov_tick_src (EURUSD,M1)       тик №= 4 i= 51420 rates_total= 51422 c= 1.23997 time[i]= 2010.06 . 18 09 : 51 : 00 time= 2010.06 . 18 09 : 52 : 06 delta= 6
2010.06 . 18 11 : 52 : 12     prov_tick_src (EURUSD,M1)       тик №= 3 i= 51419 rates_total= 51421 c= 1.24061 time[i]= 2010.06 . 18 09 : 50 : 00 time= 2010.06 . 18 09 : 51 : 00 delta= 0

Yani, zaman[oran_toplam-2].

Ek olarak, deltanın çıktısı tamamen net değildir.

https://www.mql5.com/ru/docs/basis/function/events#oncalculate diyor ki:

open[], high[], low[] ve close[] parametreleri, mevcut zaman çerçevesinin açılış fiyatları, yüksek, düşük ve kapanış fiyatlarına sahip dizileri içerir. time[] parametresi, açılış zamanı değerlerine sahip bir dizi içerir , spread[] parametresi, spreadlerin geçmişini içeren bir dizi içerir (bu işlem aracı için bir spread sağlanmışsa). Volume[] ve tick_volume[] parametreleri sırasıyla ticaretin ve tik hacminin geçmişini içerir.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival :

Geceleri çok garip bir şey fark ettim, çubuğun başlangıç zamanı bir hatayla işleniyor - hata bir dakikadan fazlaydı. Şimdi kontrol etmeye karar verdim, bir test göstergesi oluşturdum

Kayıt

2010.06.18 10:42:03    prov_tick (EURUSD,M1)        tick #=6 i=50558 c=1,23797 saat[i]=2010.06.18 08:41:00 saat=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59    prov_tick (EURUSD,M1)        tick #=5 i=50557 c=1.23848 saat[i]=2010.06.18 08:40:00 saat=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01    prov_tick (EURUSD,M1)        tick #=4 i=50556 c=1.23862 saat[i]=2010.06.18 08:39:00 saat=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03    prov_tick (EURUSD,M1)        tick #=3 i=50555 c=1.23881 saat[i]=2010.06.18 08:38:00 saat=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30    prov_tick (EURUSD,M1)        tick #=2 i=50554 c=1,23859 saat[i]=2010.06.18 08:37:00 saat=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30    prov_tick (EURUSD,M1)        tick #=1 i=50553 c=1.23858 saat[i]=2010.06.18 08:36:00 saat=2010.06.18 08:38:31 delta=31

İlk iki tik açık, bu göstergenin lansmanı. Ve işte sonrakiler... Sunucu saatine göre yeni bir barın uzun süredir devam ettiği ve bu tik eski bara ait olduğu ortaya çıktı. Geceleri bu delta genellikle bir kabustur...

Geliştiricilere soru bu bir hata mı? Yoksa böyle mi amaçlanıyordu?

ZY bunu günlüğe yazarken

2010.06.18 10:45:09    prov_tick (EURUSD,M1)        tick #=9 i=50561 c=1,23787 saat[i]=2010.06.18 08:44:00 saat=2010.06.18 08:45:12 delta=12

Aşağıdaki gibi kontrol etmeye çalışın. Döngü yok.

       TimeToStruct ( TimeCurrent (),      str1); // время сервера
       TimeToStruct (time[ rates_total- 1 ],str2); // время последнего бара  

Metinde daha fazla.

 
stringo :

Aşağıdaki gibi kontrol etmeye çalışın. Döngü yok.

Metinde daha fazla.

oops anladım. teşekkür etmek. Döngünün içinde bir kontrol yaptım

   if (old_time<time[i]) 
         {
         Print ( "НОВЫЙ бар" );
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if (old_time<time[rates_total- 1 ]) // работаем только по завершенным барам
         {
         Print ( "НОВЫЙ бар" );
         old_time=time[rates_total- 1 ];
         //...
         } 

Yeni bir barın ortaya çıkması sırasında değişmedim. Ekonomik olarak değil, aynı veriler yeniden hesaplanır. Rağmen...

durum şu: https://book.mql4.com/ru/samples/icustom fig.119 MQL5'te hariç tutuluyor, değilse? ve böyle bir gösterge şablonu her zaman doğru kapanışı verir mi? Yoksa tuzaklar mı var?

 input int   MaxBars= 240 ;
datetime old_time= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()  { return ( 0 );}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                const int prev_calculated,
                const datetime & time[],
                const double & open[],
                const double & high[],
                const double & low[],
                const double & close[],
                const long & tick_volume[],
                const long & volume[],
                const int & spread[])
  {
//---
   if (prev_calculated== 0 ) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total- 1 ];
      }
// работаем только по завершенным барам
   if (old_time<time[rates_total- 1 ]) 
      {
      old_time=time[rates_total- 1 ];
      Print ( "НОВЫЙ бар close[1]=", close[rates_total- 2 ]);
      }  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
ZY bilim için teşekkürler
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294 :
Ayrıca test cihazıyla ilgili bir tür şeytanlığım var, danışmanımı başlatmaya başlıyorum, tüm terminal test cihazında çöküyor, grafiğe atarsam her şey yolunda. diğer Uzman Danışmanlar test cihazında iyi çalışır.

Yaklaşık 110 parametrenin (ve yani soruların) bir garanti ile sindirilebileceği deneysel olarak elde edilmiş ve kanıtlanmıştır. 120'de, test cihazında EA belirtilmişse terminal çöker.


PM'de zaten bazı çözümler verdim, ancak herhangi bir şey varsa, bu soru ile geliştiricilerle de iletişime geçebilirsiniz. Bence bu sınırlamayı aşmada yardımcı olmalılar ...

 
Interesting :

Yaklaşık 110 parametrenin (ve yani soruların) bir garanti ile sindirilebileceği deneysel olarak elde edilmiş ve kanıtlanmıştır. 120'de, test cihazında EA belirtilmişse terminal çöker.


PM'de zaten bazı çözümler verdim, ancak herhangi bir şey varsa, bu soru ile geliştiricilerle de iletişime geçebilirsiniz. Bence bu sınırlamayı aşmada yardımcı olmalılar ...

Tabii ki, böyle bir kısıtlamanın testçiyi etkilemesi garip. Dördüncüsü, örneğin, böyle bir sorun yoktur.
 

Hafta sonu fiyatları şu anda çalışmıyor. betiği çalıştırıyorum

Yazdır( ZamanCurrent() );

sonuç

2010.06.20 00:26:06 00 (USDJPY,M1) 2010.06.18 22:35:52

son çubuğun saati olmasına rağmen 2010.06.18 23:00:00

garip olduğu için, bazı işlevlerin doğru çalışıp çalışmadığını test etmek çok elverişsizdir.

 

Gösterge ayarları penceresindeki "Uygula" düğmesi eksik.


 
Interesting :

Yaklaşık 110 parametrenin (ve yani soruların) bir garanti ile sindirilebileceği deneysel olarak elde edilmiş ve kanıtlanmıştır. 120'de, test cihazında EA belirtilmişse terminal çöker.

PM'de zaten bazı çözümler verdim, ancak herhangi bir şey varsa, bu soru ile geliştiricilerle de iletişime geçebilirsiniz. Bence bu sınırlamayı aşmada yardımcı olmalılar ...

64 parametreye kadar optimize edebilirsiniz.
 
stringo :
64 parametreye kadar optimize edebilirsiniz.
64'ü optimize edin ve test cihazında yaklaşık 110 kullanın (optimizasyon olmadan). Her ne kadar 110, elbette, bir Uzman Danışman için "kabus" sayıda parametre olsa da (ama oluyor)...