在一个标准的指标中,你会用通过OnCalulate( ...) 事件函数发送的参数数据来建立缓冲阵列。但是,对于多货币 和/或多时间 段,你将不得不使用两种解决方案中的一种。
- 使用 "iFunction "变体的旧方法,如iTime()、iVolume、iOpen、iClose 等,但使用不同的符号,如 "EURUSD"、"JPYUSD "等,而不是默认的_Symbol 或Symbol()。
- 使用ArrayCopyRates() 函数的第一个变体的较新方法,同时使用 MqlRates 的数组指针。 复制 "的数组,实际上不会占用任何空间,只是指向各种符号和时间框架的现有数据的指针。
然而,为了使其发挥作用,多符号和/或多时间段的工作必须存在两个条件之一。
- 要么符号和时间框架的各自图表已经打开,这样就不会产生错误。
- 否则,当你第一次请求数据时,你会得到一个错误4066(ERR_HISTORY_WILL_UPDATED),你将不得不编码一个睡眠和重试循环,以便等待数据下载,然后再次请求数据。
我个人建议的解决方案是ArrayCopyRates() 和MqlRates 方法,我认为这是处理4066错误的最有效也是最简单的方法。
在MQL4文档和帮助文件中有更多关于这个的信息。
PS!NB!当 访问内置的指标函数,如iMA()、iATR() 等各种符号和时间框架时,记得也要实现睡眠和重试循环,这样也不会得到4066错误。以下是MQL4文件中的一段话。
Any indicator can be calculated on the data of not only current chart, but also on the data of any available symbol/period. If data (symbol name and/or timeframe differ from the current ones) are requested from another chart, the situation is possible that the corresponding chart was not opened in the client terminal and the necessary data must be requested from the server. In this case, error ERR_HISTORY_WILL_UPDATED (4066 - the requested history data are under updating) will be placed in the last_error variable, and one will has to re-request (see example of ArrayCopySeries())
记住,OP问的是一个指标。Sleep()在指标中被忽略
FMIC: 在这种情况下,他将不得不在每次调用OnCalculate() 函数时,围绕连续的调用建立一个重试循环(其中使用ArrayCopyRates() 是更好的解决方案)。 另外,如果它在OnInit() 函数中起作用,它可能是为指标准备数据的首选方法,在这种情况下有很长的重试次数(没有睡眠)。 |
|
if(pair1[0].time == 0) return;
这将永远不会是真的。
如果该符号和时间框架有任何历史记录,该函数将检索最新的值。
如果没有加载历史记录,你会得到一个Array out of range 的错误。
与iTime等相同
GumRai:
这将永远不会是真的。
if(pair1[0].time == 0) return;
如果该符号和时间框架有任何历史记录,该函数将检索最新的值。
如果没有加载历史记录,你会得到一个Array out of range的错误。
与iTime等相同
有许多历史上(建国前600年)看ACR的例子。没有其他办法。随后对ACR或iTime的调用不会返回4066,所以你怎么可能知道数据是否已经被下载。
iTime总是在错误时返回0。
我想选择1到10种不同的货币,每种货币有5个柱子。
但我不知道如何做到这一点。