MT5 build 1455
测试的指标。
#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.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,我必须紧紧抓住这个拐杖?
MT5 build 1455
测试的指标。
#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.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的粗略回答)。
程序员的任务是抓住这样一个事件
所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。
而且我没有夸大其词,因为这个变量的既定目的。
除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都是有用的,但我们不能将其用于直接目的--显示在前一次调用中处理了多少个 "条"--prev_calculated。
所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。
而且我没有夸大其词,因为这个变量的既定目的。
除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都很有用,但你不能将其用于直接目的--显示在前一次调用中处理了多少个 "条"-- prev_calculated
所以我不是一个程序员 - 我的任务是不同的。木匠,我想--我会'拄着拐杖',认为自己在'抓活动'。
而且我没有夸大其词,因为这个变量的既定目的。
除了这个目的之外,它还应该是历史中的一个变化标志,另外它还应该跟踪其他一些变化。所有这些都很有用,但我们不能将其用于直接目的--显示 "在前一次调用中处理了多少条"-- prev_calculated
如果prev_calculated=0,意味着应该进行全面的重新计算。在这种情况下,所有的标准指标都是完全重新计算的。
什么是不清楚的?
据说,校验和在历史上发生了变化。重新计算指标要比找出校验和变化的原因更便宜。
文件中明确提到
注意OnCalculate()的返回值和第二个输入参数prev_calculated之间的联系。函数调用中的prev_calculated参数包含了 OnCalculate()在 上一次调用 中返回的值 。这允许在计算自定义指标时采用经济的算法,以避免对那些自上次调用此函数以来没有变化的条形图进行重复计算。
为此,通常只需返回rate_total参数的值即可,该参数包含当前函数调用中的条数。如果自上次调用OnCalculate()后,价格数据发生了变化(更深的历史被抽出或历史空白被填补),那么输入参数prev_calculated的值将被终端设置为零。