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

 
Yuriy Asaulenko:
这很奇怪。我在帮助中读到,如果一个指标已经在运行,就不会创建副本。我不明白这一点。

我一定是误解了什么。我检查了这个假设,做了一个有两个缓冲区的指标,一个从OnCalculate()填充,另一个从OnTimer()、脚本、Expert Advisor...我使用iCustom()来打印OnCalculate()中填充的缓冲区的值,而空值是由OnTimer()推导出来的。同时,该指标也在我放置脚本或EA的图表中。

结论:通过iCustom()调用指标时,指标中的OnTimer()事件没有被执行。

也许这就是为什么它被写在文件中的原因

当一个事件发生时,函数OnTimer()被调用Timer,它是由系统定时器产生的,只用于Expert Advisors和指标- 你不能在脚本中使用它。

而且它没有以任何方式提到指标。

显然,在mql中存在一些有用的未记录的功能,以及未记录的并发症...

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
[删除]  
comp:

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

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

它可以被读取和写入,不需要DLL。
 
pako:
读取和写入,不需要DLL
那么,哪里有一个例子呢?
[删除]  
Alexey Viktorov:
那么,这个例子在哪里呢?
指标在哪里?
 
comp:

不幸的是,在这种情况下

是无济于事的。

为什么没有帮助?
[删除]  
pako:
指标在哪里?
德米特里-费多塞耶夫
为什么没有帮助?

课题。

#property strict

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_type1 DRAW_LINE
#property  indicator_color1 clrRed

#define  PAUSE 100

input double EMA = 0.1;      // Коэффициент экспоненциального сглаживания
input int Amount = 100;      // Сколько раз применить до "сброса"

double Buffer[];

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
  return(rates_total);
}

void OnInit( void )
{
  SetIndexBuffer(0, Buffer);

  EventSetMillisecondTimer(PAUSE);

  return;
}

void OnDeinit( const int reason )
{
  EventKillTimer();

  return;
}

void SetBuffer( const bool Random )
{
  const int Size = ArraySize(Buffer);

  if (Random)
  {
    MathSrand((int)TimeLocal());

    for (int i = 0; i < Size; i++)
      Buffer[i] = MathRand();
  }
  else
    for (int i = 1; i < Size; i++)
      Buffer[i] += (Buffer[i - 1] - Buffer[i]) * EMA;

  return;
}

void OnTimer( void )
{
  static int Count = 0;

  SetBuffer(Count % Amount == 0);
  ChartRedraw();

  Count++;

  return;
}
 
Yuriy Asaulenko:
很奇怪。我在帮助中读到,如果指标已经在运行,就不会创建一个副本。也许我错过了什么。

最近我发布了一个指标,它只是显示一个文本字符串。而当通过iCustom调用它时,图表上的指标线和iCustom相互干扰,我不得不以编程方式只做一个输出。

也许,代码的副本并没有在内存中创建,但重新计算时,它的参数也会出现。

https://www.mql5.com/ru/code/14737/83151#!tab=code

 
comp:

课题。

那又怎样?
 
Alexey Volchanskiy:

最近我发布了一个指标,它只是显示一个文本字符串。而当通过iCustom调用它时,图表上的指标线和iCustom相互干扰,我不得不以编程方式只做一个输出。

也许,代码的副本并没有在内存中创建,但重新计算时,它的参数会被复制。

https://www.mql5.com/ru/code/14737/83151#!tab=code

不能创建代码的副本,因为它是一个动态负载。
 
Алексей Тарабанов:
代码拷贝不可能不创建,因为它是一个动态负载。

口头断言,还是你是一个MQ开发者?:))

虽然,我自己也这么认为,通过与DLL的类比,程序代码在一个实例中,而数据实例是为客户创建的。

简而言之,实际情况是,如果图表上有一个索引,iCustom不是从它那里获取数据,而是从一个单独创建的实例中获取。