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

 
Da es sich bei den Entwicklern eindeutig um Fachleute handelt, die sich mit Architektur und Geschwindigkeitsoptimierung auskennen, dürfte es ihnen nicht schwer fallen, eine solche Funktion korrekt zu schreiben und sie in die Standardbibliothek aufzunehmen, wofür die Benutzer sehr dankbar sein werden.
 
Renat Fatkhullin:

Denken Sie darüber nach, wo die Daten (desto mehr ist es garantiert) zur Verfügung stehen werden, wenn Ihre Indikatoren ungeheuer langsam Empfang / Legen Ticks, verbringen Hunderte von Millisekunden oder sogar Sekunden für einen Tick. Infolgedessen reicht die Zeit der CPU nicht aus, um die Ticks zu verarbeiten, was sich in einem zunehmenden Defizit und einem entsprechenden Stillstand in der Chart-Historie niederschlägt.

Wenn Sie um "garantiertes Geben" bitten, ist das höchstwahrscheinlich eine Bitte von "ich will nichts wissen, ich will weiter schreiben wie ich will, ich will nicht über Leistung und Sperren nachdenken, einfach geben"?


Wenn Ihnen Millionen von Barren zur Verfügung stehen, sollten Sie sich Gedanken über die Leistung Ihrer und anderer Indikatoren machen. Ein schlecht geschriebener und teurer Indikator kann leicht die Aktualisierung des Charts für sein Symbol blockieren.

Beginnen Sie mit der Messung der OnCalculate-Reaktionszeit in Mikrosekunden. Teilen Sie dann 1 Sekunde durch die durchschnittliche Tick-Reaktionszeit, um den maximalen Tick-Durchsatz des Indikators in Ticks pro Sekunde zu erhalten.

Dies ist sofort ernüchternd.

Für die neue Art der Datenverarbeitung durch den Indikator in der vorgeschlagenen Version bleibt nur ein Tick (neuer Balken) übrig. Wer mehrere Neuberechnungen des Nullbalkens und des Grals im Nullbalken mag, sollte die bestehende Version verwenden. Fügen Sie eine neue Funktion zu OnInit - iOnCalculate - ein Handle zu einer der TF-Funktionen / OnCalculate im Indikator, wie iCustom, aber es ist etwas näher, die Indikator-Puffer auf OnCalculate sollte an das Handle iOnCalculate gebunden werden. In den Indikatorfunktionen wie OnCalculate wird nur ein neuer Tickbalken gesendet. Für das Terminal ändert sich nichts, die grundlegende Logik von OnCalculate bleibt gleich, der Hauptteil des Indikators wird hinzugefügt, z.B. OnMain. (Jetzt wird alles von dem/den Indikator(en) erledigt, der/die an den Hauptindikator als Ressource angehängt ist/sind und von diesem bei einem neuen Takt aufgerufen wird).

 
transcendreamer:


Sie brauchen nicht immer Super-Geschwindigkeit, Benutzerfreundlichkeit ist auch sehr wichtig, heutzutage schreiben Multicurrency-Indikatoren ist wie "Untergang der Sonne von Hand", auch in MT4 war es einfacher, weil man immer bekommen konnte es durch i-Funktionen, wenn auch langsam, aber man konnte es bekommen, aber in MT5 können Sie entweder bekommen oder nicht, und Sie müssen noch einen speziellen Code selbst zu machen.

Lassen wir die Theorien beiseite.

Schicken Sie uns einfach ein zu reproduzierendes Beispiel und wir werden sehen, was in Ihrem Fall der Horror ist. Bislang sieht es so aus, als würde man die Leistung völlig außer Acht lassen, Killer-Retardanzeigen verstecken und versuchen, einen Schatten zu werfen.

 
Renat Fatkhullin:

Lassen wir die Theorien beiseite.

Geben Sie einfach ein Beispiel an, das Sie reproduzieren können, und wir werden sehen, welcher Schrecken Ihren Fall umgibt. Bisher sieht es so aus, als würde man die Leistung völlig außer Acht lassen, die tödlichen Verzögerungsanzeigen verstecken und versuchen, einen Schatten darüber zu legen.


Das Beispiel im Anhang ist nicht der fertige Code, es ist an einigen Stellen unvollständig, aber es ist möglich, es auszuführen, ich füge auch eine Vorlage für die Bequemlichkeit,

Ich sage Ihnen gleich, ich bin kein Programmierer, der Code ist sicher nicht optimal, ich bin ein humanitärer Wirtschaftswissenschaftler, ich habe wirklich im MT5 gelitten, im MT4 habe ich weniger gelitten,

Ich möchte wirklich eine einfache und zuverlässige Funktion, die ein synchronisiertes Array wie oben beschrieben https://www.mql5.com/ru/forum/289897/page2#comment_9363454 bauen würde.

Ich beschwere mich nicht, ich bitte nicht darum, meinen Indikator zu schreiben, ich möchte nur (übrigens nicht nur ich) eine schöne Standardfunktion.


EDIT: Die Anhänge wurden korrigiert.

Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
  • 2018.11.14
  • www.mql5.com
Общее обсуждение: Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
Dateien:
 
Renat Fatkhullin:

Tun Sie bitte, was ich Ihnen geraten habe.

Andernfalls benötigen Sie alle Materialien für eine 100%ige Wiedergabe.

Ihre Einstellung zu Fehlerberichten ist seltsam. Es ist ja nicht so, dass ich dafür bezahlt werde, etwas zu beweisen. Ich beschrieb die Situation, so gut ich konnte.

Das Problem ist nicht nur ich, das Problem erschien nach Ihrem 30. Update, aber immer noch Sie unterstellen, dass ich ein Narr bin und es ist alles meine Schuld einige sich langsam bewegende Indikatoren.

Waren sie davor nicht ein Jahr lang zu langsam?

Hier ist ein Beispiel für einen Code, der nach 25 Minuten 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()
  {
//---
   
  }
//+------------------------------------------------------------------+

Und hier ist das Ergebnis:

1

 
transcendreamer:


Das Beispiel in der Anlage, es ist noch nicht vollständig Code, an einigen Stellen nicht geschrieben, aber Sie können es ausführen, ich bin auch eine Vorlage für die Bequemlichkeit anhängen,

Ich kann versprechen, dass ich kein Programmierer bin, sicher ist der Code nicht optimal, ich bin ein humanitärer Wirtschaftswissenschaftler, ich leide wirklich in MT5, ich litt weniger in MT4,

Ich möchte wirklich eine einfache und zuverlässige Funktion, die ein synchronisiertes Array wie oben beschrieben https://www.mql5.com/ru/forum/289897/page2#comment_9363454 bauen würde.

Ich beschwere mich nicht, ich will keinen Ärger,

Ich beschwere mich nicht, ich bitte nicht darum, meinen Indikator für mich zu schreiben, ich möchte nur (übrigens nicht nur ich) eine schöne Standardfunktion.


EDIT: Die Anhänge wurden korrigiert.

Danke, wir werden das jetzt überprüfen.
 
Stanislav Dray:

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 beschrieben, wie ich konnte.

Was ich vorhin in diesem Thread geschrieben habe, ist in keiner Weise als Fehlerbericht zu werten.

Alle gingen nach dem Muster von Beschwerden ohne technische Details vor. Erst nach meinen Nachforschungen kamen die Details ans Licht.

 
Stanislav Dray:

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 beschrieben, wie ich konnte.

Das Problem liegt nicht nur bei mir, 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 nach 25 Minuten auf M30 hängen bleibt:

Und hier ist das Ergebnis:


Hochgeladen

2018.11.14 17:33:32.570 Experts expert Feezzzz (USDCHF,M30) loaded successfully

Es ist jetzt 18.10 Alles funktioniert.


 
transcendreamer:


Das beigefügte Beispiel ist nicht der fertige Code, er ist an einigen Stellen untergeschrieben, aber er läuft noch, und ich füge der Einfachheit halber auch eine Vorlage bei,

Ich werde Ihnen den Code und die Arbeit sofort zeigen:

  1. CopyXXX-Funktionen in Indikatoren warten nicht auf das vollständige synchrone Herunterladen von Daten, sondern geben das weiter, was verfügbar ist. Sonst hätten die Indikatoren alles komplett eingefroren.

  2. Offensichtlich gibt es ein Problem mit dem Follow-up, wenn nicht alle Daten beim ersten Mal synchronisiert wurden.
    Es ist notwendig, in einen sanften Modus zu wechseln: "Ich werde vorsichtig auf das erfolgreiche Herunterladen warten". Zum Beispiel wird OnCalculate nicht aufgerufen.

  3. Das Schlimme daran ist, dass eine globale Initialisierung mit der maximalen Last in OnInit platziert wird, wo der Indikator zählt und sehr lange wartet.
    In diesem Fall wird die Aktualisierung der Charts dieses Symbols blockiert und viele andere Teilnehmer müssen warten und erhalten keine neuen Daten. Der Indikator sollte keine Ressourcen für eine lange Zeit in Anspruch nehmen. Es ist besser, die lange Initialisierung Schritt für Schritt/Symbolinitialisierung in OnCalculate zu strecken und Schritt für Schritt zu zählen.

  4. Ich habe diesen Indikator etwa 800 MB an historischen Daten über das Netzwerk zur Synchronisierung übertragen lassen.

  5. Der Indikator hat 512 Zeichenlinien, für die explizit Speicherplatz zugewiesen wird. Das ist extrem teuer. Es werden nur 100 Zeilen verwendet.

  6. Der Code ist schlecht lesbar


 
Stanislav Dray:

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 beschrieben, wie ich konnte.

Das Problem liegt nicht nur bei mir, 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 nach 25 Minuten auf M30 hängen bleibt:

Und hier ist das Ergebnis:

Ich habe den Code zum Laufen gebracht. So weit, so gut.

Eine Datei ohne Körper, nebenbei bemerkt.