Diskussion zum Artikel "LifeHack für Händler: ForEach mit #define zubereiten" - Seite 2

 
Rashid Umarov:

Eine interessante und nicht offensichtliche Technik )

Sie ist mangelhaft (für Bummer-Strukturen) und nicht optimal.

 
fxsaber:
Für das Copybook

ist es nicht sehr bequem. Es ist nicht offensichtlich, dass eine externe Variable deklariert werden muss.

[Gelöscht]  

"Auf Vorlagen" bedeutete dies:

template< typename T >
class SeriesVolume
{
public:
   T operator[]( const int i ) const
   {
      long val[1];
      if( CopyTickVolume( Symbol(), Period(), i, 1, val ) == 1 ){
         return (T)val[0];
      }
      return -1;
   }
};

SeriesVolume< long > Volume;

Wenn Sie verwirrend sein wollen, können Sie das immer noch tun:

#define  CVolume SeriesVolume< long >

CVolume Volume;

Alles andere ist einfach unnötig.

 
fxsaber:

Weniger Schrift ist manchmal praktisch

Es ist nur eine Frage der Machbarkeit, der Benutzerfreundlichkeit und der Leistung.

Die Leistung des Programms wird nicht darunter leiden. Aber das Verstecken von überflüssigen Details vor Ihren Augen ist ein positiver Effekt. Sie sollten sich diesen Trick merken und anwenden.

[Gelöscht]  
Ist der Code in der Standardbibliothek fertig?
 
fxsaber:

Furchtbar teuer! Wenn Sie es wirklich durch die Struktur tun wollen, sollten Sie es zumindest getan haben. Und es gibt keine Kontrolle aus irgendeinem Grund.

SymbolInfoDouble ist voll MT4-kompatibel.

Leistungsmessung

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

double GetAsk()
{
  static MqlTick tick = {0};
  
  return(SymbolInfoTick(Symbol(),tick) ? tick.ask : 0);
}

#define  AMOUNT 1 e6

void OnStart()
{
  double Sum = 0;
  
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += GetAsk())
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += SymbolInfoDouble(_Symbol, SYMBOL_ASK))
  
  Print(Sum);
}


Ergebnis

Time[for(inti=0;i<AMOUNT;i++)Sum+=GetAsk()] = 78952
Time[for(inti=0;i<AMOUNT;i++)Sum+=SymbolInfoDouble(_Symbol,SYMBOL_ASK)] = 162606

Ich lag absolut falsch! SymbolInfoDouble ist doppelt so langsam wie SymbolInfoTick.

 
fxsaber:

Leistungsmessung


Ergebnis


Ich lag absolut falsch! SymbolInfoDouble ist doppelt so langsam wie SymbolInfoTick.

Danke für die Leistungsmessung.

Es stellt sich heraus, dass die SymbolInfoDouble-Dokumentation nicht lügt:

Hinweis

Wenn die Funktion verwendet wird, um Informationen über den letzten Tick zu erhalten, ist es besser,SymbolInfoTick()zu verwenden.

 
fxsaber:

Leistungsmessung

Ergebnis

Ich lag absolut falsch! SymbolInfoDouble ist doppelt so langsam wie SymbolInfoTick.

Hat die Verwendung von static Auswirkungen auf die Geschwindigkeit? Ich entschuldige mich dafür, dass ich es nicht selbst überprüft habe, aber ich denke, Sie haben bereits verglichen.

 
Rashid Umarov:

Beeinträchtigt die Verwendung von Statik die Geschwindigkeit? Ich entschuldige mich dafür, dass ich es nicht selbst überprüft habe, aber ich glaube, Sie haben es bereits verglichen.

In diesem Fall ist das nicht der Fall. Ich denke, es ist ein Fehler des Compilers.

 
fxsaber:

Ich lag völlig falsch! SymbolInfoDouble ist doppelt so langsam wie SymbolInfoTick.

Inkompetent. Ergebnis im Tester

2017.09.01 00:00:10   Time[for(inti=0;i<AMOUNT;i++)Sum+=GetAsk()] = 87424
2017.09.01 00:00:10   Time[for(inti=0;i<AMOUNT;i++)Sum+=SymbolInfoDouble(_Symbol,SYMBOL_ASK)] = 83410

Wenn Sie Leistung benötigen (Optimierer), ist es besser, SymbolInfoDouble zu verwenden. In der realen Welt - kein Unterschied.


ZY Sie sollten die Geschwindigkeit von Funktionen in einer Umgebung messen, in der Leistung wichtig ist - Tester.