Benutzerdefinierte Symbole. Fehler, Bugs, Fragen, Vorschläge. - Seite 27

 
Stanislav Korotky:

Das Hinzufügen von eins-zu-eins-Ticks (insbesondere von EURUSD auf MQ Demo) zu einem leeren neuen benutzerdefinierten Symbol führt zu Fehler 5310 (nicht sofort, sondern in einer Schleife ab einem beliebigen Datum).

Was ist los? Woher weiß ich, welche Zecken genau gescholten werden? Einfügen von Arrays in das Protokoll - keine chronologische Verletzung.

Versuchen Sie, die Prüfung auf Zecken beim Kopieren einzufügen.
Ich habe einen Indikator auf die Echtzeit-Daten in Tick-Verarbeitung, beim Kopieren CopyClose, manchmal löst es Kopieren Fehler.
Ich verstehe nicht, was der Grund dafür sein könnte. Vielleicht liegt in Ihrem Fall ein Kopierfehler vor.

Außerdem kopiert man in CopyTicks eine Menge Ticks Limit, und dann in der while-Schleife, d.h. bei jeder Iteration, ein großes Array von Ticks.
Und in CustomTicksAdd übergeben Sie die gleiche große Anzahl von Ticks an das Array.
Versuchen Sie, ein Häkchen zu kopieren und ein Häkchen weiterzugeben.
Sie befinden sich in einer while-Schleife.

input int Limit = 10000;
input datetime Start = D'2020.06.01';

int fillArray(ulong &_start)
{
  MqlTick array[];
  int size = CopyTicks(_Symbol, array, COPY_TICKS_ALL, _start, Limit);

  if(size <= 0) 
  {
     Print("Ошибка копирования ценовых данных "+_Symbol+" "+(string)size+" ",GetLastError());
     return(size);
  }

  if(size > 0)
  {
    _start = array[size - 1].time_msc + 1;
    if(CustomTicksAdd(symbolName, array) == -1)
    {
      Print("Error:", GetLastError());
      return(-1);
    }
  }
  return(size);
}

...
{
  ulong startMsc = (ulong)Start * 1000;
  while(fillArray(startMsc) > 0);
}
Hinzugefügt. Hat nichts mit benutzerdefinierten Symbolen zu tun.
Ich habe gerade im Indikator, in der Tick-Echtzeit die Ursache des Kopierfehlers mit der Periode M5 durch die CopyClose Funktion gefunden.
Die Internetverbindung wurde für einige Sekunden unterbrochen und nach der Verbindung erschien der Kopierfehler 4401The requested history was not found
Es ist seltsam, die Periode M5 hat noch nicht zu einem neuen Balken gewechselt, aber der Fehler ist aufgetreten.
 
Roman:

Versuchen Sie, eine Prüfung auf Kopieren von Zecken einzufügen.
In meinem Indikator für Echtzeitdaten in der Tick-Verarbeitung tritt beim Kopieren von CopyClose manchmal ein Kopierfehler auf.
Ich verstehe nicht, was der Grund dafür sein könnte. Vielleicht liegt in Ihrem Fall ein Kopierfehler vor.

Außerdem kopiert man in CopyTicks eine Menge Ticks Limit, und dann in der while-Schleife, d.h. bei jeder Iteration, ein großes Array von Ticks.
Und in CustomTicksAdd übergeben Sie die gleiche große Anzahl von Ticks an das Array.
Versuchen Sie, einen Tick zu kopieren und einen Tick weiterzugeben.

Es treten keine Kopierfehler auf, der Code erhält einen normalen Wert für die Anzahl der kopierten Ticks (Größe), das Array wird ständig mit normalen Daten gefüllt. Der Grenzwert kann geändert werden, aber ein Fehler tritt bei jedem sinnvollen Wert von eins bis zu mehreren Tausend auf. Das Kopieren aller Ticks auf einmal (wie in einigen Codes) ist offensichtlich falsch, da es zu einem Fehler bei der Speicherzuweisung führen und den Thread für eine lange Zeit sperren kann, ohne dass dem Benutzer ein Fortschritt angezeigt werden kann. Und das Kopieren von Häkchen in kleinen Stapeln von 10 (geschweige denn 1) verlangsamt den gesamten Prozess - das ist inakzeptabel.

Die vorgeschlagene Variante ist optimal. Und selbst wenn es für jemanden fraglich ist, ist der Code formal korrekt (oder zitieren Sie, wo ich falsch liege) und das aktuelle Verhalten ist ein Fehler, d.h. Zecken müssen ohne Code 5310 hinzugefügt werden.

Außerdem gibt es immer noch ein langwieriges Problem beim Löschen der Zeckendatenbank. Aufruf CustomTicksDelete(symbolName, 0, LONG_MAX); will nicht alle Ticks löschen und lässt einige übrig (es wird nicht ständig beobachtet, sondern etwa einmal in der Zeit). Wenn Sie den Expert Advisor neu starten, wird das benutzerdefinierte Symbol vollständig gelöscht. Wie im Fall von CopyTicks - keine Fehler.

 
Wenn Sie Ticks schreiben wollen, ohne mehr OnTick-Ereignisse zu erzeugen, ist es vielleicht besser, eine andere Funktion zu verwenden.
 
Stanislav Korotky:

Vielleicht gibt es Zecken mit der gleichen ms an der Kreuzung der Pakete und dies zählt als Fehler?

Nur eine Vermutung

 
Andrey Khatimlianskii:

Vielleicht gibt es Zecken mit der gleichen ms an der Kreuzung der Pakete und dies zählt als Fehler?

Nur eine Vermutung.

Aus dem Code können Sie ersehen, dass es doppelte Häkchen gibt. In diesem Fall kann es sein, dass die Flaggen der Zecken nicht übereinstimmen.

 
fxsaber:
Wenn Sie Ticks schreiben müssen, ohne weitere OnTick-Ereignisse zu erzeugen, sollten Sie besser eine andere Funktion verwenden.

Ich stimme zu. Ich werde es ausprobieren. Aber ich sehe keinen Grund, warum die derzeitige Methode nicht funktionieren sollte.

 
Stanislav Korotky:

Es treten keine Kopierfehler auf, der Code erhält einen normalen Wert für die Anzahl der kopierten Ticks (Größe), das Array wird ständig mit normalen Daten gefüllt. Der Grenzwert kann geändert werden, aber ein Fehler tritt bei jedem sinnvollen Wert von eins bis zu mehreren Tausend auf. Das Kopieren aller Ticks auf einmal (wie in einigen Codes) ist offensichtlich falsch, da es zu einem Fehler bei der Speicherzuweisung führen und den Thread für eine lange Zeit sperren kann, ohne dass dem Benutzer ein Fortschritt angezeigt werden kann. Und das Kopieren von Zecken in kleinen Stapeln von 10 (geschweige denn 1) verlangsamt den gesamten Prozess.

Die vorgeschlagene Variante ist optimal. Und selbst wenn es für jemanden fragwürdig ist, ist der Code formal korrekt (oder zitieren Sie, wo ich falsch liege) und das aktuelle Verhalten ist ein Fehler, d.h. Zecken müssen ohne Code 5310 hinzugefügt werden.

Außerdem gibt es immer noch ein langwieriges Problem beim Löschen der Zeckendatenbank. Aufruf CustomTicksDelete(symbolName, 0, LONG_MAX); will nicht alle Ticks löschen und lässt einige übrig (es wird nicht ständig beobachtet, sondern etwa einmal in der Zeit). Wenn Sie den Expert Advisor neu starten, wird das benutzerdefinierte Symbol vollständig gelöscht. Wie im Fall von CopyTicks - keine Fehler.

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Arrayvon Ticks, nicht nach Zeitgeordnet


Es ist möglich, dass Sie keine Zeit haben, Zecken in großen Stapeln zu löschen, weil Sie bei der nächsten Iteration bereits vorhandene überschreiben.
Das heißt, sie überlagern sich als ein Array, während es ohne Verzögerung fliegt, so dass der Speicher keine Zeit hat, geleert zu werden, wenn ein anderes Paket ankommt.
Deshalb schlug ich vor, jeweils ein Häkchen hinzuzufügen. Ich habe ein Häkchen nach dem anderen kopiert, ohne Probleme.

Was die Löschung der Ticks-Datenbank betrifft, so gefällt mir die Konstante LONG_MAX in diesem Fall nicht.
Die Hilfe der Funktion CustomTicksDelete besagt, dass der Zeitpunkt des letzten Ticks in der Kurshistorie aus dem angegebenen Bereich gelöscht werden soll. Die Zeit in Millisekunden seit dem 01.01.1970.
Und LONG_MAX ist viel größer als dieser Wert. Das heißt, es wird ein größerer Wert übergeben, für den dieser Parameter nicht vorgesehen ist.
Versuchen Sie, die Zahl zu verwenden, die der Millisekunden-Stelle entspricht, d.h. 13 Werte.

 
fxsaber:

Aus dem Code können Sie ersehen, dass es doppelte Häkchen gibt. In diesem Fall kann es sein, dass die elementaren Flaggen der Zecken nicht übereinstimmen.

Handelt es sich bei den duplizierten Häkchen im Empfangsfeld um CopyTicks? Woher weiß man, dass es sich um doppelte Zecken und nicht um dieselben Zecken handelt (Zecken haben ja keine eindeutigen Bezeichnungen)? Selbst wenn es Duplikate gibt, unterbrechen die Häkchen mit gleichen Cutoffs theoretisch nicht die Sequenz. Schließlich stellt sich die Frage: Wie entstehen die Duplikate?

 
Roman:

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Arrayvon Ticks, nicht nach Zeitgeordnet


Es ist möglich, dass die großen Pakete von Zecken keine Zeit haben, gelöscht zu werden, da Sie die bereits vorhandenen in der nächsten Iteration überschreiben.
Das heißt, sie überlagern einander als ein Array, während es fliegt ohne Verzögerung, offenbar, Speicher hat keine Zeit, um gelöscht werden, wenn ein anderes Paket ankommt.
Deshalb schlug ich vor, jeweils ein Häkchen hinzuzufügen, ich kopierte ein Häkchen nach dem anderen, es gab keine Probleme.

Kein Wort über Löschung, nichts wird überschrieben. Die Iterationen werden ohne Überschneidungen durchgeführt. Immer in einem leeren benutzerdefinierten Zeichen - entweder in einem neuen oder nach erfolgreicher Löschung aller Zecken.

 
Stanislav Korotky:

Doppelte Häkchen im empfangenden Array CopyTicks? Woran ist zu erkennen, dass es sich um doppelte Zecken und nicht um identische Zecken handelt (Zecken haben ja keine eindeutigen Bezeichnungen)? Selbst wenn es Duplikate gibt, unterbrechen die Häkchen mit gleichen Cutoffs theoretisch nicht die Sequenz. Schließlich stellt sich die Frage, wie die Duplikate gebildet werden.

Ich habe mir den Code genauer angesehen. Sie lassen beim portionsweisen Empfang Zecken aus. Es kann der Fall eintreten, dass Ticks[Limit - 1].time_msc == Ticks[Limit + k], k >= 0.

Dementsprechend kann es vorkommen, dass die Flaggen nicht übereinstimmen, wenn Sie mit einem Skip hinzufügen.


Achten Sie darauf, dass alle historischen Ticks mit der gleichen Zeit am Ende des Abschnitts stehen. Das heißt, der Beginn des nächsten Chunks sollte eine andere Zeit haben. Andernfalls kommt es zu Verlusten, auch beim Schreiben an den Kunden.

Wenn Sie CopyTicks verwenden möchten, ist es am einfachsten, die extremsten Ticks mit der längsten Zeit aus dem erhaltenen Paket zu entfernen. Und setzen Sie _start mit dieser Zeit gleich.