文章 "指标间的数据交换:易如反掌!"

 

新文章 指标间的数据交换:易如反掌!已发布:

我们希望创建这样一个环境,即能够提供对附加于图表的指标的数据访问,并具有以下属性:没有数据复制;只需稍加修改我们需要使用的可用方法的代码;MQL 代码优先(当然,我们必须使用 DLL,但我们将只使用一些 C++ 代码字符串)。本文介绍了为 MetaTrader 终端开发程序环境的简易方法,这将提供从其他 MQL 程序访问指标缓冲区的方法。

作者:Алексей

 
对于那些频繁调用 Get/Set 等 DLL 函数的用户来说,有一个非常严重的警告。


为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。

关于使用 DLL 函数的一般建议:尽量少调用内含大量工作的函数,而不是每秒调用数万次并传递少量结果的函数。

 

我想知道为什么不更进一步呢?

正如 Renat 指出的那样,从 dll 调用廉价函数的成本很高。

那么为什么不直接将数据复制到为此提供的数组中呢?

 
TheXpert:

我想知道为什么不更进一步呢?

这个问题是问谁的--作者还是开发者?

如果是对开发者,你有什么具体建议?

 

StringExplode 函数是否存在错误?就目前的形式而言,如果字符串的最后一个分量后面没有分隔符(即字符串的末尾),则该函数不会复制该分量。在我看来,即使字符串末尾没有分隔符,也应该复制字符串的末尾。例如:我们在输入字符串"EURUSD,EURJPY "时加上了分隔符",",现在函数只选择 EURUSD。

以下是更正后的函数版本,为方便起见,我返回了元素个数:

int StringExplode(string s, string separator, string &result[])
{
  int i, pos;
  ArrayResize(result, 0);
   
  for(i = 0; ; i++)
  {
    ArrayResize(result, ArraySize(result) + 1);
    pos = StringFind(s, separator);
    if(pos >= 0)
    {
      result[i] = StringSubstr(s, 0, pos);
      s = StringSubstr(s, pos + StringLen(separator));
    }
    else
    {
      result[i] = s;
      i++;
      break;
    }
  }
  
  return(i);
}
 
Renat:
对于那些频繁调用 Get/Set 等 DLL 函数的用户来说,有一个非常严重的警告。


为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。

使用 DLL 函数的一般建议是:尽量少调用内部工作量大的函数,而不是每秒数万次调用并传输少量结果的函数。

顺便提一句,关于多次调用 DLL 的问题--在测试过程中,我注意到每次调用都会出现几个字节的内存泄漏。

marketeer:

StringExplode 函数没有错误吗?在目前的形式下,如果字符串的最后一个分量后面没有分隔符(即字符串的末尾),它就不会复制该分量。在我看来,即使字符串末尾没有分隔符,也应该复制字符串的末尾。例如:我们在输入字符串"EURUSD,EURJPY "时加上了分隔符",",现在函数只选择 EURUSD。

以下是更正后的函数版本,为方便起见,我返回了元素个数:


谢谢,我没注意。您可以看到,描述符中的最后一个元素是一个随机数,没有任何意义。

---------

谢谢!我会尽可能落实所有改进建议。这个想法本身很好,我希望它不要停滞不前。

 
Renat:

这个问题是问谁的--作者还是开发者?

如果是对开发者,你有什么具体建议?

作者。你可以把数组的大小 和它一起传递,然后你就可以组织一次直接从内存到内存的数组复制--非常便宜,而且绕过了 MQL4 中逐个元素引用的问题。我现在有很多事情要做,否则我会写一个示例....。希望你能明白其中的要点。

提前...-- 如果您使用锁并正确实现传输,这种方法应该是安全的。

 

多么复杂啊!...

一年前,在伊尔努尔的帮助下,我用 MQL4 编写了一个处理内存的库。你可以分配内存、移动指针、写入和读取、将内存区域的名称传输给其他程序。

一切都基于映射。它比提议的库简单得多。

 
Zhunko:

多么复杂啊!...

一年前,在伊尔努尔的帮助下,我用 MQL4 编写了一个处理内存的库。你可以分配内存、移动指针、写入和读取、将内存区域的名称传输给其他程序。

一切都基于映射。它比建议的方法简单得多。

重点是,在建议的方法中,你不需要分配内存和移动指针。读取和写入都直接组织到缓冲区中。这比映射简单得多。
 
Renat:
对于那些频繁调用 Get/Set 等 DLL 函数的用户来说,有一个非常严重的警告。


为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。

使用 DLL 函数的一般建议:尽量少调用内含大量工作的函数,而不是每秒调用数万次并传递少量结果的函数。

更正:自第 240 版起,DLL 调用的延迟已被删除。现在调用 DLL 函数几乎不会出现延迟,就像在本地程序中一样。
 

非常感谢作者,这不是一个小图书馆,只要正确使用和

和 "不违背遗传学规律的杂交",就能得到很好的结果。

例如,我最终以在线模式从离线图表中 "提取 "了数据。)MT4 平台。


一勺焦油)

不止一次出现过这样的情况,在全局变量 列表中

全局变量列表中的 "旧 "变量由于某种原因没有被删除。

我还不知道原因何在。