Fehler, Irrtümer, Fragen - Seite 595

 
-Alexey-:
Versuchen Sie, nach C zu übertragen - der Fehler wird sich selbst finden. Und überhaupt - bei solchen Projekten ist das die einzige Möglichkeit zu schreiben, wenn man in Zukunft keine Probleme haben will. Leider habe ich es selbst zu spät verstanden und schreibe es jetzt um :).
Wahrscheinlich werde ich in naher Zukunft C++ studieren. Während der letzten sechs Monate ist mein Kopf bereits voll: MQL4, MQL5, HTML, CSS, XML. Und jetzt lerne ich auch noch JavaScript. Ich habe noch nicht genug Platz und Zeit für C++, obwohl ich das wirklich möchte)).
 

Wir haben einen Indikator, der auf TF M15 läuft, im Code fordert der Indikator die Zeitreihe MqlRates von TF M1 an.

Der Indikator startet nicht sofort, da die M1-Daten nicht bereit sind und beim ersten Durchlauf nicht geladen werden können.

Das Ergebnis ist ein falscher Durchlauf, und der Indikator greift nicht mehr auf die Daten zu, weil er denkt, dass sie bereits berechnet sind und nicht neu berechnet werden müssen.

Jetzt lasse ich den Indikator auf zwei Arten laufen:

  1. Ich starte den Indikator auf M15, lösche den Indikator und starte ihn erneut (er funktioniert).
  2. Bevor ich den Indikator auf M15 ausführe, öffne ich ein Diagramm auf M1 und führe den Indikator auf M15 aus (alles funktioniert beim ersten Mal).

Daher die Frage: Wie lässt sich die korrekte Prüfung und das Laden der erforderlichen Daten für eine andere TF automatisieren?

 
Urain:

Daher die Frage: Wie kann man die Prüfung und das Laden der erforderlichen Daten aus der anderen TF automatisieren?

In einer ähnlichen Situation steuere ich den Initialisierungsprozess in OnCalculate. Wenn bei der Initialisierung ein Fehler auftritt, gebe ich prev_calculated=0 zurück, und so weiter, bis alles korrekt gezählt ist.
 
Lizar:
In einer ähnlichen Situation steuere ich den Initialisierungsprozess in OnCalculate. Wenn bei der Initialisierung ein Fehler auftritt, gebe ich prev_calculated=0 zurück und mache so lange weiter, bis alles korrekt berechnet ist.

Die Idee ist gut, obwohl prev_calculated nichts zugewiesen werden kann, die Variable ist als const deklariert, aber ich verstehe, Sie können eine andere ähnliche Variable haben.

Es bleibt noch eine Frage: Was soll ich tun, wenn es keine Daten gibt?

Ich verstehe, dass die Datenabfrage selbst nicht zum Herunter- oder Hochladen von der lokalen Datenbank führt, und genau das ist das Problem.

 
Urain:

Die Idee ist gut, obwohl man prev_calculated nichts zuweisen kann, die Variable ist als const deklariert, aber ich habe Sie verstanden, Sie können eine andere ähnliche Variable haben.

Es geht nicht um die Zuweisung, sondern um die Zahl, die von OnCalculated zurückgegeben wird. Wenn Ihre Daten nicht bereit sind, gibt OnCalculated 0 zurück.
Sehen Sie sich die Beispiele von BarsCalculated an. So sollten Sie das überprüfen.

Eine Frage bleibt - was soll man tun, wenn keine Daten vorliegen?

Wenn es keine Daten gibt und sie nicht angezeigt werden, gibt es nicht viel zu tun.
Wenn Sie wollen, können Sie warten und die Puffer per Timer berechnen.
 
sergeev:

Wenn Ihre Daten nicht bereit sind, wird von OnCalculated 0 zurückgegeben.
Sehen Sie sich die Beispiele von BarsCalculated an.

Wenn Sie sie nicht haben und sie auch nicht erscheinen, dann gibt es nicht viel zu tun.
Wenn Sie möchten, können Sie Warte- und Berechnungspuffer per Timer aufrufen.

Es hilft nicht, nur den Indikator zu entladen und neu zu starten, in diesem Fall sind die Daten aus irgendeinem Grund bereits vorhanden.

Oder öffnen Sie ein Diagramm mit der gewünschten M1 TF, dann sind die Daten auf dem angrenzenden M15-Diagramm auf M1-Anfrage sofort verfügbar.

 
Urain:

Es hilft nicht, nur den Indikator zu entladen und neu zu starten, in diesem Fall sind die Daten aus irgendeinem Grund bereits vorhanden.

Oder öffnen Sie ein Diagramm mit der gewünschten TF, dann sind die Daten im nebenstehenden Diagramm sofort verfügbar.

Heute habe ich einen halben Tag mit Indizes verbracht. Es gab Mehrwährungs-/Mehrzeitgeschäfte.

Das Problem bei der Nichtanzeige ist, dass Sie versuchen, einen Wert aus einem Balken zu übernehmen, der in dieser TF einfach nicht existiert.

Sie müssen also prüfen, bevor Sie einen Balken nehmen - SeriesInfoInteger.
Kein Entladen erforderlich. Sie werden den Berechnungsteil ohnehin nicht entladen (ich habe das Thema erst heute angesprochen).
 
sergeev:

Ich habe heute einen halben Tag lang mit den Indizes gearbeitet. Es gab Mehrwährungs-/Mehrzeitgeschäfte.

Das Problem mit der Nichtanzeige ist, dass versucht wird, den Wert von einem Balken zu nehmen, der in dieser TF einfach nicht existiert.

Sie müssen also prüfen, bevor Sie einen Balken nehmen - SeriesInfoInteger.

Kein Entladen erforderlich. Sie können den Berechnungsteil sowieso nicht entladen (ich habe erst heute ein Thema dazu aufgeworfen).

Mimeo, ich habe einen Checker, ich finde das erste Datum auf TF M1 und die Berechnung der M15-Balken beginnt von diesem Datum. TF wird als PERIOD_M1 eingestellt

   timestart=(datetime)SeriesInfoInteger(_Symbol,TF,SERIES_FIRSTDATE);
   for(int i=prev>0?prev-1:0;i<rates_total-1;i++)
     {
      if(time[i]>timestart)
        {
         ... расчёт
        }
     }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
Urain:

1. die Idee ist gut, obwohl nichts zu prev_calculated zugewiesen werden kann, die Variable ist als const deklariert, aber ich verstehe, Sie können eine andere ähnliche Variable haben.

2. Eine Frage bleibt, und wenn es keine Daten gibt, was sollen wir dann tun?

3. ich verstehe, dass die Datenanforderung selbst nicht dazu führt, dass die Daten aus der lokalen Datenbank herunter- oder hochgeladen werden, und genau das ist das Problem.

  1. Ich meinte vonOnCalculate return 0, dann prev_calculated=0;
  2. Ich setze den Zähler für Neuinitialisierungen. Bei Überlauf entlade ich den Indikator.
  3. Ich hatte keine Probleme mit SoruXXX. Wenn es eine lokale Geschichte gibt, zählt alles ab dem zweiten oder dritten Mal, wenn nicht ab dem ersten Mal. Bei der Meisterschaft zählt der vom Expert Advisor verwendete "Spion" nur auf die einminütige Historie, er arbeitet auf H1. Und so weiter 9 Paare. Wenn es überhaupt keine lokale Geschichte gibt, gilt Punkt 2. Aber soweit ich mich erinnere, wurde der Verlauf vom Server heruntergeladen.
 
Urain:

Ich verstehe, dass die Datenanforderung selbst nicht dazu führt, dass Daten von der lokalen Datenbank herunter- oder hochgeladen werden, und genau das ist das Problem.

Aus der CopyXXXX-Hilfe:

Wenn Daten von einem Expert Advisor oder einem Skript angefordert werden, wird das Herunterladen vom Server eingeleitet, wenn das Terminal nicht über diese Daten verfügt, oder es wird mit der Erstellung der erforderlichen Zeitreihen begonnen, wenn die Daten aus dem lokalen Verlauf erstellt werden können, aber noch nicht bereit sind. Die Funktion gibt die Datenmenge zurück, die bereitsteht, wenn die Zeitüberschreitung abläuft, aber die Geschichte wird weiterhin heruntergeladen und die nächste ähnliche Anfrage wird mehr Daten zurückgeben.

Wir sprechen hier nur von Expert Advisors und Skripten. Gilt dies nicht für Indikatoren?