初学者的问题 MQL5 MT5 MetaTrader 5 - 页 985

 

做 { ...缓冲区填充代码

}

虽然(这两个值不匹配)

简而言之,在循环中获取数值,直到它们匹配,然后才执行以下代码
 
Maxim Dmitrievsky:

做 { ...缓冲区填充代码

}

虽然(这两个值不 重合)

简而言之,在循环中获取数值,直到它们是相同的,然后才执行以下代码

问题是,在一个指标工作之前,数据(流)不会传递给另一个指标,也就是说,没有这个指标的OnCalculate 的指标循环不会有帮助。而OnCalculate一结束,数据就被传给了Expert Advisor,而且是错误的。

或者说我不理解你的想法。
 
Aleksey Vyazmikin:

因此,重点是,在一个指标工作之前,数据(流)不会转移到另一个指标,也就是说,在没有终止这个指标的OnCalculate的情况下,指标中的循环不会有帮助。

你从其他指标的缓冲区逐一接收数值,如果它们的数量不一样,你就再接收一次,直到相同为止,忘记流。 但一般来说,没有人这样做--它非常 慢。

 
Aleksey Vyazmikin:

所以,重点是,在一个指标工作之前,数据(流)不会传递给另一个指标,也就是说,指标中的循环没有这个指标的OnCalculate是没有用的。但OnCalculate一结束,数据就被传递给Expert Advisor,而且是错误的。

或者我不明白你的想法。

你需要条件为真,那么只有缓冲区会被填满,按照我的理解(其他指标的缓冲区的条数将是相同的)。

在填充当前指标的缓冲区之前,强行满足所有条件

或者把它还给错误的程序员--我们为什么要在错误的领域解决他的问题?

 
Maxim Dmitrievsky:

你从其他指标的缓冲区中一个一个地获取数值,如果它们的数量不一样,你再获取它们,直到相同为止,忘掉流。

马克西姆-德米特里耶夫斯基

你需要条件得到满足,那么只有缓冲区会被填满,我的理解是(其他指标的缓冲区的条数将是相同的)。

在当前指标的缓冲区被填满之前强制执行所有条件

或者把它还给手气不好的程序员,我们为什么要在错误的地方解决他的问题?

如果其他指标的计算还没有准备好,数值将为零,所以在这里强行填充是没有意义的,你可以填充过去的数据,但有同样的效果,你可以不向指标请求当前条形的数据,而是请求过去的数据,然后代码根本不应该改变。

因为测试者和真实账户的情况是不同的,模拟睡眠的工作非常奇怪,15秒滑点的重新计算只发生一次,而它必须发生在每一个刻度,或在要求下,而且根据日志,它不是在15秒内发生,而是在13秒内发生。

此外,同步问题是相关的,对于这种情况,最好能增加通知指标需要将数据流传递给其他指标的可能性,否则就不可能进行进一步的计算--这将是一个解决方案--在没有完成计算的情况下将数据流传递给另一个指标的命令。

尊敬的是,专家顾问应该等待来自指标的数据,并跳过刻度,直到完成计算;现在,当试图使用"while "语句 时,计算的结果挂起/停滞不前(即什么也没有发生,测试者只是站在那里),这也是不正确的。

当然,我已经通知了开发商,但我已经一个多月没有听到他的消息了--自由职业者的成本。

 

在测试者和真实账户中的情况是不同的,睡眠模拟工作非常奇怪,15秒滑移的指标重新计算只发生一次,而它应该在每一个刻度上发生,或在需求上发生,但它不是在15秒内发生,而是在13秒内发生,根据日志。

此外,同步问题也是相关的,对于这种情况,最好能增加通知指标需要将数据流传递给其他指标的可能性,否则就不可能进行进一步的计算--这将是一个解决方案--在没有完成计算的情况下将数据流传递给另一个指标的命令。

尊敬的是,专家顾问应该等待来自指标的数据,并跳过刻度,直到全部计算结束,但现在,当试图使用"while "语句 来等待正确的计算结果时,它冻结/停滞不前(即没有任何事情发生,测试者只是站在那里),这也是不正确的。

 

亲爱的Artyom Trishkin!

我非常希望,既然你已经确定上述问题是为初学者准备的,那么你已经知道了答案,可以帮助我了!"。

我正在等待专业人士的答复。

 
Aleksey Vyazmikin:

亲爱的Artyom Trishkin!

我非常希望,既然你已经确定上述问题是为初学者准备的,那么你已经知道了答案,可以帮助我了!"。

我正在等待专业人士的答复。

我唯一能给出的建议是:如果指标没有收到计算所需的条数,应该退出OnCalculate():如果(rate_total<number of_bars required)返回0。

专家顾问应该检查从指标上收到的数据,如果它们不等于空指标值,才用收到的数据进行计算。

  1. 在指标中,首先,缓冲区被初始化为一个空值(它是什么 - 可以在指标中设置)。
  2. 在指标中(缓冲区已经被填充了一个空值),检查可用的条数(我上面描述的)。
  3. 如果通过了酒吧可用性的检查,则执行指标的计算周期,用必要的值填充缓冲区。
    .........
  4. 在专家顾问中,检查指标计算的条数(有一个标准函数BarsCalculated())。
  5. 从指标中获取数据
  6. 取决于我们得到什么--这取决于你的TS的逻辑
    1. 如果指标是一条线,那么它的空值表明它还没有被计算过--我们不拿它来计算。
    2. 如果指标--箭头,那么就有另一种逻辑(因为空值也是它的工作数据),例如,如果这是一个分形,那么我们检查条数3,并从得到的数值中推回。
  7. 好吧,包括你自己的逻辑,不要把一切都归咎于终端Bugs。
  8. 首先,我用自己来检查Bugs。
  9. 你呢?
 
Artyom Trishkin:

我只能建议:如果指标没有得到正确的计算条数,应该退出OnCalculate():如果(rate_total<number_of_bars required)返回0。

谢谢你的提示,退出没有问题,但不能解决这个问题,我现在已经做为一个失败的计算。

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

并以某种方式填充缓冲区,从其他指标中获取数据,在满足条件之前,数据不会传递给EA。我还没有检查数据的正确性,但它看起来是正确的。或者是我错了,肯定有问题?

阿尔乔姆-特里什金

专家顾问应该检查从指标上收到的数据,如果它不等于空指标值,才用收到的数据进行计算。

专家顾问在一个新条形图 的到来时进行一次计算,而试图等待指标的正确值则分别导致测试器的停止。

阿尔乔姆-特里什金
  1. 在指标中,缓冲区首先被初始化为一个空值(它是什么 - 可以在指标中设置)。
  2. 在指标中(缓冲区已经被填充了一个空值)检查可用的条数(如上所述)。
  3. 如果通过了酒吧可用性的检查,则通过用必要的值填充缓冲器来进行指标计算的循环。
    .........
  4. 在专家顾问中,检查指标计算的条数(有一个标准函数BarsCalculated())。
  5. 从指标中获取数据
  6. 取决于我们得到什么--这取决于你的TS的逻辑
    1. 如果指标是一条线,那么它的空值表明它还没有被计算过--我们不拿它来计算。
    2. 如果指标--箭头,那么就有另一种逻辑(因为空值也是它的工作数据),例如,如果这是一个分形,那么我们检查条数3,从得到的值开始。
  7. 好吧,包括你自己的逻辑,不要把一切都归咎于终端Bugs。
  8. 首先,我用自己来检查错误。
  9. 你呢?

1.它是真实的。

2.就这样,事情发生了。这个计算在下一个tick上将是正确的,但我想在第一个tick上收到正确的计算,因为Expert Advisor没有在循环中等待其他tick,或者期望值与我的耐心不相称,也就是说,它不现实--有一个错误。

3.

4.当然了。

5.是的,我们是这样做的,但该指标需要接收来自其他指标的数据,这就是问题所在!

6.1-2.在指标缓冲区中故意放假数据是不正确的,这只会使专家顾问代码中的算法错误检测变得复杂。

7.我在逻辑上描述一切,但我没有写指标,所以我很难理解是什么原因,我描述的是指标的合理表现,即由于数据流的垄断,在没有收到其他指标的缓冲值的情况下无法进行计算(指标是按顺序计算)。

8.我已经在这里和之前指出,我不是作者,我花了很多时间--几乎是一天--来确定原因。

9.而我正在寻找解决问题的办法,另外,如果有人遇到过这种情况,可以迅速帮助我。我再说一遍,在那条线上,我开始写的是 "睡眠",后来又出现了测试器的其他功能,我也认为是错误的。

谢谢你的答复。

 
Aleksey Vyazmikin:

谢谢你的提示,输出没有问题,但它不能解决这个问题,到目前为止我已经做了一个失败的计算。

并以某种方式填充缓冲区,从其他指标获取数据,在条件满足之前,数据不会传递给EA。我还没有检查数据的正确性,但它看起来是正确的。或者是我错了,肯定有问题?

专家顾问在新条形图 到来时单独进行计算,因此,当试图等待指标的正确值时,会导致测试器的停止。

1.确实如此。

就这样,2。这个计算在下一个tick上是正确的,但是我需要在第一个tick上得到一个正确的计算,因为我的专家顾问没有在循环中等待其他tick,或者期望值与我的耐心不相称,也就是说,它不现实--有一个错误。

3.

4.当然了。

5.是的,我们是这样做的,但该指标需要接收来自其他指标的数据,这就是问题所在!

6.1-2.在指标缓冲区中故意放假数据是不正确的,这只会使专家顾问代码中的算法错误检测变得复杂。

7.我在逻辑上描述一切,但我没有写指标,所以我很难理解是什么原因,我描述的是指标的合理表现,即由于数据流的垄断,在没有收到其他指标的缓冲值的情况下无法进行计算(指标是按顺序计算)。

8.我已经在这里和之前指出,我不是作者,我花了很多时间--几乎是一天--来确定原因。

9.而我正在寻找解决问题的办法,另外,如果有人遇到过这种情况,可以迅速帮助我。我再说一遍,在那条线上,我开始写的是 "睡眠",后来又出现了测试器的其他功能,我也认为是错误的。

谢谢你的答复。

在OnInit()中调用符号的时间序列:iTime(Symbol,Timeframe,1)。

在一开始,在OnTick()中,使用相应的iFunc()询问所需时间序列的所需条形,或者如果( iTime(Symbol,Timeframe,10)==0) 返回。

在这种情况下,专家顾问将不会检测到一个新的条形图,而会等待下一个刻度。

在OnInit()中,我们已经请求了时间序列数据,从而激活了数据分页。

在OnTick()中,我们检查EA是否有最低要求的历史记录,如果还没有,我们就等待下一个tick。

而在收到专家顾问所需的所有数据之前,它将等待下一个刻度。

一旦所有必要的数据被抽出并获得,专家顾问将开始使用新的条形图和所需的历史数据。

为了使串行数据保持最新,必须至少每两分钟访问一次。做一个大约一分半钟(90秒)的第二个计时器,在其中简单地引用所需符号的任何时间序列,例如iTime(Symbol,Timeframe,1); 不检查收到的数据 - 只是 "摇摆 "历史。那么符号上的所有数据将始终是最新的。