Metatrader 5 - シンボルを通してチャートを循環させるとき、多くのメモリを消費します。

 
こんにちは。

Expert Advisorでシンボルを循環させるように設定しているのですが、メモリを大量に消費してしまいます。

これは、シンボルがMarket Watchにロードされたりアウトされたりするときに、徐々に増加することに気づきました。 つまり、Market Watchの既存のアイテムを通じてチャートが循環するのではなく、新しいシンボルがロードされたり削除されたりするときに、より多くなるのです。

以下のように設定されています。

  1. OnInitは3秒ごとにタイマーを起動するように設定します。
  2. OnTimer
    1. SymbolTotal() SymbolName() を使ってリストの中の次のシンボルを取得する。
    2. SymbolSelect() でMarket Watchにロードし、ChartSetSymbolPeriod()で現在のチャートを次のシンボルにセットする。
    3. SymbolSelect()を使ってMarket Watchにある未使用のシンボルを削除する

カスタムコードをできるだけ削除し、上記の手順で利用可能なシンボルを通してチャートを循環させると、私のマシンのメモリ使用量が増え続けていることに気づきました。

CPUは一定ですが、メモリはどんどん増えていきます。

質問

  1. なぜこのようなことが起こるのでしょうか?
  2. メモリ不足を解消するための回避策や提案はあるのでしょうか?
    (例えば、ChartSetSymbolPeriod()で既存のチャートを使用する代わりに、ChartOpen()で新しいチャートを開くなど)
  3. 回避策はあるのでしょうか?
    (つまり、これは単に動作する方法なのでしょうか)
  4. 他に何か提案はありますか?


ありがとうございました。

 
エンドレスループかも?コード無しで推測するのは難しい。
 

確かに無限ループですが、それがアイデアなのです。

すべてのシンボルを循環させ続けるためです。

以下のコードは3秒ごとに実行されます。

以下はコードの断片です(デモのため、すべて1つのメソッドになっています)。

void OnTimer()
  {
      // Find next symbol
      long symbolsTotal = SymbolsTotal(false);
      long count = GlobalVariableGet("testmem");
      if(count >= symbolsTotal)
      {
         count = 0;         
      }                  
      string newSymbol = SymbolName(count, false);
      SymbolSelect(newSymbol, true);
      count++;
      GlobalVariableSet("testmem", count);
      
      // Change chart symbol
      ChartSetSymbolPeriod(0, newSymbol, Period());         
      
      // Remove other symbols from Market Watch
      CArrayString *symbols = new CArrayString();
      for(int i = 0; i < SymbolsTotal(true); i++)
      {
         string symbol = SymbolName(i, true); // Get name from local market watch
         symbols.Add(symbol);
      }           
            
      int total = symbols.Total();
      for(int i = 0; i < total; i++)
      {
         string symbolToRemove = symbols.At(i);
         
         // Is the symbol not the current chart or about to  
         // be added?
         if(newSymbol != symbolToRemove)
         {            
            // Remove from Market Watch
            SymbolSelect(symbolToRemove, false);   
         }         
      }
      
      delete symbols;
   
  }
 
シンボルはどこから始まるのか?
 

シンボル」が何を意味するのかわかりませんが、上記のコードはExecuteTimer()が3秒に設定された新しいExpert Advisorの中に入っています。

以下はそのコードです(これはEA内のものです)。

int OnInit()
{
//--- タイマーを作成する
EventSetTimer(3);

//---
return(INIT_SUCCEEDED);
}

 
こんにちは。

スクリプトの全容は添付ファイル「ForumQuestion1.mq5」をご覧ください。

エラーを再現する手順

  1. Metatrader5用の添付のスクリプトをMetaeditorで開く(安全です)。
  2. Windowsのタスクマネージャーを開く
    1. Metatrader 5 Client Terminal "を探し、メモリ量を記録する。
  3. スクリプトを実行し、タスク・マネージャのメモリ・カラムを確認します。

スクリプトがシンボルを循環するにつれて、メモリはゆっくりと増加します。

ファイル:
 
gr101:
こんにちは。

添付ファイルの "ForumQuestion1.mq5 "にスクリプトの全容を追加しました。

エラーを再現する手順

  1. Metatrader5用の添付のスクリプトをMetaeditorで開く(安全です)。
  2. Windowsのタスクマネージャーを開く
    1. Metatrader 5 Client Terminal "を探し、メモリ量を記録する。
  3. スクリプトを実行し、タスク・マネージャのメモリ・カラムを確認します。

スクリプトがシンボルを循環するにつれて、メモリはゆっくりと増加します。

あなたのコードを試しましたが、メモリの問題はありません。

MT5 Build 1325です。

 

Alainさん、こんにちは。

回答ありがとうございます。

私も同じビルドでやっています。メモリの増設は遅いです。数分かかります。基本的には徐々に増えていきます。

添付ファイルの "Memory increase.docx.png "をご覧ください。時間の経過とともに蓄積されていく様子を示すスクリーンショットがいくつか含まれています。

同じビルドの "MT5 Build 1325 "を使用しています。

マシン情報です。

  • Windows 8.1 Enterprise
  • 64ビットOS
  • 16Gb RAM
  • i7プロセッサ

ありがとうございます。

ファイル:
 
gr101:

アランさん、こんにちは。

回答ありがとうございます。

私も同じビルドでやっています。メモリの増設は遅いです。数分かかります。基本的には徐々に増えていきます。

添付ファイルの "Memory increase.docx.png "をご覧ください。時間が経つにつれて増えていく様子がわかるスクリーンショットがいくつかあります。

同じビルドの "MT5 Build 1325 "を使用しています。

マシン情報

  • Windows 8.1 Enterprise
  • 64ビットOS
  • 16Gb RAM
  • i7プロセッサ

ありがとうございます。

私はWindows 10を使用しています。

あなたのスクリプトは、私の前の投稿の数分前から実行されています。現在、メモリ使用量は起動時よりも少なくなっています(300Mbに対して280Mb)。

EDIT: 今もう一度確認 したら、189 Mb になっていました!!まだ減っています :D

EDIT2: Metaquotes Demo-Server で実行中です。

 

フィードバックありがとうございます。

Windows 10にアップグレードして、違いがあるかどうか見てみようと思います。

 

Windows Server 12 R2に乗せたら、これもメモリが押し上げられました。

しばらく監視して、このスレッドにフィードバックさせてください。

理由: