来自一个 "傻瓜 "的问题 - 页 62

 
x100intraday:
一个例子是...

就像这样(当然不是结构,而是类别)。

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

在什么地方放什么东西,我想,是很清楚的。

最后别忘了。

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

让我重新表述一下。你想知道是否有可能,在定义一个函数时

只指定一个结构类型的变量作为其形式参数,而忽略了结构本身的名称?例如,不指定 void funcName(MqlTradeRequest & req),而只指定 void funcName(& req)?

是的,对于任何简单的 结构,你都需要一个通用的函数---没有方法,din.arrays.等等。

由于脚本的构成是由我预先确定的,所以我可以明确地指定要处理的结构数量。

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

但要把这些结构中的任何一个传入 有一个名字函数,我必须使用重载。

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

这里有一些困难。

1.结构的数量是有限的,因为如果你有更多的元素,重载会减慢速度。

2.我自己在复制重载函数时可能会犯一个错误。

PS//funWrite() 函数执行某些计算,并以一定的序列和计算参数(从哪个索引写起,读多少)执行FileWriteArray()

 
rlx:

是的,对于任何简单的 结构,你都需要一个通用的函数---没有方法,din.arrays.等等。

由于脚本的组成是由我预先定义的,我可以明确地指定要处理的结构数量。

但要把这些结构中的任何一个传给一个名称 为""的函数,我必须使用重载。

我明白了。前段时间,我问过一个类似的问题,就是在定义函数时是否可以不指定数组的类型。就在这下面,罗氏建议超载。

所以我得出结论,像FileWriteArray() 这样的 "内置 "函数,有 一些参数被指定为void类型,它们本身就是重载函数。我们只是没有看到他们的实施。

 
Yedelkin:

我明白了。我以前也问过一个类似的问题,就是在定义函数的时候 是否可以不指定数组的类型。就在这下面,罗氏建议超载。

所以我得出结论,像FileWriteArray() 这样的 "内置 "函数,有 一些参数被指定为void类型,它们本身就是重载函数。我们只是无法看到他们的实施。

内置函数是用完整的编程语言编写的。

例如,在C语言中,你可以传递任何数量的变量,并且已经在函数中得到一个传递的参数列表,并检查它们。

void fun(...)
  {
}

在MQL5中,没有这种可能性。特别是,简单数据类型和结构的链接和指针缺失...

 

这一定与安全有关。获取数据。走出沙盒

但我仍然希望这些功能能在MQL5中实现

 
rlx:

这一定与安全有关。获取数据。走出沙盒

但我仍然希望这些功能能在MQL5中实现。

最好将你的请求写给服务台。否则,它将很快在论坛中消失。
 
Dima_S:

就像这样(当然不是结构,而是类别)。

我想在哪里放什么是很清楚的。

最后,不要忘记。

现在这就是我所说的帮助:真实而相当具体。谢谢你。加号在哪里?

顺便说一下...我一直在想,这对我来说已经足够好了。但我不想继续保持形式主义.........所以出于好奇,我决定尝试组织一个二维数组也无妨。MQL让我想起了C/C++的一些东西,在过去的十几年里我已经忘记了。现在我已经试着这样做了(没有循环--我故意简化了)。

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

编译器产生错误:"'MABuffer'-参数转换不允许"。

我想知道我做错了什么。如果我没有弄错的话,当声明一个多维数 组的类时,有必要指定其中一个测量值,使其成为静态的。 同时,ArrayResize第一个维度设置新的大小

 

x100intraday:

我想知道我做错了什么?

1)SetIndexBuffer 对相同维度的双数数组起作用。

2)不清楚你为什么要使用TBuffer*,也就是说,在不需要的地方使用动态?

3)(提示)在这个例子中,你可以用一个结构而不是一个类,以节省一点内存和几百个时钟周期。

 

mql5:

3)(提示)在这个例子中,你可以用一个结构而不是一个类,以节省一点内存和几百个时钟周期。

这一点已经检查过了吗?
 

专家顾问在一个不同的时间框架上使用该指标。在专家顾问的测试中,出现了指标的错误数据。

EA本身在M5上工作,而指标在H4上。在同一时间框架(M5)上调用的指标会返回正确的值。

返回的值与指标值类似,但与指标应用于价格图表窗口时可见的真实值不同。

问题是什么?

指标调用 的代码示例。

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.