Fehler, Irrtümer, Fragen - Seite 12

 

Während der Nacht ist mir eine sehr merkwürdige Sache aufgefallen, die Startzeit der Bar wird mit einem Fehler wiedergegeben - der Fehler betrug mehr als eine Minute. Jetzt möchte ich es überprüfen und habe einen Testindikator erstellt

#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);
  }
Protokoll

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=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 time[i]=2010.06.18 08:40:00 time=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 time[i]=2010.06.18 08:39:00 time=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 time[i]=2010.06.18 08:38:00 time=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 time[i]=2010.06.18 08:37:00 time=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 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Die ersten beiden Ticks sind eindeutig, es ist ein Indikator für den Start. Aber die nächsten .... Es stellt sich heraus, dass es einen neuen Balken nach der Serverzeit gibt, während dieser Tick zu dem alten Balken gehört. Nachts ist dieses Delta ein Alptraum...

Frage an die Entwickler: Ist das ein Bug? Oder war das so gedacht?

Z.I. Während ich dies schreibe, erscheint das folgende im Protokoll

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

Dateien:
prov_tick.mq5  2 kb
 
Prival:

Während der Nacht habe ich eine sehr merkwürdige Sache bemerkt, die Startzeit der Bar wird mit einem Fehler wiedergegeben - der Fehler betrug mehr als eine Minute. Jetzt habe ich beschlossen, das zu überprüfen und einen Testindikator erstellt


Wenn Sie den Wert von rates_total zur Ausgabe hinzufügen, werden Sie sehen, dass Fehler auftreten, wenn Sie die Minuten des aktuellen Balkens mit den Minuten des vorherigen Balkens vergleichen.

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

Das heißt, die Zeit[rates_total-2].

Auch der Delta-Ausgang ist nicht ganz klar.

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

Die Parameter open[], high[], low[] und close[] enthalten Arrays mit dem Eröffnungs-, Höchst-, Tiefst- und Schlusskurs des aktuellen Zeitrahmens. Der Parameter time[] enthält ein Array mit den Werten der offenen Zeit, der Parameter spread[] enthält ein Array mit der Historie der Spreads (wenn ein Spread für ein Handelsinstrument angegeben ist). Die Parameter volume[] und tick_volume[] enthalten die Historie des Handels- bzw. Tickvolumens.

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

Während der Nacht habe ich eine sehr merkwürdige Sache bemerkt, die Startzeit der Bar wird mit einem Fehler wiedergegeben - der Fehler betrug mehr als eine Minute. Ich habe beschlossen, das jetzt zu überprüfen und habe einen Testindikator erstellt

Protokoll

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=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 time[i]=2010.06.18 08:40:00 time=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 time[i]=2010.06.18 08:39:00 time=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 time[i]=2010.06.18 08:38:00 time=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 time[i]=2010.06.18 08:37:00 time=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 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Die ersten beiden Ticks sind eindeutig, es ist ein Indikator für den Start. Aber die nächsten .... Es stellt sich heraus, dass es einen neuen Balken nach der Serverzeit gibt, während dieser Tick zu dem alten Balken gehört. Nachts ist dieses Delta ein Alptraum...

Frage an die Entwickler: Ist es ein Fehler oder wurde es so entworfen?

Z.I. Während ich dies schreibe, erscheint das folgende im Protokoll

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

Versuchen Sie, wie folgt zu testen. Ohne Schleife.

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

Weiter im Text.

 
stringo:

Versuchen Sie, wie folgt zu prüfen. Ohne Zyklus.

Folgen Sie dann dem Text.

Ups. Verstanden. Danke. Ich habe eine Prüfung innerhalb der Schleife durchgeführt.

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

Zum Zeitpunkt der neuen Leiste hat sich i nicht geändert. Nicht sparsam, die gleichen Daten werden wiederholt berechnet. Obwohl...

ist diese Situation https://book.mql4.com/ru/samples/icustom fig.119 in MQL5 ausgeschlossen, wenn nicht? und diese Indikatorvorlage wird immer korrekte Ausgabe schließen? oder gibt es irgendwelche Fallstricke?

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);
  }
P.S.: Danke für die Wissenschaft
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
Wenn ich beginne, meinen EA auszuführen, stürzt das gesamte Terminal im Tester ab, aber wenn ich es auf einen Chart lege, ist alles in Ordnung.

Die Erfahrung hat gezeigt, dass etwa 110 Parameter verdaut werden können (und es gibt Fragen). Bei 120 stürzt das Terminal ab, wenn der Expert Advisor im Testgerät angegeben ist.


Ich habe bereits einige Lösungen unter vier Augen gegeben, aber wenn etwas passiert, können Sie auch die Entwickler fragen. Ich denke, sie könnten bei dieser Einschränkung helfen...

 
Interesting:

Die Erfahrung hat gezeigt, dass etwa 110 Parameter verdaut werden können (und es gibt Fragen). Bei 120 stürzt das Terminal ab, wenn der Expert Advisor im Testgerät angegeben ist.


Ich habe bereits einige Lösungen in privatem Rahmen gegeben, aber wenn etwas, können Sie die Entwickler fragen. Ich denke, sie könnten bei dieser Einschränkung helfen...

Es ist natürlich seltsam, dass eine solche Einschränkung den Prüfer betrifft. In Quad zum Beispiel gibt es kein solches Problem
 

Jetzt kommen die Wochenendkurse nicht mehr. Ich führe das Skript aus.

Print(TimeCurrent());

Ergebnis

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

obwohl der letzte Balken die Zeit 2010.06.18 23:00:00 hat

es scheint seltsam, sehr unbequem zu sein, die Korrektheit einiger Funktionen zu testen.

 

Die Schaltfläche "Übernehmen" im Fenster der Indikatoreinstellungen fehlt.


 
Interesting:

Die Erfahrung hat gezeigt, dass etwa 110 Parameter verdaut werden können (und es gibt Fragen). Bei 120 stürzt das Terminal ab, wenn der Expert Advisor im Testgerät angegeben ist.

Ich habe bereits einige Lösungen in privatem Rahmen gegeben, aber wenn etwas, können Sie die Entwickler fragen. Ich denke, sie könnten bei dieser Einschränkung helfen...

Sie können bis zu 64 Parameter optimieren.
 
stringo:
Es können bis zu 64 Parameter optimiert werden.
Optimieren Sie 64 und verwenden Sie ca. 110 im Testgerät (ohne Optimierung). Obwohl 110 natürlich schon eine "Albtraum"-Anzahl von Parametern für den Expert Advisor ist (aber es kommt vor)...