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

 
Vitaly Muzichenko:

Wird es also möglich sein, mit einer solchen Konstruktion einen sehr schnellen Indikator zu haben?

Wahrscheinlicher ist, dass OnCalculate nicht bei jedem Tick aufgerufen wird, sondern nach einer Reihe von Ticks.


Wenn ja, ist das eine gute Nachricht!

 
Renat Fatkhullin:

Wir haben eine Idee für Indikatoren, die das #property tester_everytick_calculate Flag nicht enthalten, um den Berechnungsmodus basierend auf dem Erhalt eines Pakets von Ticks, anstatt auf jedem Tick, einzuschließen.

Damit wird das Problem der verspäteten Indikatoren radikal gelöst, wobei die Möglichkeit der garantierten Verarbeitung jedes Ticks für einige Indikatoren erhalten bleibt.

Ich schlage eine andere Lösung vor.

SymbolInfoTick

Gibt die aktuellen Preise eines angegebenen Symbols in einer Variablen vom Typ MqlTick zurück.

bool  SymbolInfoTick( 
   string    symbol,     // символ 
   MqlTick&  tick        // ссылка на структуру
   bool      IndicatorMode = true; // индикаторный или реальный (текущий) тик
   );

Parameter

Symbol

[Symbolname.

ticken.

[out] Eine Strukturreferenz vom TypMqlTick, in der die aktuellen Preise und der Zeitpunkt der letzten Preisaktualisierung gespeichert sind.

IndicatorMode

[out] true - bei Indikatoren wird der Tick zurückgegeben, der den aktuellen NewCalculate ausgelöst hat, false - aktueller (Echtzeit-)Tick eines Symbols.

Zurückgegebener Wert

Gibt bei Erfolg true zurück, sonst false.


Dann genügt es, in OnCalculate nur dieses Konstrukt zu schreiben

// Возвращает true, если текущий и индикаторный тики совпадают
bool IsRealTick( void )
{
  MqlTick Tick1, Tick2;
  
  return(SymbolInfoTick(_Symbol, Tick1) && SymbolInfoTick(_Symbol, Tick2, false) && (Tick1.time_msc == Time2.time_msc));
}

int OnCalculate( ... )
{
  if (prev_calculated && !IsRealTick())
    return(prev_calculated); // Если тик устарел, идем к следующему
    
  // Body
  
  return(rates_total);
}

Diese Lösung wäre flexibler und bequemer in der Anwendung und Umsetzung.


SZY Es wäre besser, eine Nummerierung der Ticks zu haben, mit der Möglichkeit, die Nummer des aktuellen und des Indikator-Ticks zu erhalten. Aber diese Variante ist für Entwickler schwieriger. Daher ist es wahrscheinlich nicht notwendig.

 
fxsaber:

Ich schlage eine andere Lösung vor.

Wenn von den Entwicklern nichts unternommen wird (was übrigens eine sehr gute Option ist), ist es immer noch möglich, alle Bremsen auf diese Weise zu umgehen

int OnCalculate( ... )
{
  static ulong MinTimeMsc = 0
  const ulong StartTime = GetMicrosecondCount();
  
  MqlTick Tick;
  const bool Res = prev_calculated && SymbolInfoTick(_Symbol, Tick);
  
  if (Res && (Tick.timeMsc < MinTimeMsc))
    return(prev_calculated); // Если тик устарел, идем к следующему
    
  // Body
  
  if (Res)
    MinTimeMsc = Tick.time_msc + (GetMicrosecondCount - StartTime) / 2000;
  
  return(rates_total);
}
 
fxsaber:

Wenn die Entwickler nichts unternehmen (was übrigens eine sehr gute Option ist), ist es möglich, alle Bremsen auf diese Weise zu umgehen

Nun, wir brauchen keine Häkchen in der Mitte eines Balkens, sie werden sowieso zwangsweise übersprungen. Warten wir auf die Umsetzung durch mql.

 
Unicornis:

Nun, wir brauchen keine Häkchen in der Mitte eines Balkens, sie werden sowieso zwangsweise übersprungen. Warten wir auf die Implementierung von mql.

Ehrlich gesagt, verstehe ich nicht, was die Betroffenen davon abgehalten hat, selbst eine Lösung für ihr Problem zu schreiben.

Und warum sollten Entwickler hier etwas ändern?


Die Lösung kann als mqh-Datei implementiert und mit einem beliebigen Indikator verbunden werden, wie es in Init_Sync implementiert ist . Aber es erfordert eine Menge Code, der nicht sehr offensichtlich ist. Und hier sind es nur wenige Zeilen.

Init_Sync
Init_Sync
  • www.mql5.com
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
 
Renat Fatkhullin:

Die eingefrorene Aktualisierung des unsichtbaren Zeitfensters eines anderen Spielers nach der Wiederverbindungskommunikation wurde behoben. Der Grund dafür war ein falscher Cache-Status nach dem erneuten Verbinden.

Die Beta-Version 1946 ist über Hilfe -> Desktop-Updates prüfen -> Neueste Beta-Version verfügbar.

Rinat, 3 Tage lang Tests ohne Probleme, danke!

 
fxsaber:

Ehrlich gesagt verstehe ich nicht, was die Betroffenen davon abgehalten hat, selbst eine Lösung für ihr Problem zu schreiben.

Und warum sollten die Entwickler hier etwas ändern?

Betroffene können die Anzahl der eingehenden Ticks im Indikator nicht verändern, sie werden im Indikator bis zu einem neuen Balken übersprungen, wenn der Indikator lange zählt, werden die Ticks ohnehin übersprungen. Irgendwie müssen wir uns an die Realität anpassen.

Liegt der Spitzenwert für ein Symbol bei ~800 Ticks pro Minute, so sind es bei der Synthetik von mehreren Symbolen bereits 2300 Ticks pro Minute. Das Öffnen eines synthetischen und eines anderen Symbols erreicht einen Spitzenwert von ~3000 Ticks pro Minute. Fügen Sie einen weiteren Zeitrahmen desselben synthetischen Materials und desselben Symbols hinzu, und wir erhalten... Ok, Elders Bildschirme waren drei, wir bekommen ~9000 Ticks pro Minute oder 150 Ticks pro Sekunde. Rinat hat bereits über Leistungsprobleme geschrieben. Warum sollten Sie 150 Ticks pro Sekunde durch einen Multisymbol-mtf-Indikator leiten, wenn Sie 1-n Ticks pro Minute für alle tf-Symbole benötigen? Ebenso sind die Vorteile des Hosting mql gehören keine Overhead aus dem Host-System, das Terminal ist das gleiche Host nur für Indikatoren und EAs. Wenn die Indikatorberechnung aus RSI(3) + EMA(5) + EMA(7) besteht, dann natürlich kein Problem in den nächsten 10 Jahren.

In der synthetischen (eigentlich ist es ein Multisymbol-Indikator aus dem Terminal) die Entwickler irgendwie kam auf die Idee, einige Symbole einfügen, warum sollten wir die Elemente dieses Systems (nehmen wir an, es ist nicht einmal perfekt) auf der Ebene der Programmierer Handwerkskunst in den Indikator zu duplizieren? Wenn das System vereinfacht werden kann, warum sollte man es nicht tun? Als die Erde noch auf drei Elefanten stand, erfand man nicht umsonst den 5-Sekunden-Takt.

Upd. Sie können den Zeitrahmen 5 Sekunden ohne Historie einführen und die Ticks werden nur einmal in 5 Sekunden sein, und alle möglichen Lösungen testen (Kompilieren eines Indikators mit einem Präfix für die Arbeit nur auf 5S, andere Indikatoren werden nicht darauf laufen) - die bestehende Ideologie des Terminals wird sich nicht ändern, so dass wir Lösungen ändern und modifizieren können, und die beste/optimale Lösung wird während des Tests gebildet werden.

(LMS zu Ihren Entwicklungsbibliotheken, Kunststoffen, abgetrennten Fenstern, usw.) Entwickler).

 
Unicornis:

Selbst wenn es eine Million Ticks pro Minute gibt, macht dies die Lösung nicht unbrauchbar.

 
fxsaber:

Eine Million Ticks pro Minute machen die Lösung nicht unbrauchbar.

Die Frage ist nicht die nach der Praktikabilität der Lösung. Wie sinnvoll ist es, den Indikator bei jedem erreichten Tick aufzurufen, vor dem eine unbekannte Anzahl von Ticks verpasst wurde, wobei auch eine gewisse Veralterung eines Ticks berücksichtigt wird? Wenn etwas übersprungen wird (mit zunehmender Belastung) und die Relevanz des Häkchens nicht bekannt ist, dann löst diese Situation das analytische Problem nicht - wenn nicht, warum sich dann damit herumschlagen. Im Allgemeinen verbieten den Fluss von Ticks in Indikatoren, lassen Sie die Ticks an den Indikator von der Plattform einmal alle 5 Sekunden - 12 Ticks pro Minute, es ist genug.

 
Unicornis:

Die Frage ist nicht die nach der Praktikabilität der Lösung. Die Sinnhaftigkeit, den Indikator bei jedem erreichten Tick aufzurufen, vor dem eine unbekannte Anzahl von Ticks verpasst wurde, wird neben einer gewissen Veralterung eines Ticks als nicht sinnvoll erachtet. Wenn etwas übersprungen wird (mit zunehmender Belastung) und die Relevanz des Häkchens nicht bekannt ist, dann löst diese Situation das analytische Problem nicht - wenn nicht, warum sich damit beschäftigen. Im Allgemeinen sollte der Fluss von Ticks in Indikatoren verboten werden, die Ticks, die alle 5 Sekunden von der Plattform kommen, sollten gelassen werden - 12 Ticks pro Minute, das ist genug.

Dummheit.

Grund der Beschwerde: