Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 103

 
Nikolay Semko :

Sadece, WinAPI kullanarak iki terminali birbirine bağlamaya gelince, kernel32.dll yerine user32.dll kullanmanın daha hızlı olabileceğini söylemek istedim. tanıştığım tüm uygulamalar kernel32.dll kullanıyordu.

Bir kitaplığın diğerinden daha hızlı içe aktarılması (veya çalışması) için hiçbir neden göremiyorum.

Ancak, içe aktarılan işlevleri çağırırken ortak bir ek yük sorunu muhtemelen araştırılmalıdır. Belki de bu, MQL'nin şu anki sürümlerinde artık geçerli değildir, ancak eski MQL4'ten hatırladığım kadarıyla, bu maliyetler orada fark edilirdi, bazen işlevin hızıyla karşılaştırılabilirdi.

 
fxsaber :

Evet.

Ahh ... peki, bunu benim kaprisim olarak kabul et.

Ben sadece hızı seviyorum, çünkü kim daha hızlıysa önce gelir ve daha az CPU yükü, bu da karar vermek için daha fazla kaynak ve zaman anlamına gelir.

 
fxsaber :
Çok karakterli OnTick'in hızlı uygulanması

50 cihazda bir casus kullanan boş bir Uzman Danışman çalıştırırken, mesajlar günlüğe dökülmeye başlar:

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

500 ms'lik özel olay gönderme sıklığı için göstergeye bir filtre eklerseniz, hatalar daha az sıklıkta olur, ancak kaybolmaz.

Sadece ben mi?


Danışman kodu:

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


Profil oluşturucu, zamanın %95'ini iCustom gösterir, OnChartEvent neredeyse hiçbir şey almaz. İşlemci (i5-3570) %75 oranında yüklenmiştir.

 
Andrey Khatimliansky :

50 cihazda bir casus kullanan boş bir Uzman Danışman çalıştırırken, mesajlar günlüğe dökülmeye başlar:

Sadece ben mi?

Başlangıçta bu hatalardan birkaçını yakaladım. Daha fazla düşmediler.

Profil oluşturucu, zamanın %95'ini iCustom gösterir, OnChartEvent neredeyse hiçbir şey almaz. İşlemci (i5-3570) %75 oranında yüklenmiştir.

Sürüm sürümünde CPU ~%3'tür.

 
fxsaber :

Başlangıçta bu hatalardan birkaçını yakaladım. Daha fazla düşmediler.

Sürüm sürümünde CPU ~%3'tür.

"Optimize=1" ile hem indikatörü hem de danışmanı topladım, hatalar yağıyor.

 

Göstergeye ikinci bir duraklama eklendi:

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

Hatalar kalır.

 

Gösterge

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

danışman

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


Duraklatmayı artırmak pek yardımcı olmuyor. 3 saniyede parçalanmaya başladı.

Bilinmeyen nedenlerle, bir noktada EventChartCustom çalışmayı durdurur. Yaklaşık 3 saniye ölüyor ve 4001 hatası veriyor.

Dosyalar:
20181010.log  276 kb
 
Oleksii Chepurnyi :

Gösterge

danışman


Duraklatmayı artırmak pek yardımcı olmuyor. 3 saniyede parçalanmaya başladı.

Bilinmeyen nedenlerle, bir noktada EventChartCustom çalışmayı durdurur. Yaklaşık 3 saniye ölüyor ve 4001 hatası veriyor.

Evet, sorun bu gibi görünüyor.

Çoğalttığı başka biri var mı?

 
Andrey Khatimliansky :

Çoğalttığı başka biri var mı?

oynanamaz

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


Çalışma saati - normal uçuş.

 
fxsaber :

oynanamaz


Çalışma saati - normal uçuş.

Piyasa İzleme'de kaç enstrüman var?