Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1213

 

Salud! Hilfe :)

Vom Indikator (mt5) wird eine Tick-Historie zur Weiterverarbeitung kopiert. Ich habe den Algorithmus aus dem Nachschlagewerk kopiert und ihn nur ein wenig verändert:

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Aber ich habe eine Warnung erhalten, dass der Tickverlauf nicht mehr synchron ist:

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

Und im Handbuch heißt es:

ERR_HISTORY_TIMEOUT

4403

Zeitüberschreitung bei Historienabfrage

Die Intuition des Kapitäns sagt mir, dass ich die Ticks synchronisieren soll... Ist das der Punkt, auf den ich hinauswollte? Wie kann man das tun? Oder ist es möglich, ohne großen Schaden auch ohne Synchronisation zu arbeiten, indem man die Erfolgskontrolle entfernt?

 
Yevhenii Levchenko:

Salud! Hilfe :)

Eine Tick-Historie wird aus einem Indikator (mt5) zur Weiterverarbeitung kopiert.

Die Indikatoren haben asynchronen Zugriff auf die Verlaufsdaten, während die Expert Advisors und Skripte synchronen Zugriff haben, oder zumindest nennen die Entwickler der MQL-Programme das Verhalten bei der Arbeit mit Daten so

in menschlicher Sprache: Wenn Sie im Indikator auf Verlaufsdaten zugreifen, müssen Sie den Berechnungszyklus mit einem Fehler beenden, und nach einer Weile müssen Sie den Verlauf erneut aufrufen

Und es macht keinen Sinn, den Verlauf im Indikator mehrmals in einer Schleife aufzurufen - diese Methode funktioniert nur in Expert Advisors und Skripten

 
Igor Makanu:

In Indikatoren asynchroner Zugriff auf historische Daten, in Expert Advisors und Skripten - synchroner Zugriff, oder zumindest nennen die Entwickler das Verhalten von MQL-Programmen bei der Arbeit mit Daten so

in menschlicher Sprache: Wenn Sie im Indikator auf Verlaufsdaten zugreifen, müssen Sie den Berechnungszyklus mit einem Fehler beenden, und nach einer Weile müssen Sie den Verlauf erneut aufrufen

und es macht keinen Sinn, den Verlauf mehrmals im Indikator aufzurufen - diese Methode funktioniert nur in Expert Advisors und Skripten

Ich danke Ihnen!

Hat Synchronität etwas mit Multithreading zu tun? "Die Zecken sind noch nicht synchronisiert" - das ist eher eine Warnung?

 
ANDREY:

Das ist doch Unsinn... Sie sind nicht gut in Logik, Sie sind nicht gut in Mathe ..... und gleichzeitig haben Sie lange und erfolgreich ein Forum moderiert, dessen Thema sowohl von Logik als auch von Mathe durchdrungen ist.

Wo habe ich gesagt, dass ich nicht gut in Logik bin?

 
ANDREY:

Ich denke, dass das Wissen, über das eine Reihe von Spezialisten verfügte, nicht das Wissen von Ford selbst war und es auch nie wurde. Außerdem brauchte er dieses Wissen nicht, weil er es für unnötig hielt. Und wenn diese Experten versuchten, ihr Wissen an Ford weiterzugeben, wäre er nicht in der Lage, es zu verinnerlichen und für praktische Zwecke zu nutzen. Es ist notwendig, mehr als nur eine allgemeine Vorstellung von dem Thema zu haben, das mit dem neuen Wissen verbunden ist, um es aufnehmen zu können. In dem oben genannten Beispiel haben die Sachverständigen ihr Wissen nicht an Ford, sondern an die Anwälte weitergegeben.

Und in Ihrem Gehirn, so scheint es mir, verfügen Sie über ein ausreichendes Maß an systematisiertem Wissen in Mathematik und Logik, das es Ihnen ermöglicht, eine Suchanfrage nach neuen und fehlenden Informationen schnell und richtig zu formulieren und sie schnell und richtig zu interpretieren. Ich bin sicher, dass in Ihrem Gehirn kann nicht keine solche Informationen, da jeden Tag für viele Stunden auf diesem Forum verbracht und durch sein Gehirn eine Menge von Informationen speziell mit Mathematik und Logik verbunden. Es ist wie das Erlernen einer Fremdsprache durch Immersion. Es wird automatisch, spontan und vielleicht sogar gegen den Willen des Lernenden gelernt.

Wenn 100 Akademiker anfangen, mir die Regeln für die Berechnung von Integralgleichungen zu erklären, werde ich es erst lernen, wenn sie meinen Kopf mit all den Mathematik- und Algebra-Lehrbüchern füllen, die ich in der Schule lernen musste, bevor der Lehrer anfing, Integralgleichungen zu erklären.

Wenn man nicht versteht, was eine Variable ist und wozu sie dient, ist es schwer zu verstehen, was eine Variable überhaupt ist, ganz zu schweigen von anderen Konzepten, die nicht einmal besonders kompliziert sind.

Ford hat nicht gesagt, dass er in seinem Interessengebiet das Richtige lernen würde. Er sagte, er sei von so vielen Fachleuten aus verschiedenen Bereichen umgeben, dass er jederzeit Antworten auf die von ihm benötigten Fragen erhalten könne. Warum muss ein Manager wissen, was 200 Spezialisten wissen können, von denen jeder in seinem Bereich die richtige Antwort geben wird? Es ist unmöglich, prinzipiell alles zu wissen. Aber mit Hilfe von Fachleuten schnell Antworten auf die Probleme zu bekommen, die man braucht - das ist es, wovon Ford sprach, das ist es, was ich über Nachschlagewerke und die Verwendung der richtigen Informationen sagte. Und das ist in einem engen Bereich, den diese Ressource in Form von CodeBase und einem Forum bietet.

 
Yevhenii Levchenko:

Ich danke Ihnen!

Ist synchronisiert mit Multithreading verwandt? "Die Zecken sind noch nicht synchronisiert" entpuppt sich eher als eine Warnung?

keine

Die Entwickler implizieren, dass synchron eine Art garantierte Verarbeitung historischer Daten beim Aufruf von History-Funktionen bedeutet, aber es garantiert nicht, dass die Daten bei Abfragen unbedingt zurückgegeben werden

... Hier ist die nicht-menschliche Sprache ))))


asynchron ist eine Abfrage und Daten oder ein Fehler. Wenn ein Fehler auftritt, beginnt die Synchronisation, aber der Endzeitpunkt der Synchronisation (oder des TF-Aufbaus) ist unbekannt und wegen der hohen Leistung von MT5 erhalten Sie jedes Mal einen Fehler anstelle von synchronisierten Daten

ZS: in MT5 ist alles kompliziert dort.... es gibt einen Server, es gibt ein Terminal und schließlich unser MQL-Programm. Wenn Sie die Historie abfragen, müssen Sie den Server - Terminal und dann das Terminal - MQL-Programm synchronisieren, jemand hat vielleicht keine fertigen Zeitrahmen oder Tickdaten

 
Igor Makanu:

keine

Die Entwickler deuten an, dass die Synchronisierung eine Art garantierte Verarbeitung historischer Daten beim Aufruf von History-Funktionen ist, aber sie garantiert nicht unbedingt die Rückgabe der Daten, wenn sie abgefragt werden...

... Hier ist die nicht-menschliche Sprache ))))


asynchron ist eine Abfrage und Daten oder ein Fehler. Wenn ein Fehler auftritt, beginnt die Synchronisation, aber der Endzeitpunkt der Synchronisation (oder des TF-Aufbaus) ist unbekannt und wegen der hohen Leistung von MT5 erhalten Sie jedes Mal einen Fehler anstelle von synchronisierten Daten

ZS: in MT5 ist alles kompliziert dort.... es gibt einen Server, es gibt ein Terminal und schließlich unser MQL-Programm. Wenn Sie die Historie abfragen, sollten Sie den Server - Terminal und dann das Terminal - MQL-Programm synchronisieren, jemand könnte unfertige Zeitrahmen oder Tickdaten haben

Die einfachere Antwort lautet in etwa so:

Um auf die Synchronisierung im Indikator zu warten, sollten Sie OnCalculate() nach einem Fehler einfach mit Return 0 beenden;

In diesem Fall startet der erste Zugriff auf historische Daten den Prozess der Datensynchronisation und es bleibt nur noch, dessen Abschluss zu überprüfen. Wenn ein Fehler beim Empfang von Daten auftritt, wird Null zurückgegeben - da Null die Menge der bereits beim vorherigen Aufruf berechneten Daten angibt (prev_calculated), und bei aktuellem Aufruf und erfolgreichem Laden der historischen Daten wird OnCalculate() auf der gesamten Tiefe der Historie berechnet (da wir durch die Rückgabe von 0 beim vorherigen Aufruf angegeben haben, dass nichts berechnet wurde).

 
a.lxrn:

Guten Tag zusammen, können Sie mir bitte helfen, dieses Problem zu lösen, das Problem liegt in der Logik, ich habe mir heute das Hirn zermartert und bin an den Punkt gekommen, an dem ich in einem Schlamassel stecke.

Ich habe ein elementares Codebeispiel geschrieben, es gibt ein Signal, wenn der Kerzenschluss größer als der Wagen ist, eine Order wird geöffnet.

Ich bin sicher, Sie wissen, was ich meine, denn das Signal bleibt lange Zeit erhalten,

Ich bin sicher, dass Sie verstehen, was ich meine. Eigentlich, wie sollte ich ein Signal zum Kauf öffnen eine Bestellung und das war's, bis die Situation ändert und der Schlusskurs ist niedriger als der Preis der Welle.

Ich kann zwar Flaggen verwenden, aber sie speichern die Bestellung nicht, wenn sie geschlossen und geöffnet wird, oder sie verzögern sich um 15 Minuten. Noch cooler ist es, wenn die Bedingungen für das Öffnen und Schließen von Aufträgen gleichzeitig erfüllt sind. Bei jedem Ticken eine Bestellung)))) Wenn das Signal zum Öffnen des Auftrags wahr ist und das Flag, dass der Auftrag offen ist, falsch ist, dann wird der Auftrag geöffnet. Und wenn das Flag, dass der Auftrag offen ist, wahr ist, wird der Auftrag nicht geöffnet). Eine Verzögerung ist einfacher und effizienter. Nach Abschluss der Bestellung setzen wir eine Frist.

 
Igor Makanu:

asynchron ist eine Abfrage und Daten oder ein Fehler, und nach einem Fehler die Synchronisation beginnt, aber der Zeitpunkt des Endes der Synchronisation (oder TF Gebäude) ist unbekannt und wegen der hohen Leistung von MT5 erhalten Sie einen Fehler jedes Mal, wenn Sie wieder statt synchronisierte Daten aufrufen

ZS: in MT5 ist alles kompliziert dort.... Sie haben einen Server, ein Terminal und schließlich unser MQL-Programm. Bei der Abfrage der Historie müssen Sie Server - Terminal und dann das Terminal - MQL-Programm synchronisieren, jemand kann unfertige Zeitrahmen oder Tickdaten haben


Ungefähr so ... Danke :)

Artyom Trishkin:

Es war einfacher, ungefähr so zu antworten:

Um in einem Indikator auf die Synchronisierung zu warten, müssen Sie OnCalculate() nach einem Fehler mit Return 0 beenden;

In diesem Fall startet der erste Zugriff auf historische Daten den Prozess der Datensynchronisation und es bleibt nur noch, dessen Abschluss zu überprüfen. Wenn ein Fehler beim Empfang von Daten auftritt, wird Null zurückgegeben - da Null die Menge der bereits beim vorherigen Aufruf berechneten Daten angibt (prev_calculated), und bei aktuellem Aufruf und erfolgreichem Laden der historischen Daten wird OnCalculate() auf der gesamten Tiefe der Historie berechnet (da wir durch die Rückgabe von 0 beim vorherigen Aufruf angegeben haben, dass nichts berechnet wurde).

Einfacher ist nicht gleichbedeutend mit klarer :)

Ich habe zu den Standardinstrumenten gewechselt, und es wurde nur einmal angezeigt, dass sie nicht synchronisiert waren. Spätere Abfragen ergaben nichts dergleichen mehr.

Können Sie mir sagen, warum das Prüfgerät keine Lautstärke anzeigt?
 
Yevhenii Levchenko:

Grob verstanden... Danke :)

Einfacher bedeutet nicht klarer :)

Ich habe zu den Standardinstrumenten gewechselt, und es wurde nur einmal angezeigt, dass sie nicht synchronisiert waren. Spätere Abfragen ergaben nichts dergleichen mehr.

Können Sie mir sagen, warum das Prüfgerät keine Lautstärke anzeigt?

Um die historischen Daten im aktuellen "heißen" Zustand zu halten, müssen Sie alle zwei Minuten mit einer der Funktionen CopyXXX, iXXX, z. B. CopyTime(), iTime() usw. auf diese Daten zugreifen.

Ich weiß nicht, welche Lautstärken Sie im Prüfgerät nicht erhalten. Es gibt echte und Tick-Bände. Ohne Code ist es unmöglich, diese Frage im Wesentlichen zu beantworten.