读取设置为图表的指标缓冲区

 

一个指标被放置在图表上。它由Timer、ChartEvent和Calculate事件 重新绘制。

我需要一个脚本来读取其指标缓冲区(INDICATOR_DATA)的当前值,可以通过CTRL+D看到。在MT4中可以这样做吗?

 

通过DLL的解决方案在《指标间的数据传输--这个问题的简单解决方案》 一文中给出。但你必须在指标源代码中加入外部GetPtr 的调用,这并不总是可能的。

在没有DLL的情况下,是否有可能只对缓冲区进行读取(而不是写入,这在文章中也是这样做的)?自文章撰写之时(2010年)起,这个话题有什么变化吗?

 
iCustom() 会有帮助。
iCustom - Технические индикаторы - Справочник MQL4
iCustom - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iCustom - Технические индикаторы - Справочник MQL4
 
Alexey Viktorov:
iCustom() 会有帮助。

不幸的是,在这种情况下

通过Timer、ChartEvent和Calculate事件重新绘制

将无济于事。

 
你需要多少个值?让指标本身在终端的全局变量 中、在图表上的对象属性中、在文件中保存这些值的复制品
 
Alexander Puzanov:
你需要多少个值?让指标本身在终端的全局变量、图表中的对象属性、文件中保存这些值的重复。

我需要一个脚本来获取图表上一个指标的缓冲区(至少一个)的值。将缓冲区从指标中转储到文件中,并不是脚本读取缓冲区。

在上面的文章中,有一个很好的解决方案,通过指针,你不仅可以读取,甚至可以覆盖图表上其他指标的缓冲区。这就是所谓的缓冲区读取。但它是一个DLL。

你看,我们可以实现以下方案

  • 该指标等待全局变量将其缓冲区写入文件。
  • 脚本在运行时创建这样的变量并接收相应的文件。
但这甚至不是一个拐杖。这不是在读缓冲区

从沉默来看,自从这个问题在第四个论坛上公开宣布以来,已经有七年多了(google记得),开发商还没有创建一个功能。

由于某些原因,他们仍然不能从图表中对指标数据进行人工读出!听 起来是痴心妄想,但确实如此。

 
comp:

不幸的是,在这种情况下

是无济于事的。

为什么不呢? iCustom()读取指标缓冲区,不管这个缓冲区是如何填充的。毕竟,在任何情况下,缓冲区都是在全局变量层面上声明的。
 
Alexey Viktorov:
为什么不呢? iCustom()读取指标缓冲区,不管这个缓冲区是如何填充的。毕竟,在任何情况下,缓冲区都是在全局变量层面上声明的。

因为iCustom对Timer和ChartEvent事件一无所知。

例如,图表上的指标每秒钟(Timer事件)用随机数字填充其唯一的缓冲区(或将EMA应用于以前的缓冲区数值)。这是相当多的几行代码。在这种情况下,iCustom永远不会返回你将在图表上看到的东西。

 
comp:

因为iCustom对Timer和ChartEvent事件一无所知。

例如,图表上的指标每秒钟(Timer事件)用随机数字填充其唯一的缓冲区(或将EMA应用于以前的缓冲区数值)。这是相当多的几行代码。然后,iCustom将永远不会返回你将在图表上看到的东西。

我明白我的误解,谢谢你。
 
Alexey Viktorov:
为什么不呢? iCustom()读取指标缓冲区,不管这个缓冲区是如何填充的。毕竟,在任何情况下,缓冲区都是在全局变量层面上声明的。

iCustom并不从图表上的指标中读取缓冲区,它在内存中创建自己的指标副本并从中读取,只是缓冲区的副本不在图表上显示。但是,如果指标独立地在图表上画出一些东西,当通过iCustom调用时,它将被画出来,这就产生了问题。

例如,如果该指标有以下代码,它将在调用iCustom时被画出,并且该文本将覆盖图表上的指标文本

ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст");
ChartRedraw();
 
Alexey Volchanskiy:

iCustom并不从图表上的指标中读取缓冲区,它在内存中创建自己的指标副本并从中读取,只是缓冲区的副本不在图表上显示。但是,如果指标独立地在图表上画出一些东西,当通过iCustom调用时,它将被画出来,这就产生了问题。

例如,如果该指标有以下代码,它将在调用iCustom时被画出,并且该文本将覆盖图表上的指标文本

这很奇怪。我在指南的某处看到,如果指标已经启动,就不会创建副本。也许我不明白什么。