Metatrader 5 - 循环播放图表中的符号时占用大量内存

 
你好。

我有一个专家顾问,它被设置为循环使用符号,它占用了大量的内存。

我注意到这是在符号被装入和移出市场观察的时候慢慢爬升的。 所以这不是图表在市场观察中现有项目的循环,而是在新符号被装入和移出的时候。

它被设置为做以下事情。

  1. OnInit将定时器设置为每3秒启动一次
  2. OnTimer
    1. 使用 SymbolTotal() SymbolName() 获取列表中的下一个符号
    2. 使用SymbolSelect() 将图表加载到Market Watch中,ChartSetSymbolPeriod()将当前图表设置为下一个符号。
    3. 使用SymbolSelect()删除Market Watch中任何未使用的符号

当我尽可能多地删除自定义代码,只是使用上述步骤在可用的符号中循环图表时,我注意到我的机器上的内存使用量不断增加。

CPU保持稳定的速度,但内存却直线上升。

有问题吗?

  1. 为什么会出现这种情况?
  2. 有没有人有任何解决方法或建议来阻止内存的增加?
    (例如,宁愿用ChartOpen()打开一个新的图表,而不是用ChartSetSymbolPeriod()使用现有的图表)
  3. 有什么解决方法吗?
    (也就是说,这只是它的工作方式)
  4. 有什么其他建议吗?


非常感谢

 
也许是一个无尽的循环?没有任何代码,很难猜测。
 

是的,这是一个无休止的循环,但这是一个想法。

要不断循环所有的符号。

下面的代码每3秒发射一次。

下面是代码片段(为了演示的目的,它全部在一个方法中)。

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秒。

下面是代码(这是在EA中)。

int OnInit()
{
//---创建定时器
EventSetTimer(3);

//---
return(INIT_SUCCEEDED);
}

 
你好。

我已经添加了完整的脚本,见附件文件 "ForumQuestion1.mq5"。

重现该错误的步骤。

  1. 在Metaeditor中打开所附的Metatrader 5的脚本(这很安全)。
  2. 在Windows中打开任务管理器
    1. 寻找 "Metatrader 5客户终端 "并注意内存量
  3. 运行脚本并观察任务管理器中的内存栏

当脚本在符号中循环时,内存会慢慢增加。

附加的文件:
 
gr101:
你好。

我已经添加了完整的脚本,见附件文件 "ForumQuestion1.mq5"。

重现该错误的步骤。

  1. 在Metaeditor中打开所附的Metatrader 5的脚本(这很安全)。
  2. 在Windows中打开任务管理器
    1. 寻找 "Metatrader 5客户终端 "并注意内存量
  3. 运行脚本并观察任务管理器中的内存栏

当脚本在符号中循环时,内存会慢慢增加。

我试过你的代码,没有内存问题。

MT5 Build 1325。

 

嗨,阿兰。

谢谢你的答复。

我也在使用同样的版本。内存增加很慢。它需要几分钟时间。基本上它是逐渐增加的。

请看附件 "Memory increase.docx.png",我在里面放了一些截图,显示它随着时间的推移而增加。

我使用的是同一个版本 "MT5 Build 1325"

机器信息。

  • Windows 8.1企业版
  • 64位操作系统
  • 16Gb内存
  • i7处理器

谢谢

附加的文件:
 
gr101:

你好,阿兰。

谢谢你的答复。

我也在使用同样的版本。内存增加很慢。它需要几分钟时间。基本上它是逐渐增加的。

请看所附文件 "Memory increase.docx.png",我在里面放了一些截图,显示它随着时间的推移而增加。

我使用的是同一个版本 "MT5 Build 1325"

机器信息。

  • Windows 8.1 企业版
  • 64位操作系统
  • 16Gb内存
  • i7处理器

谢谢

我使用的是Windows 10,如果这有什么不同的话。

你的脚本在我发帖前几分钟就开始运行了。目前,内存使用量比我开始时要低(280Mb对300Mb)。

编辑:我刚刚又检查了一下,现在是189Mb!!仍在减少 :D

EDIT2:在Metaquotes演示服务器上运行。

 

谢谢你的反馈。

我想我将升级到Windows 10,看看是否会有变化。

 

我把它放在Windows Server 12 R2上,这也把内存推高了。

让我监测一段时间,并在这个主题上给出反馈。