prev_calculated

 
"错误、错误、问题"无关的评论已被移至此主题。
 

MT5 build 1455

测试的指标。

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1.将指标放在图表上

2.关闭终端

3.开放式终端

日志。

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

我是否遗漏了什么,还是不可能相信变量prev_calculated,我必须紧紧抓住这个拐杖?

 
Alexander Puzanov:

MT5 build 1455

测试的指标。

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1.将指标放在图表上

2.关闭终端

3.开放式终端

日志。

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

我是否遗漏了什么,还是不可能相信变量prev_calculated,我必须紧紧抓住这个拐杖?

如果校验和发生变化,即使没有历史分页,变量prev_calculated也可以被重置为0(这是servicedesk的一个近似反应)。
 
Alexey Kozitsyn:
如果校验和发生了变化,即使没有历史分页,变量prev_calculated也可以被重置为0(这是servicedesk的粗略回答)。
明白了,谢谢。所以对木匠来说...
 
Alexander Puzanov:
我明白了,谢谢你。 所以对木匠来说...
没有必要夸大其词--prev_calculate的零回报是一个非常常见的事件。程序员的任务是捕捉这样的事件,并在这种情况下正确地填入指标缓冲区。不多也不少。
 
Ilyas:

增加了运算符*(解构/不解构)和&(寻址),不会有额外的语言变化/计划。

请澄清以下内容。

* 通过引用获得一个变量 - 只适用于。

1.类对象

2.结构对象

3.基本类型

在这种情况下,只是rlvalue还是lvalue也是如此?

 
Karputov Vladimir:
程序员的任务是抓住这样一个事件

所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。

而且我没有夸大其词,因为这个变量的既定目的。

prev_calculated  // обработано баров на предыдущем вызове

除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都是有用的,但我们不能将其用于直接目的--显示在前一次调用中处理了多少个 "条"--prev_calculated。

 
Alexander Puzanov:

所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。

而且我没有夸大其词,因为这个变量的既定目的。

prev_calculated  // обработано баров на предыдущем вызове

除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都很有用,但你不能将其用于直接目的--显示在前一次调用中处理了多少个 "条"-- prev_calculated

而如果我们简单地重新计算整个指标,当0?对我来说,这似乎是最好的解决方案。
 
Alexander Puzanov:

所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。

而且我没有夸大其词,因为这个变量的既定目的。

prev_calculated  // обработано баров на предыдущем вызове

除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都很有用,但我们不能将其用于直接目的--显示 "在前一次调用中处理了多少条"-- prev_calculated

如果prev_calculated=0,意味着应该进行全面的重新计算。在这种情况下,所有的标准指标都是完全重新计算的。

什么是不清楚的?

据说,校验和在历史上发生了变化。重新计算指标要比找出校验和变化的原因更便宜。

文件中明确提到

注意OnCalculate()的返回值和第二个输入参数prev_calculated之间的联系。函数调用中的prev_calculated参数包含了 OnCalculate()在 上一次调用 返回的这允许在计算自定义指标时采用经济的算法,以避免对那些自上次调用此函数以来没有变化的条形图进行重复计算。

为此,通常只需返回rate_total参数的值即可,该参数包含当前函数调用中的条数。如果自上次调用OnCalculate()后,价格数据发生了变化(更深的历史被抽出或历史空白被填补),那么输入参数prev_calculated的值将被终端设置为零

 
Alexey Kozitsyn:
如果只是在0时重新计算整个指标呢?在我看来,这是最好的解决办法。
这正是你应该做的:当你得到prev_calculate==0时,你应该重新计算整个指标。由于rev_calculate==0通常是一个历史交换。而如果历史被调换,意味着可能会有新的条形图 被遗漏或没有在早期计算出来--也就是说,指标读数已经是错误的了。
 
Karputov Vladimir:
这正是你应该做的:当收到prev_calculate==0时,你应该重新计算整个指标。由于rev_calculate==0通常是一个历史交换。而如果历史被调换,就意味着可能会有新的柱状物 被遗漏或没有在早期计算出来--也就是说,指标读数将是不正确的。
:)这就是我的工作...
原因: