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

 
x100intraday:

当我调用我的函数时,我应该通过引用、通过指针或其他方式传递数组?

请阅读关于通过值和通过引用传递参数的 章节。

MQL5 参考 / 语言基础知识 / 函数 / 传递参数

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
Yedelkin:

请阅读《参考手册》中关于通过值和通过引用传递参数 的章节。

MQL5 参考 / 语言基础知识 / 函数 / 传递参数

实际上,我刚刚从那里过来,我在之前的信息中提到的编译错误是在阅读了上述部分后发生的。

现在我仔细重读了一遍--这都是关于const和放在哪里。

谢谢,我已经明白了。

 
x100intraday:

OnCalculate,我可以很容易地 通过索引使用数组元素,如高。是否也可以在ExtFunc中访问这个数组的索引元素?当调用我的函数时,我应该通过引用、通过指针或其他方式传递数组参数吗?到目前为止,我已经设法将错误信息 减少到:"'高'--参数转换是不允许的 "和"'高'--常量变量不能作为引用传递",关于我在OnCalculate 中的数组参数的函数调用的同一行。是没有希望还是有解决的办法?

到目前为止,在OnCalculate,我已经采用了将高点复制到另一个数组 中的方法。

然后在ExtFunc中使用CopyOfHigh而不是直接使用higharray。

只要通过引用将数组传递给你的函数

bool ExtFunc (string str, int P, int i, double & high[])
  {
   if (high[i] < high[i-1]) return(false);
   return(true);   
  }

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[])
  {
   int i=0;
   if ExtFunc("s",60,i,high) == 1)
     Buffer[i] = high[i];
  }
 

向大家问好!

这个警告是什么意思。

由于类型转换专家.mq5可能造成的数据损失

编译时? 它是这样说的。

   string Symb="EURJPY";
   int DIGITS = SymbolInfoInteger(Symb,SYMBOL_DIGITS);

怎么了?

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
sergey1294:

只需通过引用将数组传递给你的函数

并非如此。

bool ExtFunc (string str, int P, int i, const double & high[])
  {
   if (high[i] < high[i-1]) return(false);
   return(true);   
  }

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[])
  {
   int i=0;
   if ExtFunc("s",60,i,high) == 1)
     Buffer[i] = high[i];
  }
 
RomanS:

向大家问好!

这个警告是什么意思。

由于类型转换专家.mq5可能造成的数据损失

编译时?它是这样说的。

怎么了?

SymbolInfoInteger()函数返回长类型的值(见参考),而DIGITS被声明为int。这是一个隐含的类型转换。见 "类型转换"。
 
RomanS:

该警告意味着什么。

由于类型转换可能造成的数据损失

这一信息的含义各不相同,取决于考虑它的背景。

比如说。

1. "做一个显式的类型转换!"

   int DIGITS = (int) SymbolInfoInteger(Symb,SYMBOL_DIGITS);

2."可能的数据抽动与隐式类型转换。" // 这是一个字面翻译。

这是可以理解的,因为函数返回的长类型有更大的尺寸,涵盖的数值范围更广。

另一个最近最常出现在我脑海中的选项。

3. "MetaQuotes工作人员不明白,如果错误信息和mql5编译器警告是用用户的母语给出的,这将是多么酷、有吸引力和有效的学习。"

 
MetaDriver:

...如果mql5编译器 的错误信息和警告 是以用户的母语给出的,那将是多么酷、有吸引力和有效的学习。"

是的,这不会是坏事。虽然我个人对英语已经有点心得,而且现在的翻译也是一抓一大把,但还是那句话,这占用了宝贵的时间,这就不多说了。有些人没有足够的能力,对于金融市场上的交易+编程这样复杂的主题,使用翻译。MetaTrader 5是一个多语言平台。我希望帮助实例中的信息和评论(我们有时会遇到)能用终端中选择的语言。
 

我怀疑,如果该指标是通过iCustom激活的,它是在每个tick 上计算的。而且它不依赖于通过CopyBuffer对它的调用。这是否正确?

如果是正确的,那么是否可以禁用指标的计算,只在调用CopyBuffer之前启用?

 
masharov:

我怀疑,如果该指标是通过iCustom激活的,它是在每个tick上计算的。而且它不依赖于通过CopyBuffer对它的调用。这是否正确?

这取决于自定义指标 的逻辑。实际上,它可以每天重新计算一次其数值,跳过所有其他时间。所以说,按照作者的意愿。

masharov

如果是这样,是否可以禁用指标的重新计算,只在调用CopyBuffer之前启用?

基本上,有些人试图使用这种怪物的方法:通过iCustom创建一个指标的副本,复制所需的数据,删除指标的副本。该程序根据需要重复进行。

还有一个OnTimer()函数,我自己没有用过,但也许你可以根据你的任务来调整它。