mql5言語の特徴、微妙なニュアンスとテクニック - ページ 103

 
ニコライ・セムコ

ただ、私が見たすべての実装はkernel32.dllを使用しているので、おそらくkernel32.dllの代わりにuser32.dllを使用すると、WinAPIを使用して2つのターミナルをリンクする際に速くなるかもしれないことを言いたかっただけです。

まあ、あるライブラリからインポートする方が、他のライブラリからインポートするよりも速いという理由はないでしょう。

おそらく、現在のMQLのバージョンでは関係ないのでしょうが、私が昔のMQL4から覚えている限りでは、これらのコストはかなり大きく、時には関数の実行速度に匹敵することさえありました。

 
fxsaber

はい。

ああ...まあ、私の気まぐれだと思ってください。

ただ、スピードが好きなんです。速い方が優先されますし、CPUの負荷が少ないので、リソースや判断する時間が増えるからです。

 
fxsaber:
クイックマルチシンボル OnTick の実装

50シンボルのスパイを使用して空のExpert Advisorを実行すると、ログにメッセージが蓄積され始める。

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

インジケータに500msのcastumイベント送信頻度のフィルターを追加すると、エラーは少なくなりますが、消えるわけではありません。

私だけでしょうか?


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


プロファイラでは、iCustomの時間が95%、OnChartEventの時間がほとんどかからないことがわかります。プロセッサー(i5-3570)は75%負荷がかかっています。

 
Andrey Khatimlianskii:

スパイを使用して空のEAを50の商品で実行すると、ログにメッセージが殺到します。

私だけでしょうか?

このようなミスを、最初のうちはいくつも見つけていました。それ以上は手に入れなかった。

プロファイラでは、iCustomの時間の95%がOnChartEventにかかり、ほとんど何もしていないことがわかります。CPU(i5-3570)の負荷は75%。

リリース版ではCPUは~3%です。

 
fxsaber

このようなミスを冒頭でいくつか発見しました。それ以上のクラッシュはありません。

リリース版ではCPUが3%程度。

インジケーター、Expert Advisorともに「Optimize=1」でビルドしましたが、やはりエラーが発生します。

 

インジケーターに1秒間のポーズを追加しました。

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

エラーは残っています。

 

インジケーター

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

電子ブック

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


一時停止を増やしても、あまり効果がありません。3秒でも崩れ始める。

原因不明ですが、ある時、EventChartCustomが 動作しなくなります。約3秒間停止し、エラー4001が発生する。

ファイル:
20181010.log  276 kb
 
オレクシイ・チェプルーニ

インジケーター

電子ブック


一時停止を増やしても、あまり効果がありません。3秒でも崩れ始めた。

原因不明ですが、ある時、EventChartCustomが動かなくなります。約3秒間停止し、エラー4001が発生する。

はい、それが問題のようです。

再生している方はいらっしゃいますか?

 
アンドレイ・ハチムリアンスキー

まだ再生しているのでしょうか?

違うんです。

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


1時間の作業~フライトは普通です。

 
fxsaber

再生不可


1時間の作業-フライトノーマル。

市場レビューの楽器は何台?

理由: