MT5 und Geschwindigkeit in Aktion - Seite 87

 
fxsaber:

Schneller.

Es tut das Gleiche - es gibt den Funktionswert zurück. Sie führt aber auch Kontrollen im Vorfeld durch.
Innerhalb der Funktion selbst gibt es auch Überprüfungen für den übergebenen Wert des Symbolnamens, und von ihm - entweder "wenn ein einfacher String-Parameter anstelle von Symbol(), _Symbol oder NULL, dann prüft für das vollständige Programm und mehr Eigenschaft Anfrage", oder verwendet Werte des aktuellen Symbols aus dem Cache ohne zusätzliche Prüfungen.
Warum machen Sie sie noch einmal und behaupten immer noch, dass sie den Datenabruf beschleunigen? Ich verstehe die Logik einer solchen Argumentation nicht.

Übrigens tue ich das immer in meinen Funktionen, aber ich glaube nicht, dass es den Datenabruf irgendwie beschleunigt, sondern ihn eher verlangsamt, weil der Wert des übergebenen Symbolnamens in meiner Funktion überprüft wird.

 
Artyom Trishkin:

Warum machen Sie sie noch einmal, obwohl Sie behaupten, dass die Daten dadurch schneller werden?

Sie haben die Erklärung selbst zitiert.

 
Slava:

Symbol(), _Symbol-Einträge sind äquivalent zu NULL (wobei NULL anstelle des Symbolnamens zulässig ist)

Ist das bei MT4 auch so? Und was ist mit MT5 Tester?

 
Artyom Trishkin:

Übrigens, ich mache das immer in meinen Funktionen

Zeigen Sie es mir bitte.

 
fxsaber:

Sie haben die Erklärung selbst zitiert.

Genau - das wird alles innerhalb der regulären Funktion erledigt. Warum sollte man sie auch auf der Außenseite duplizieren?

 
Artyom Trishkin:

Genau - das wird alles innerhalb der regulären Funktion erledigt. Warum sollte man sie auch auf der Außenseite duplizieren?

Dann haben Sie die Erklärung nicht verstanden. Die Geschwindigkeit der beiden Anrufe ist unterschiedlich.

void OnTick()
{
  static const string Symb = _Symbol;
  MqlTick Tick;
  
  SymbolInfoTick(_Symbol, Tick);
  SymbolInfoTick(Symb, Tick);  
}
 
fxsaber:

Bitte zeigen Sie es mir.

Alle Funktionen und Methoden, bei denen dies mit mir gemacht wird?

Es gibt zu viele von ihnen.

 
Artyom Trishkin:

Alle Funktionen und Methoden, bei denen ich dies tue?

Einer ist genug.

 
fxsaber:

Dann haben Sie die Erklärung nicht verstanden. Die Geschwindigkeit der beiden Anrufe ist unterschiedlich.

Ich scheine alles verstanden zu haben. Natürlich ist es anders. Wie haben Sie es beschleunigt? In einem Fall übergeben Sie einen Wert, der nicht das aktuelle Symbol ist, an die Funktion - wenn er not_Symbol ist.

In diesem Fall, in dem Sie den oben genannten Wert an die Funktion übergeben, führt die Funktion keine Prüfungen durch und nimmt den Wert des aktuellen Symbols aus dem Cache.

In anderen Fällen werden die Daten des angegebenen Symbols mit einer Prüfung auf "volles Programm" und seine Präsenz in der Marktübersicht abgefragt. Ihre "schnelle" Funktion wird diese Prüfungen nicht los, wenn sie Daten von einem nicht-nativen Symbol anfordert. Wo liegt also die Beschleunigung?

bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Nur zwei Optionen in Ihrer Funktion, wenn diese aufgerufen wird if(SymbolInfoTickFast(Symbol(), tick_array)) {}

  1. Daten des aktuellen Symbols abrufen - Aufruf von SymbolInfoTick mit Parameter _Symbol (quick)
  2. andere Symboldaten abrufen - SymbolInfoTick mit String-Parameter aufrufen (langsam)

Eine andere Sache, wenn Sie (in Ihrer Gewohnheit, alles zu definieren, was sich bewegt) eine String-Variable für das aktuelle Symbol erstellen, dann ja - Sie müssen hier Überprüfungen durchführen und Ihre Makro-Ersetzung durch eine vordefinierte Variable ersetzen, oder Symbol() aufrufen

 
Artyom Trishkin:

Wie haben Sie es beschleunigt?

Es ist schwer für mich, das Offensichtliche zu erklären.
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}
In diesem Code ist es möglich, GetMarketWatchTick zu beschleunigen.