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

 
gr101:

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

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

現在650Mbです

何も変えずに、そのまま稼働させています。

 
gr101:

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

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

ループに着目しているのですね。EAで他に何を使っていますか?グラフィカルなコントロールや 他のコントロールはありますか?
 

先ほどのスクリプトがフルEA(ForumQuestion1.mq5)で、これがメモリを押し上げるものです。EAには他のアクションはありません。

グラフィカルなコントロールも ありません。

 

Alainさん、こんにちは。

添付のワードドキュメントをご覧ください。これは、Windows Azureで動作しているWindows Server 2012 R2インスタンスからのものです。これは新しいマシンで、西ヨーロッパのデータセンターで動作しています。

ForumQuestion1.mq5スクリプトを実行したときにも、時間とともに使用メモリが増加する現象が発生します(このスレッドの前のほうにありました)。

8:40am から 14:05pm にかけて、74.1MB から 379.9MB に増加した内訳を示します。

午前8時40分

74.1 MB

ForumQuestion1 EAを起動したところ

午前9時53分

281.6 MB

午前10時30分

297.2 MB

午前11時23分

319.3 MB

午後12時23分

343.5 MB

午後13時00分

369.1 MB

午後14時05分

379.9 MB

ファイル:
 
私のMT4は現在1GBのラムを使用しています。
 
Daniela Bluemel:
私のMT4は現在1GB RAMで動作しています。
このトピックは、MT5ダニエラについてです。
 
Alain Verleyen:
このトピックは、MT5 Danielaに関するものです。
はい、わかっています。でも、私のMT4も同じ動作です。
 
回避策を発見しました...きれいではありませんが、動作します。

解決方法メモリをチェック するPowerShellスクリプトを実行します。60%以上になるとMetaTraderを再起動する。

スクリプトは以下の通りです。

手順

  1. WindowsのStartをクリック
  2. "PowerShell ISE" と入力
  3. 以下のスクリプトをテキストエディタにカット&ペーストしてください。
  4. 再生ボタンを押す(PS1ファイルに保存してコマンドプロンプトから実行することもできますが、まだテスト中なので、とりあえずPowerShell ISEから実行します)。

スクリプトは以下の通りです。メモリが300MBを超えるとメタトレーダー(ターミナル64)を再起動します(タスクマネージャのメモリ欄による)。

#################################################################

strict-mode 
cls
$memoryThresholdInKiloBytes = 300000
$cooldownSeconds = 30
$loopPauseInSeconds = 30
$counter = 0

while($true){
    if($counter -gt 1000){
        cls
    }
    
    #write-host "$(get-date) Checking memory in use... counter=$counter"
    $processPrivateSet = Get-Counter "\Process(terminal64)\Working Set - Private"
    $wsPrivateKiloBytes = $processPrivateSet.CounterSamples[0].CookedValue / 1KB
   
    $memoryLabel = $wsPrivateKiloBytes.ToString('## ### ###') + " K"

    write-host "$(get-date) Kilo Bytes in use $memoryLabel"
    if($wsPrivateKiloBytes -gt $memoryThresholdInKiloBytes){
            
        write-host "$(get-date) Over threshold of $memoryLabel closing metatrader"
        
        # Close metatrader (terminal64)
        Get-Process terminal64 | Foreach-Object { 
            $_.CloseMainWindow() | Out-Null 
        } | stop-process –force
        
        # Give time to shutdown        
        write-host "$(get-date) Shutting down cooldown of $cooldownSeconds seconds #####################"
        start-sleep -Seconds $cooldownSeconds

        # Open metatrader
        write-host "$(get-date) Opening metatrader again and wait $cooldownSeconds seconds"
        &"C:\Program Files\MetaTrader 5\terminal64.exe"     
        start-sleep $cooldownSeconds
    }

    start-sleep -Seconds $loopPauseInSeconds
    $counter = $counter + 1;
}

# Links
# http://stackoverflow.com/questions/33344611/get-memory-private-working-set-of-process
 

TerminalInfoInteger(...)、TERMINAL_MAXBARS を適当な小さい値に設定してみましたか?

その横であなたが持っている

Terminal_Memory_Physical

システム内の物理メモリ、Mb

int

ターミナル_メモリ_合計

端末のプロセスで利用可能なメモリ、Mb

int

端末のメモリ使用量

端末のプロセスの空きメモリ、Mb

int

ターミナル_メモリ_使用済み

端末が使用しているメモリ , Mb

int


で、問題の核心はどこかを確認 します。

 

私の2セントは、あなたは「削除記号」だけではメモリを解放していないことです。

これを試してみてください。

delete symbols;
symbols=NULL;