MT5 und Geschwindigkeit in Aktion - Seite 88

 
fxsaber:

Einer ist genug.

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

Zusätzlich prüfe ich auf "". Ich selbst verwende immer NULL, wenn ich Methoden für das aktuelle Zeichen aufrufe.

 
Artyom Trishkin:

Ihr Code wird keine Beschleunigung bewirken.

 
fxsaber:
Es fällt mir schwer, offensichtliche Dinge zu erklären. Es ist möglich, GetMarketWatchTick in diesem Code zu beschleunigen.
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);
}

Glauben Sie, dass auch bei Übergabe von _Symbol als Symbol-Parameter ein String an SymbolInfoTick() übergeben wird?

Ich glaube nicht, dass es innerhalb von Standardfunktionen keine Überprüfungen auf String-Gleichheit mit dem aktuellen Symbol gibt, und solche expliziten Parameter beginnen mit der Überprüfung "auf Hochtouren", wenn ein Cache für das aktuelle Symbol zur Verfügung steht.

 

Die Beschleunigung findet zur Kompilierzeit statt, nicht zur Laufzeit.

Der Compiler nimmt diese Ersetzung vor:

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

In allen anderen Fällen wird keine Ersetzung vorgenommen.

 
fxsaber:

Die Beschleunigung erfolgt zur Kompilierzeit, nicht zur Laufzeit.

Der Compiler nimmt diese Ersetzung vor:

In allen anderen Fällen wird keine Ersetzung vorgenommen.

Nun. Das ist es, wovon ich spreche - Ihr Code wird die reguläre Funktion für das NICHT aktuelle Zeichen NICHT beschleunigen. Auch das aktuelle Zeichen wird dadurch nicht beschleunigt.

Und meine nicht. Und das war noch nie der Fall. Ich hatte auch keine Illusionen darüber. Ich verwende jedoch immer Symbol() oder NULL, wenn ich reguläre Funktionen aufrufe und meiner Funktion NULL oder "" übergeben wird. Dies ruft einen schnellen Code einer regulären Funktion auf - wobei die Daten für das aktuelle Symbol aus dem Cache genommen werden.
Wenn mein Funktionsaufruf Symbol() oder _Symbol verwendet - wird innerhalb der Standardfunktion NICHT geprüft, ob es mit dem aktuellen Symbol übereinstimmt? Wird der Code mit Vollbereichsprüfungen des aktuellen Symbols wirklich ausgeführt? Ich kann es nicht glauben...

 
Artyom Trishkin:

Nun. Das ist es, wovon ich spreche - Ihr Code wird die reguläre Funktion für das NICHT aktuelle Zeichen NICHT beschleunigen. Auch das aktuelle Zeichen wird dadurch nicht beschleunigt.

Vielleicht kann es Ihnen jemand genauer erklären. Bei mir hat es nicht funktioniert.

 
fxsaber:

Vielleicht kann es Ihnen jemand genauer erklären. Ich habe es nicht verstanden.

Was zaubern Sie, um die regulären Funktionen zu beschleunigen?

Sie verwenden die Ersetzung des Wertes des aktuellen Zeichens, wenn Sie es an die Notensystemfunktion übergeben, damit diese die Daten für das aktuelle Zeichen aus dem Zwischenspeicher verwendet. Dadurch wird die normale Funktion NICHT beschleunigt, sondern es wird die Geschwindigkeit für das aktuelle Zeichen verwendet.

Man kann etwas nicht beschleunigen, wenn man keinen Zugang zur Quelle hat. Sie verwenden die Standardtechnik, um die Funktion korrekt aufzurufen. Aber ich bin mir nicht sicher, wenn Symbol durch einen String als "EURUSD" angegeben wird, wenn mit EURUSD gearbeitet wird, d.h. es wird das aktuelle Symbol verwendet, dann prüft die Staff-Funktion nicht, ob der String "EURUSD" gleich Symbol() ist und verwendet keine Daten aus dem Cache, sondern beginnt, das Symbol mit voller Geschwindigkeit zu prüfen.

Wo liegt also die Beschleunigung der regulären Funktion? Wenn es sie gibt, ist sie mehr als interessant und nützlich.

 
fxsaber:

Ist das bei MT4 auch so? Und wie sieht es im MT5-Tester aus?

Gilt das auch für CopyTicks?

 
fxsaber:

Vielleicht kann es Ihnen jemand genauer erklären. Ich habe es nicht verstanden.

Wahrscheinlich haben Sie meine Frage einfach nicht verstanden. Ich habe es mehrmals wiederholt (und in dieser Frage ging es NICHT um die "Beschleunigung der regulären Funktion").

 
Slava:

Wird anstelle von Symbol(), _Symbol oder NULL ein normaler String-Parameter angegeben, so werden vollständige Prüfungen durchgeführt und auch Eigenschaften abgefragt.

Aus irgendeinem Grund wird in dieser Erklärung nicht gesagt, dass, wenn der String-Parameter mit dem aktuellen Zeichen übereinstimmt, keine Prüfungen gegen das vollständige Programm durchgeführt werden.

Grund der Beschwerde: