程序库: Init_Sync

 

Init_Sync:

本开发库使指标的 Init/Deinit 同步

作者: fxsaber

 
现在--一个超级大问题:在MQL5 中创建的资源 的生活环境是什么?整个终端、任何内部容器,如 "符号-时间框架 "流、图表或其他?帮助中没有这方面的说明。
 
Stanislav Korotky:
现在--一个超级大问题:在 MQL5 中创建的资源的生命环境是什么?整个终端、任何内部容器,如 "符号-时间框架 "流、图表或其他?帮助中没有这方面的说明。
我没有检查过

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

Init() 和 DeInit() 的执行顺序

Nikolai Semko, 2017.04.16 09:42 AM

当然是资源--在我看来它们是最佳解决方案,因为它们是不可见的,不像glob.终端变量和文件,而且速度很快。你还可以通过它们传输数组,就像通过文件一样,但速度更快,因为一切都发生在 RAM 中。此外,它们属于窗口,而不是终端,就像全局变量一样。此外,您还可以为窗口中的所有相同指标创建一个资源。

我就是相信这一点,所以才通过资源来实现。最初 是通过全局资源。

 
fxsaber:
没有测试

我只是相信它,所以就通过资源来做了。最初 是通过全球。

如果能听到一些官方的信息来源,那就更有意思了。
 
还有一个问题--如果从 Expert Advisor 中创建指标,会发生什么情况?
 
Stanislav Korotky:
还有一个问题--如果从智能交易系统中创建一个指标,会发生什么情况?
试试这个。
 

嗯...

有趣的重载功能

它是如何工作的?比方说,以初始化函数为例?

那么...

由于函数库是先插入的,所以编译时函数库的 OnInit() 会被注册为初始化函数。

它会检查同步性,然后调用 OldOnInit() 函数。这个函数是什么?还没有定义!


啊哈...再进一步,OnInit() 的标识符被定义为 OldOnInit(),之后,当 "老 "OnInit()函数 被定义后,它将被 OldOnInit()取代,也就是库的 OnInit() 函数所调用的那个函数


定义的原始用法。在我看来,就进一步支持和改变标识符声明顺序的可能性而言,这是相当危险的。(我的印象是不能使用未声明的标识符)。不过,从使用的角度来看,一切都很干净、正确。

 
George Merts:

在我看来,就进一步支持和改变标识符声明顺序的可能性而言,这是相当危险的。

我还没找到一个危险的例子。


在我的记忆中,这是唯一一个存在 #include 的此类库,但用户在代码中没有调用过其中的任何内容。

 
fxsaber:
没有测试

我只是相信它,所以就通过资源做了。本来 是全球通用的。


我向你道歉。我被误导了。

如果使用一个空指示器来执行这样的 OnInit 操作(而不删除资源):

int OnInit()
  {
   uint set[1];
   set[0]=3;
   uint w=1,h=1;
   if(ResourceReadImage("::Res_name",set,w,h))
      Print("资源已存在 set[0] = "+DoubleToString(set[0],0));
   else
     {
      if(ResourceCreate("::Res_name",set,1,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))
         Print("创建了一个新资源"。);
      else Print("无法创建资源"。);
     }

   return(INIT_SUCCEEDED);
  }

可以得出以下关于资源的结论:

1.该资源属于终端,而非窗口。因此,在资源名称中添加窗口句柄是合理的。

2.资源的生命周期与终端的存活时间相同,终端重启后资源将被删除。因此,在关闭终端(原因代码为 REASON_CLOSE)时,将必要的数据保存在终端的全局变量(或通过ResourceSave 保存 文件)中,当再次加载终端时,通过从全局 PT(或文件)中转移数据来创建新资源,随后删除全局 PT(或文件),这样就不会打扰眼睛了(此时终端的全局变量仅在关闭和打开终端时存在)。

一方面,这是件好事,因为可以在窗口之间进行有趣的数据传输和同步,而且终端中的所有东西都可以同步,但另一方面,这也增加了代码和一些复杂性。
很抱歉,我又提供了未经核实的信息。

不过,现在我们可以清楚地看到那些记录不全的资源了。顺便说一句,这是一个非常有价值的工具。

 
Nikolai Semko:

资源属于终端,而不是窗口。因此,在资源名称中添加窗口句柄是合理的。

然后在代码中添加以下内容
return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));

似乎不需要其他东西了。


顺便说一句,在某些情况下,如果不使用窗口句柄,可能会很方便,因为整个终端的指标副本都应该是 ONE 的。


ZY 更新版本包含此更正。

 
fxsaber:

顺便说一句,也许在某些情况下,不使用窗口句柄会比较方便,因为这时整个终端的指标副本都应该是 ONE 的。


是的,我也考虑过