如何在Buffer []中累积和保留记录 - 在MQL4自定义指标中?

时间:2017-02-01 18:47:32

标签: buffer mql4

我正在制作一个自定义指标,显示某种货币收盘价的变化。

for ( i = limit; i >= 0; i-- ) {  
      totaleur = 0;
      for ( x = i; x < i + 1; x++ ) {
            totaleur = ( ( iClose( "EURUSD", 0, x     )
                         - iClose( "EURUSD", 0, x - 1 )
                           )
                         / iClose( "EURUSD", 0, x - 1 )
                           );
      }
      ExtMapBuffer1[i] = totaleur;
      return(0);
}

在这种情况下,指标仅显示每次观察的价格变化。

如何让它显示观察中的变化以及之前的观察结果?

2 个答案:

答案 0 :(得分:1)

如果你需要N个先前观察的总和 - 你需要这样的东西:

for(i=limit; i>=0; i--) {  
   double totaleur = 0;
   for(x=i; x<i+N; x++) {
      totaleur += ((iClose("EURUSD", 0, x)- iClose("EURUSD", 0, x-1))/iClose("EURUSD", 0, x-1));
   }
   ExtMapBuffer1[i]=totaleur;
}

当你有return(0);内部循环时 - 指示符将停在那里并且不会使用下一个参数运行该循环 - 所以要小心它

答案 1 :(得分:1)

要实现几个重点,以实现目标:

1:不要在第一轮中通过return(0)

过早逃跑

在代码执行区return(0);之外移动命令 {...} 来自前进( i 减少) for( i = limit ;...; i--){...} 代码执行块将让指针在(i)中前进,因为自定义指标使用渐进的,不连续的,每个部分的增量(及时),评估(参考自定义指标 iCustom(...) 调用接口参数的MQL4文档)

2:判断内循环(分数之和)是否正确编码

建议的表达式提供了 N 的和,每条相对差异,而不是 {{的总和1}} 绝对差异除以N条上的净价格变化。

虽然这可能有效,但关键是,预期的模型是否正确以相加差异(不同的,可变的个体基数的百分比变化),或者总和ob绝对差异是否应该仅在最后循环除以一个,共同的基数 - 第一个和最后一个点之间的净价差(在N - 柱基础上),这通常是一个定量建模实践,当一个有噪声的信号受某些便宜的平滑技术。

3:正确访问TimeSeries向量(负面索引)

的问题

如果外部 N 循环允许 for ( i = limit; i >= 0; i-- ) 变为零, 内部 i 因此允许 for ( x = i; ... )
x == 0 成为问题,
其中
指令 x - 1 < 0 请求访问尚不存在的值(对TimeSeries向量具有负索引)。

iClose( _Symbol, PERIOD_CURRENT, x - 1 )

正如您可能已经注意到的那样,代码只允许内部 for ( i = limit; // SET:_______________________ START at BAR[i == limit] i >= 0; // PRE: PRE-CONDITION i >= 0 i-- // UPD: POST-UPDATE i-- STEP FORWARD IN TIME ) { // ___________________________________________________________ totaleur = 0; // ZEROISED for ( x = i; // SET:_________________ START at BAR[x = (i)] x < i + 1; // PRE: PRE-CONDITION x < (i)+1 x++ // UPD: POST-UPDATE x++ +1 STEP ( ONCE ) ) { // _____________________________________________________ totaleur = ( ( iClose( "EURUSD", 0, x ) - iClose( "EURUSD", 0, x - 1 ) ) / iClose( "EURUSD", 0, x - 1 ) ); } // LOOP KEPT STORING ANY INTERIM VALUE FOR EACH x INTO THE SAME <var> ExtMapBuffer1[i] = totaleur; return(0); //___________________________________DO NOT PREMATURELY RET/EXIT RIGHT FROM THE 1st LOOP }

中的一个循环