mql5语言的特点、微妙之处以及技巧 - 页 200

 
fxsaber:
如果你用鼠标拖动图形,对象*功能是非常滞后的。
他们就不能重画吗?
 
Nikolai Semko:
他们能不能只是重新绘制?

例如,ObjectFind,它与重绘有什么关系?

 
fxsaber:

例如,ObjectFind,它与重绘有什么关系?

啊,这不是我所想的。
 

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

fxsaber, 2020.03.04 08:58

我之前只是怀疑,现在已经证实了。在处理资源的时候,很容易出现内存泄露的情况。

脚本通过SB输出一个数字阵列的图形到图表中。然后你可以手动删除这个图表(对象),但分配给这个图表的资源将永远以只读模式挂在内存中。它不能被删除,因为只有所有者脚本可以删除它(见高亮行)。


MQL中没有任何功能可以释放如此占用的内存。在VPS上要 特别注意这一点。


脚本没有自我清理(或异常停止)后,如何释放终端的内存?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

在任务管理器(F2)中,内存消耗显示得非常好。现在只有重新启动终端才有帮助。

 
fxsaber:

在运行了没有自我清理的脚本后(或异常停止后),如何在终端释放内存?

在任务管理器(F2)中,内存消耗是完全可见的。目前,只有终端重新启动才有帮助。

通常情况下,有必要为每个资源调用 ResourceFree

在崩溃方面,你无能为力。唯一的办法是制作一个dll,用来创建资源并在线程关闭后清理它们。

 
Vladimir Simakov:

通常情况下,你必须为每个资源调用 ResourceFree

在紧急关机的情况下,你也无能为力。只有当你制作自己的dll,通过它来创建资源,当线程关闭时,它将自己清除它们。

紧急关机还包括调试中断。

 
fxsaber:

崩溃包括一个调试中断。

通过标准的mql手段--内存泄漏。只有你自己对这一切的实现应该以成熟的方式来写。鉴于带有DLL_THREAD_DETACH的DllMain不可能在这样的线程终止时被调用,这不是最微不足道的任务,但它是可控的。

UPD: 这个主题应该放在错误主题里。IMHO
 

关于交易、自动交易系统和交易策略测试的论坛

新版本的MetaTrader 5 build 2650:图表的背景加载和MQL5代码分析器的改进

fxsaber, 2020.10.23 18:44

现在在图表栏中,你无法看到专家顾问在哪个图表上运行,哪个图表没有。

是否有可能添加一个区分标志?例如,如果欧元兑美元图表是与EA一起工作的,那么就在末尾添加一个星号:EURUSD*。一般来说,可以在视觉上吸引人的东西。

很多图表,有些是在一些上运行EA。可能对指标也有用,但我不使用它。这就是我不知道的原因。


由于某些原因,运行中的EA列表没有热键。你只能用鼠标打开它。

F2了。在一个EA上按下回车键--我们将切换到它的图表,在导航器中会打开一棵带有路径的树。第二次输入--来源在ME。

 
以前,EA中的一个 内部错误 并没有导致其关闭。
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

最近,它正在造成这个问题。


以前,市场客户可以通过重启终端来解决这个问题。现在没有了。

 

关于交易、自动交易系统和策略测试的论坛

新版本的MetaTrader 4 build 1330

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


使用实例。

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}