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

 
fxsaber:

Das ist Unsinn.

+1
 
fxsaber:

Das ist Unsinn.

Solange "plötzlich" (c) gibt es keine Frage der begrenzten Systemleistung (egal welche).

 

In letzter Zeit habe ich mich intensiver mit OnCalculate und der Verarbeitung von Tickdaten beschäftigt. Früher wurde geschrieben, dass alles getan wird, um ein "Einfrieren" von falsch geschriebenen Indikatoren zu vermeiden, aber wenn wir wirklich den gesamten Tick-Datenfluss seit dem vorherigen Aufruf von OnCalculate verarbeiten wollen, dann sollten wir bei schnellen Kursbewegungen (und Rollback) ein ziemlich "tiefes" Array erhalten, gibt es irgendwelche Einschränkungen für die Tick-Array-Tiefe?

Ich möchte keine Antwort hören wie "OnCalculate erhält einen akkumulierenden Tick(s)..., um zu optimieren...".

Wer analysiert bereits die Zeckendaten, gibt es einen Grund für solche Bedenken?

 
Farkhat Guzairov:

In diesen Tagen habe ich mich mit OnCalculate und der Verarbeitung von Tickdaten befasst. Früher wurde geschrieben, dass alles getan wird, um ein "Einfrieren" von falsch geschriebenen Indikatoren zu vermeiden, aber wenn wir wirklich den gesamten Tick-Datenfluss seit dem vorherigen Aufruf von OnCalculate verarbeiten wollen, dann sollten wir bei schnellen Kursbewegungen (und Rollback) ein ziemlich "tiefes" Array erhalten, gibt es irgendwelche Einschränkungen für die Tick-Array-Tiefe?

Ich möchte keine Antwort hören wie "OnCalculate erhält einen akkumulierenden Tick(s)..., um zu optimieren...".

Wer analysiert bereits Zeckendaten, gibt es Gründe für solche Befürchtungen?

In den Jahren 2008-2009 schrieb Renat einmal, dass es kein Glück in Zecken gibt, er gab ein Beispiel eines Experten. Zecken werden ohnehin übersprungen. Wenn Sie es brauchen, können Sie bei jedem Anrufhttps://www.mql5.com/ru/docs/series/copyticks aufrufen, aber Sie werden trotzdem das 50/50 Top oder Bottom verpassen, in das Sie einsteigen wollen.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

Ich werde hier nur kurz vorbeischauen, um für die Öffentlichkeit zu werben. Ich versuche schon seit einem Monat herauszufinden, warum das nicht mehr funktioniert:

long lastbardaytime=0;

int OnInit(){ 
}

bool isNewBar(string symbol_,ENUM_TIMEFRAMES period_){
    long curbar = SeriesInfoInteger(symbol_,period_,SERIES_LASTBAR_DATE)%86400;
    if(lastbardaytime == 0){
        lastbardaytime = curbar;
    }
    if(lastbardaytime != curbar){
        lastbardaytime = curbar;
        return(true);
    }
    return(false);
}


void OnTick(){
    if(isNewBar(MIX-12.18,PERIOD_M1)){ 
        Print("New bar");
///....
    }
} 


Ich warte auf die neue Version zur Eröffnung.

 

Fortsetzung der Fragen zur Optimierung und zum Laden von historischen Daten.

1. Das Problem der korrekten Arbeit der iClose/iOpen-Funktionen, und in diesem Fall iTime, besteht, und ich denke, es macht keinen Sinn zu erwarten, dass alles perfekt sein wird. Vielleicht sollten sie einfach aus MQL5 entfernt werden, um zu vermeiden, dass dieselben Fehler noch einmal gemacht werden? (Ich habe ein Problem, aber ich habe keine Zeit, es zu beschreiben, denn ich habe eine Lösung gefunden, eine andere "Wendung")

Vielleicht gibt es eine Lösung, aber ich möchte, dass sie dokumentiert wird und nicht eine weitere MQL5-Community-Verdrehung ist. Es geht darum, wie man mit asynchronen Anfragen umgeht, die z.B. die lokalen Datenbanken synchronisieren:

In Indikatoren gibt die Funktion CopyTicks() das Ergebnis sofort zurück: Wenn CopyTick() von einem Indikator aus aufgerufen wird, gibt es sofort die verfügbaren Ticks pro Symbol zurück und beginnt auch mit der Synchronisierung der Tick-Datenbank, wenn nicht genügend Daten vorhanden sind. Alle Indikatoren auf einem Symbol arbeiten in einem gemeinsamen Thread, so dass der Indikator kein Recht hat, auf den Abschluss der Synchronisierung zu warten. Sobald die Synchronisierung abgeschlossen ist, gibt der nachfolgende Aufruf von CopyTicks() alle angeforderten Ticks zurück. Die Funktion OnCalculate() in Indikatoren wird nach jedem Tick-Empfang aufgerufen.


Der Schlüsselsatz lautet: "Nach Beendigung der Synchronisierung wird der nächste Aufruf von CopyTicks() alle angeforderten Ticks zurückgeben. ", meine Herren, wie wissen Sie, wann die Synchronisierung beendet ist? Es wird so geschrieben, als ob vor dem Ende der Synchronisation CopyTicks() z.B. -1 zurückgibt, aber das ist nicht der Fall. Als Ergebnis nach ein paar Reloads Indikator DB synchronisiert und wir sind wirklich immer den gesamten Datensatz, aber wenn ich nicht neu laden Indikator bin ich nicht bekommen, diesen Datensatz, weil ich nicht weiß, Ergebnis der Beendigung dieser verdammt Synchronisation.

Ein markantes Beispiel waren die letzten Schläge, es gab eine starke Bewegung auf EURUSD, obwohl der Indikator die ganze Zeit eingeschaltet war und diese Periode irgendwie normal wiedergab, aber nachdem ich ihn neu geladen hatte (veränderte Eingabeparameter), begann der Indikator, Informationen falsch wiederzugeben, bzw. wurde nach Fehlern im Indikator gesucht (mehrmals neu kompiliert und geladen), aber nichts half, und dann geschah dieses "Wunder", "WennSie CopyTick() von einem Indikator aus aufrufen, werden sofort die für das Symbol verfügbaren Ticks zurückgegeben und die Synchronisierung der Tick-Basis gestartet." Vielleicht sollten Sie eine Funktion erstellen (oder haben), die uns sagt, dass die Synchronisierung der lokalen Datenbank im Moment nicht abgeschlossen ist.

P.S.: Die Funktion SymbolInfoTick verfügt leider nicht über diese Funktionalität.

 

Leider funktioniert dieses Beispiel nicht immer:

//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); 
      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); 
        } 

Um genau zu sein, funktioniert es 1-2 von 10 Mal.

Aber in der oben beschriebenen Situation hat es nicht ein einziges Mal funktioniert.

 

Noch eine Frage: Wird die Datenbank in Echtzeit aktualisiert?

Wie ich oben geschrieben habe, funktionierte der Indikator während des gesamten problematischen Zeitraums, d.h. die Funktion CopyTicks() wurde regelmäßig aufgerufen , aber wie sich herausstellte, hatte sie keine Auswirkungen auf die lokale Datenbank.... Das ist seltsam....

 
Unicornis:

In den Jahren 2008-2009 schrieb Renat einmal, dass es kein Glück in Zecken gibt, und nannte das Beispiel eines Experten. Die Häkchen werden ohnehin übersprungen. Wenn nötig, können Sie bei jedem Aufrufhttps://www.mql5.com/ru/docs/series/copyticks aufrufen, aber Sie werden trotzdem das 50/50-Top/Tal verpassen, in das Sie einsteigen wollen.

Wer hat das nicht, und wer braucht es :), um aktuelle Daten zu haben, insbesondere Zecken.
 
Farkhat Guzairov:

Wiederaufnahme von Fragen im Zusammenhang mit der Optimierung und dem Laden von historischen Daten.

1. Das Problem des korrekten Funktionierens der Funktionen iClose/iOpen und in diesem Fall iTime besteht wahrscheinlich, und es gibt keinen Grund zu erwarten, dass alles perfekt sein wird. Vielleicht können sie einfach aus MQL5 entfernt werden, um die gleichen Fehler nicht zu wiederholen? (Ich habe ein Problem, aber ich habe keine Zeit, es zu beschreiben, denn ich habe eine Lösung gefunden, eine andere "Wendung")

Vielleicht gibt es eine Lösung, aber ich möchte, dass sie dokumentiert wird und nicht eine weitere MQL5-Community-Verdrehung ist. Es geht darum, wie man mit asynchronen Anfragen umgeht, die z.B. die lokalen Datenbanken synchronisieren:

In Indikatoren gibt die Funktion CopyTicks() das Ergebnis sofort zurück: Wenn CopyTick() von einem Indikator aus aufgerufen wird, gibt es sofort die verfügbaren Ticks pro Symbol zurück und beginnt auch mit der Synchronisierung der Tick-Datenbank, wenn nicht genügend Daten vorhanden sind. Alle Indikatoren auf einem Symbol arbeiten in einem gemeinsamen Thread, so dass der Indikator kein Recht hat, auf den Abschluss der Synchronisierung zu warten. Sobald die Synchronisierung abgeschlossen ist, gibt der nachfolgende Aufruf von CopyTicks() alle angeforderten Ticks zurück. Die Funktion OnCalculate() in Indikatoren wird nach jedem eingehenden Tick aufgerufen.


Der Schlüsselsatz lautet: "Nach Beendigung der Synchronisierung wird der nächste Aufruf von CopyTicks() alle angeforderten Ticks zurückgeben. ", meine Herren, wie wissen Sie, wann die Synchronisierung beendet ist? Es wird so geschrieben, als ob vor dem Ende der Synchronisation CopyTicks() z.B. -1 zurückgibt, aber das ist nicht der Fall. Als Ergebnis nach ein paar Reloads Indikator DB synchronisiert und wir sind wirklich immer den gesamten Datensatz, aber wenn ich nicht neu laden Indikator bin ich nicht bekommen, diesen Datensatz, weil ich nicht weiß, Ergebnis der Beendigung dieser verdammt Synchronisation.

Ein markantes Beispiel waren die letzten Schläge, es gab eine starke Bewegung auf EURUSD, obwohl der Indikator die ganze Zeit eingeschaltet war und diese Periode irgendwie normal wiedergab, aber nachdem ich ihn neu geladen hatte (veränderte Eingabeparameter), begann der Indikator, Informationen falsch wiederzugeben, bzw. wurde nach Fehlern im Indikator gesucht (mehrmals neu kompiliert und geladen), aber nichts half, und dann geschah dieses "Wunder", "WennSie CopyTick() von einem Indikator aus aufrufen, gibt dieser sofort die für das Symbol verfügbaren Ticks zurück und beginnt auch mit der Synchronisierung der Tick-Basis", vielleicht sollten Sie eine Funktion erstellen (oder haben), die uns sagt, dass die Synchronisierung der lokalen Datenbank im Moment noch nicht abgeschlossen ist, diese Funktion würde unsere Aufgabe erleichtern und uns erlauben, ein besseres Endprodukt für den Markt zu schreiben.

P.S.: Die Funktion SymbolInfoTick verfügt leider nicht über diese Funktionalität.

Was gibt SERIES_SYNCHRONIZED in solchen Fällen zurück?