Caractéristiques du langage mql5, subtilités et techniques - page 103

 
Nikolai Semko:

Je voulais juste dire que l'utilisation de user32.dll au lieu de kernel32.dll peut être plus rapide pour lier deux terminaux à l'aide de WinAPI, car toutes les implémentations que j'ai vues utilisent kernel32.dll.

Je ne vois pas pourquoi il serait plus rapide d'importer depuis une bibliothèque que depuis une autre.

Peut-être que ce n'est pas pertinent dans les versions actuelles de MQL, mais pour autant que je me souvienne de l'ancien MQL4, ces coûts étaient assez importants et parfois même comparables à la vitesse d'exécution des fonctions.

 
fxsaber:

Oui.

Ahh... eh bien, pense que c'est mon caprice.

J'aime la vitesse, parce que celui qui est le plus rapide passe en premier, et aussi parce que l'unité centrale est moins sollicitée, ce qui signifie plus de ressources et de temps pour prendre une décision.

 
fxsaber:
Implémentation rapide de OnTick multi-symboles

Lorsqu'on exécute un conseiller expert vide en utilisant un espion sur 50 symboles, les messages commencent à s'accumuler dans le journal :

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

Si j'ajoute un filtre à l'indicateur pour la fréquence d'envoi des événements de castum de 500ms, les erreurs deviennent moins fréquentes, mais elles ne disparaissent pas.

C'est seulement moi ?


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


Leprofileur montre 95% du temps de iCustom, OnChartEvent ne prend presque rien. Le processeur (i5-3570) est chargé à 75%.

 
Andrey Khatimlianskii:

Lors de l'exécution d'un EA vide utilisant un espion sur 50 instruments, les messages commencent à affluer dans le journal :

C'est juste moi ?

J'ai relevé plusieurs de ces erreurs au début. Je n'ai pas été plus loin.

Leprofileur montre que 95% du temps iCustom, OnChartEvent ne prend presque rien. La charge du CPU (i5-3570) est de 75%.

Dans la version Release, le CPU est de ~3%.

 
fxsaber:

J'ai relevé quelques-unes de ces erreurs au début. Pas d'autres accidents.

La version release a un CPU de ~3%.

J'ai construit l'indicateur et le conseiller expert avec "Optimize=1", les erreurs se produisent toujours.

 

Ajout d'une seconde pause à l'indicateur :

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

Des erreurs subsistent.

 

Indicateur

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


Augmenter la pause n'aide pas beaucoup. Il commence à s'effriter même à 3 secondes.

Pour des raisons inconnues, à un moment donné, EventChartCustom cesse de fonctionner. Bloque pendant environ 3 secondes et génère l'erreur 4001.

Dossiers :
20181010.log  276 kb
 
Oleksii Chepurnyi:

Indicateur

EA


Augmenter la pause n'aide pas beaucoup. Il a commencé à s'effriter même à 3 secondes.

Pour une raison inconnue, à un moment donné, EventChartCustom cesse de fonctionner. Il se bloque pendant environ 3 secondes et donne l'erreur 4001.

Oui, cela semble être le problème.

Est-ce que quelqu'un d'autre l'a en lecture ?

 
Andrey Khatimlianskii:

Est-ce qu'elle est toujours en cours ?

Ce n'est pas le cas.

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


Une heure de travail - le vol est normal.

 
fxsaber:

Pas de lecture


Une heure de travail - vol normal.

Combien d'instruments sont passés en revue sur le marché ?