Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 103

 
Nikolai Semko:

Volevo solo dire che forse usare user32.dll invece di kernel32.dll può essere più veloce nel collegare due terminali usando WinAPI, perché tutte le implementazioni che ho visto usano kernel32.dll.

Beh, non vedo alcuna ragione per cui dovrebbe essere più veloce importare da una libreria che da un'altra.

Forse, non è rilevante nelle versioni attuali di MQL, ma per quanto ricordo dal vecchio MQL4, questi costi erano abbastanza significativi e a volte anche paragonabili alla velocità di esecuzione delle funzioni.

 
fxsaber:

Sì.

Ahh... beh, consideralo un mio capriccio.

Mi piace solo la velocità, perché chi è più veloce viene prima, e inoltre c'è meno carico sulla CPU, il che significa più risorse e tempo per prendere una decisione.

 
fxsaber:
Implementazione rapida di OnTick multisimbolo

Quando si esegue un Expert Advisor vuoto usando una spia su 50 simboli, i messaggi iniziano ad accumularsi nel log:

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

Se aggiungo un filtro all'indicatore per la frequenza di invio di eventi castum di 500ms, gli errori diventano meno frequenti, ma non spariscono.

Sono solo io?


Codice EA:

#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;
}


Ilprofiler mostra il 95% del tempo di iCustom, OnChartEvent non richiede quasi nulla. Il processore (i5-3570) è caricato al 75%.

 
Andrey Khatimlianskii:

Quando si esegue un EA vuoto usando una spia su 50 strumenti, i messaggi iniziano a riversarsi nel log:

Sono solo io?

Ho colto diversi di questi errori all'inizio. Non li ho presi oltre.

Ilprofiler mostra il 95% del tempo di iCustom, OnChartEvent non prende quasi nulla. Il carico della CPU (i5-3570) è del 75%.

Nella versione Release la CPU è ~3%.

 
fxsaber:

Ha colto alcuni di questi errori all'inizio. Nessun altro incidente.

La versione di rilascio ha CPU ~3%.

Ho costruito sia l'indicatore che l'Expert Advisor con "Optimize=1", gli errori si verificano ancora.

 

Aggiunta una seconda pausa all'indicatore:

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();

Gli errori rimangono.

 

Indicatore

#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()
{
}
//+------------------------------------------------------------------


Aumentare la pausa non aiuta molto. Comincia a sbriciolarsi anche a 3 secondi.

Per ragioni sconosciute, ad un certo punto, EventChartCustom smette di funzionare. Va in stallo per circa 3 secondi e genera l'errore 4001.

File:
20181010.log  276 kb
 
Oleksii Chepurnyi:

Indicatore

EA


Aumentare la pausa non aiuta molto. Ha iniziato a sbriciolarsi anche a 3 secondi.

Per qualche ragione sconosciuta, ad un certo punto, EventChartCustom smette di funzionare. Va in stallo per circa 3 secondi e dà errore 4001.

Sì, sembra essere questo il problema.

C'è qualcun altro che lo fa suonare?

 
Andrey Khatimlianskii:

Sta ancora giocando?

Non lo è.

#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);
   }
}


Un'ora di lavoro - volo è normale.

 
fxsaber:

Nessuna riproduzione


Un'ora di lavoro - volo normale.

Quanti strumenti nella revisione del mercato?

Motivazione: