MQL5-Fehler bei der Arbeit mit iClose/iOpen-Zeitreihenzugriff usw. - Seite 5

 
Renat Fatkhullin:

Bitte zeigen Sie mir den Referenzcode des Indikators, der immer die letzten 2000 Ticks eines jeden Symbols von Market Watch aufbewahrt.

Andernfalls gibt es auf der einen Seite Vermutungen und auf der anderen Seite nur Empfehlungen in Form von Worten.

 
Renat Fatkhullin:

Ich muss mir den Code ansehen.

Der obige Code hat eindeutig eine Reihe von logischen und Ressourcenproblemen.

Ich bin dabei, etwas Ähnliches zu tun, bitte beraten Sie, wie und was zu optimieren, wenn nötig:

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
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      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Ich muss mir den Code ansehen.

Der obige Code hat eindeutig eine Reihe von logischen und Ressourcenproblemen.

Gibt es ein logisches Problem in diesem Code, oder übersehe ich etwas?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

MQL5 Fehler in iClose/iOpen Zeitreihenzugriff, etc.

Stanislav Dray, 2018.11.14 16:28

Ihre Einstellung zu Fehlerberichten ist seltsam. Es ist ja nicht so, dass ich dafür bezahlt werde, etwas zu beweisen. Ich habe die Situation so gut wie möglich geschildert.

Ich bin nicht der Einzige mit dem Problem, das Problem trat nach dem 30. Update auf, aber Sie unterstellen mir immer noch, dass ich ein Narr bin und geben irgendwelchen zurückgebliebenen Indikatoren die Schuld.

Waren sie davor nicht ein Jahr lang zu langsam?

Hier ist ein Beispiel für einen Code, der 25 Minuten nach dem Start auf M30 hängen bleibt:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Sie sollten den Indikator in dem Bewusstsein schreiben, dass Sie nicht alles auf einmal bekommen werden.

In OnInit müssen Sie das Laden der Historie der benötigten Instrumente durch einzelne Aufrufe von CopyXXX anregen, aber Sie müssen auf die vollständige Initialisierung in OnCalculate warten.

Ihre Initialisierungsphase scheint einen Fehler zu haben - Sie warten fälschlicherweise auf Daten und blockieren.

Ich werde versuchen, dies zu tun,

Jetzt stelle ich Anfragen an OnCalculate und warte dort (natürlich nicht bei jedem Tick, sondern nur beim ersten Mal der Berechnung).

 
fxsaber:

Bitte zeigen Sie mir den Referenzcode des Indikators, der immer die letzten 2000 Ticks eines jeden Symbols von Market Watch aufbewahrt.

Ich bin mir nicht sicher, wie ich es verwenden soll, aber ich bin sicher, dass ich das Recht habe, es zu verwenden.

Ich stimme zu: Es ist besser, nicht einmal für Zecken, sondern für Bars.

Sie benötigen ein Beispiel für einen genehmigten echten Mehrwährungscode.

Andernfalls werden wir im Dunkeln tappen...

 

Ich werde versuchen, den Fehler zu lokalisieren und berichten, sobald ich ihn gefunden habe.

 
transcendreamer:

Ich stimme zu! Besser nicht einmal Zecken, sondern Balken.

Wir brauchen ein Beispiel für einen genehmigten echten Mehrwährungscode.

Sonst tappen wir immer noch im Dunkeln...

Balken und Zecken sind verschiedene Epistasen, die in MT5 unabhängig voneinander leben.
 
Vladimir Karputov:

Es wurde auch immer empfohlen, dass Sie, wenn Sie mit einem anderen Zeitrahmen arbeiten, den OHLC dieses Zeitrahmens einmal pro Minute abrufen sollten (jede CopyXXXX-Funktion). Dies war schon immer der Fall.

Ich wollte schon auf alles spucken, was hier vor sich geht, aber leider habe ich etwa 10 Jahre mit dem MQ-Produkt verbracht.

Jetzt geht es nur noch ums Geschäft. Vladimir Ihren Rat über die Verwendung von CopyXXXX-Funktionen wurde von mir verwendet, weil es keine Schwierigkeiten aus der Sicht meiner nicht-professionell geschriebenen Code war.

Ehrlich gesagt wollte ich, dass das Problem nur in meinen krummen Händen liegt, aber nein, das Problem liegt nicht nur in ihnen. Ich habe einen Screenshot unten, in Erwartung seltsame Erklärungen von technischen Support sagen, dass ich falsch codiert haben und 100500 andere Indikatoren, so was wollen Sie, es wird Probleme geben. Ich habe nicht 100500 andere Indikatoren, es gibt keinen Experten, ich habe nur zwei Tools im Terminal geöffnet, der Indikator-Test läuft auf EURUSD 1M, der Indikator ruft die Daten von M15 Zeitrahmen des gleichen Tools, ich bin nicht versuchen, andere Symbole Daten zu laden, gibt es nur wenige von ihnen in der Marktübersicht.

Das ist eine ideale Situation für das Terminal in Bezug auf die Beladung, was natürlich unter Arbeitsbedingungen nicht der Fall sein wird, aber selbst in diesem Fall gibt es ein Problem, und dieses Problem heißt meiner Meinung nach "BAG".

Im Indikator werden die Funktionen iClose und iBars nur aufgerufen, um den Zustand in Commet() wiederzugeben. In der Marktübersicht zum Zeitpunkt der Erstellung des Screenshots ist der aktuelle Stand des Aufrufs der Funktionen iClose und iBars im Terminalfenster zu sehen, außerdem verwendet der Berechnungsteil des Indikators die Funktion CopyXXXX.

BAG

Wie Sie sehen können, wurde der Indikator um 16:31 Uhr neu geladen und funktionierte erfolgreich (ich war sogar zufrieden), aber die Aktualisierung der iClose-Daten wurde nach 00:15 Uhr gestoppt, bzw. die CopyXXXX-Funktion liefert auch keine aktualisierten Daten, d.h. der Fehler tritt irgendwo in den Tiefen von MT auf.

Meiner Meinung nach gibt es einen Fehler beim Lesen von Daten aus dem Server, die Gründe können Masse (kein Internet, der Server war beschäftigt, etc.), aber warum die Wiederaufnahme der Arbeit nach der Beseitigung der Ursachen der Kommunikation nicht passieren, so dass ich zu dem Schluss, dass Sie die Benutzer Quellcode so viel wie Sie wollen zu testen, aber wenn Sie einen Server nebenan haben, dieses Problem werden Sie nie zu identifizieren, und es existiert und es tritt nicht nur wegen der schlechten Hand Coder.

 

Außerdem habe ich gestern beschlossen, den Code von Stanislav zu testen. Nach ein paar Stunden wurde die Zeit nicht mehr aktualisiert. Ich habe den Zeitrahmen nicht gewechselt, sondern ihn nur über das Kontextmenü des Charts aktualisiert, und die Zeit ging weiter.

Heute habe ich den Code ein wenig geändert, um die Uhrzeit und den aktuellen Zeitrahmen anzuzeigen.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

Nach 15 Minuten wurde die Aktualisierung im "nicht nativen" Zeitrahmen gestoppt, aber im aktuellen Zeitrahmen wurde sie normal aktualisiert. Nach dem Aktualisieren der Grafik hat die Zeit wieder begonnen.

Das Terminal läuft im portablen Modus. Das System und das Terminal selbst befinden sich auf einer SSD-Platte.


 

Ich weiß nicht, was passiert ist, aber als ich den Bot für die letzte MQ Championship in MQL5 geschrieben habe, war er mehrwährungsfähig und ich habe keine Probleme beim Laden von Daten aus anderen Instrumenten festgestellt.

Es hat zwar viele Ressourcen verbraucht, aber es hat das erwartete Ergebnis gebracht, und nicht ein Roulettespiel wie jetzt.

Dieses Problem, zum Beispiel als Entwickler kommerzieller Produkte für MQL5, wirft kein gutes Licht auf mich, und es ist doppelt unangenehm, wenn jemand für ein auf dem Markt gekauftes Produkt bezahlt und es wegen solcher "BOGS" einfach nur fehlerhaft aussieht.

Grund der Beschwerde: