Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 103

 
Nikolai Semko:

Ich wollte nur sagen, dass die Verwendung von user32.dll anstelle von kernel32.dll beim Verknüpfen von zwei Terminals mit WinAPI vielleicht schneller ist, da alle Implementierungen, die ich gesehen habe, kernel32.dll verwenden.

Nun, ich sehe keinen Grund, warum der Import aus einer Bibliothek schneller sein sollte als aus einer anderen.

Vielleicht ist es in den aktuellen MQL-Versionen nicht relevant, aber soweit ich mich an das alte MQL4 erinnere, waren diese Kosten ziemlich signifikant und manchmal sogar vergleichbar mit der Ausführungsgeschwindigkeit von Funktionen.

 
fxsaber:

Ja.

Ahh... naja, betrachte es als meine Laune.

Ich mag einfach Geschwindigkeit, denn wer schneller ist, hat Vorrang, und außerdem wird die CPU weniger belastet, was mehr Ressourcen und Zeit für eine Entscheidung bedeutet.

 
fxsaber:
Schnelle Multisymbol-OnTick-Implementierung

Wenn Sie einen leeren Expert Advisor mit einem Spion für 50 Symbole ausführen, häufen sich die Meldungen im Protokoll:

2018.10.09 22:49:24.730 Spy (AUDNZD,W1) indicator is too slow, 4281 ms. rewrite the indicator, please

Wenn ich dem Indikator einen Filter für die Häufigkeit des Sendens von Castum-Ereignissen von 500ms hinzufüge, werden die Fehler seltener, aber sie verschwinden nicht.

Geht es nur mir so?


EA-Code:

#define  ForEach(index,array)   for(int index=0, max_##index=ArraySize(array);  index<max_##index;  index++)

string Symbols[];

int OnInit()
{
   ArrayResize( Symbols, SymbolsTotal(true) );

   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName(i,true);

      if( Symbols[i] != _Symbol )
         iCustom( Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i );
   }
   return(INIT_SUCCEEDED);
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   if( id == CHARTEVENT_CUSTOM )
      OnTickMS( Symbols[ (int)lparam ] );
}

void OnTick()
{
   CheckSignal( _Symbol );
}

void OnTickMS(const string &Symb)
{
   CheckSignal( Symb );
}

void CheckSignal(const string symbol)
{
   //Comment( symbol, ": ",
   //                   DoubleToString( SymbolInfoDouble( symbol, SYMBOL_BID ), 5 ), " / ",
   //                   DoubleToString( SymbolInfoDouble( symbol, SYMBOL_ASK ), 5 ) );
   return;
}


Profiler zeigt 95% iCustom Zeit, OnChartEvent nimmt fast nichts. Der Prozessor (i5-3570) ist zu 75 % ausgelastet.

 
Andrey Khatimlianskii:

Wenn ein leerer EA mit einem Spion für 50 Instrumente ausgeführt wird, häufen sich die Meldungen im Protokoll:

Geht es nur mir so?

Einige dieser Fehler sind mir gleich zu Beginn aufgefallen. Ich habe sie nicht weiter beachtet.

Der Profiler zeigt 95% der iCustom Zeit, OnChartEvent nimmt fast nichts. Die CPU (i5-3570) ist zu 75 % ausgelastet.

In der Release-Version beträgt der CPU-Anteil ~3%.

 
fxsaber:

Einige dieser Fehler sind mir am Anfang aufgefallen. Keine weiteren Abstürze.

Release-Version hat CPU ~3%.

Ich habe sowohl den Indikator als auch den Expert Advisor mit "Optimize=1" erstellt, die Fehler treten trotzdem auf.

 

Dem Indikator wurde eine zweite Pause hinzugefügt:

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
   static datetime prev = 0;
   if ( TimeCurrent() <= prev ) return(rates_total);
   prev = TimeCurrent();

Es bleiben Fehler.

 

Indikator

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int  Index = 0;

ulong timer = GetMicrosecondCount();
//===================================================================
//| 
//+------------------------------------------------------------------
int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
   if( GetMicrosecondCount() - timer < 1 e6 ) return( rates_total );
   
   timer = GetMicrosecondCount();
   
   if( prev_calculated )
   {
      ResetLastError();
      
      if( EventChartCustom( Chart, 0, Index, 0, NULL ))
         Print( GetMicrosecondCount() - timer );
      else
         Print( (string)_LastError +" "+ (string)(GetMicrosecondCount() - timer) );
   }
   
   return( rates_total );
}
//+------------------------------------------------------------------

EA

#property strict
//+------------------------------------------------------------------
#define  ForEach(index,array)               for(int index=0, max_##index=ArraySize(array);  index<max_##index;  index++)
//+------------------------------------------------------------------
string Symbols[];

//===================================================================
//| Expert initialization function
//+------------------------------------------------------------------
int OnInit()
{
   ArrayResize( Symbols, SymbolsTotal(true) );
   
   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName(i,true);
      
      if( Symbols[i] != _Symbol )
         iCustom( Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i ); // MQL5\Indicators\Spy.ex5
   }
   
   return(INIT_SUCCEEDED);
}
//===================================================================
//| Expert deinitialization function
//+------------------------------------------------------------------
void OnDeinit(const int reason)
{
   ArrayFree( Symbols );
}
//===================================================================
//| ChartEvent function
//+------------------------------------------------------------------
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
}
//===================================================================
//| Expert tick function
//+------------------------------------------------------------------
void OnTick()
{
}
//+------------------------------------------------------------------


Eine Erhöhung der Pausenzeit hilft nicht viel. Schon nach 3 Sekunden beginnt es zu bröckeln.

Aus unbekannten Gründen funktioniert EventChartCustom an einem bestimmten Punkt nicht mehr. Bleibt für etwa 3 Sekunden stehen und erzeugt den Fehler 4001.

Dateien:
20181010.log  276 kb
 
Oleksii Chepurnyi:

Indikator

EA


Eine Erhöhung der Pausenzeit hilft nicht viel. Er begann schon bei 3 Sekunden zu bröckeln.

Aus irgendeinem unbekannten Grund funktioniert EventChartCustom irgendwann nicht mehr. Bleibt für etwa 3 Sekunden stehen und gibt Fehler 4001 aus.

Ja, das scheint das Problem zu sein.

Spielt das noch jemand?

 
Andrey Khatimlianskii:

Wird es noch gespielt?

Das ist es nicht.

#define  ForEach(index,array)   for(int index=0, max_##index=ArraySize(array);  index<max_##index;  index++)

string Symbols[];
int Counter[];

int OnInit()
{
   ArrayResize(Counter, ArrayResize( Symbols, SymbolsTotal(true) ));   
   ArrayInitialize(Counter, 0);

   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName(i,true);

      if( Symbols[i] != _Symbol )
         if (iCustom( Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i ) == INVALID_HANDLE)
          Alert(Symbols[i]);
   }
   return(INIT_SUCCEEDED);
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   static int Count = 0;
   
   if( id == CHARTEVENT_CUSTOM )
   {
     Counter[(int)lparam]++;
     
     string Str = (string)Count++ + "\nMarketWatch:";
     
     for (int i = 0; i < ArraySize(Counter); i++)
      Str += "\n" + (string)i + ": " + Symbols[i] + " " + (string)Counter[i];
      
     Comment(Str);
   }
}


Eine Stunde Arbeit - ein Flug ist normal.

 
fxsaber:

Kein Playback


Eine Stunde Arbeit - ein normaler Flug.

Wie viele Instrumente werden auf dem Markt überprüft?

Grund der Beschwerde: