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

How to accumulate and retain records in Buffer[] - in a MQL4 Custom Indicator?

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

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);
}

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

有什么想法可以让它显示观察值和所有先前观察值的变化吗?

如果您需要 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:第一轮不要过早逃跑,via return(0)

将命令 return(0); 移出 code-execution 块 {...}
从 forward-stepping ( i 减少 ) for( i = limit ;...; i--){...} code-execution 块会让指针在 (i) 中向前移动,
因为自定义指标使用渐进的、不连续的、per-partes 增量(及时)、评估(参考 MQL4 自定义指标文档 iCustom(...)调用接口参数)

2:决定 inner-loop(分数之和) 是否正确编码

提议的表达式提供了
N、per-Bar 相对差异的总和,
不是
N absolute-differences 的总和除以 N 柱的净价格变化。

虽然这可能有效,但关键是,预期的模型是否正确地求和相对差异(不同的、可变的个体基础的百分比变化),或者绝对差异的总和是否应该只在最后循环的除以一个,常见的,基数——第一个和最后一个点之间的净价差(在 N-bars 基数上),当噪声信号受制于时,这通常是一种量化建模实践一些廉价的平滑技术。

3:更正访问 TimeSeries 向量时出现的问题 (负索引)

鉴于外部 for ( i = limit; i >= 0; i-- ) 循环允许 i 变为零,
鉴于内部 for ( x = i; ... ) 因此允许 x == 0,
x - 1 < 0 成为问题,
其中
指令iClose( _Symbol, PERIOD_CURRENT, x - 1 )请求访问一个值,该值尚不存在(在 TimeSeries 向量中具有负索引)。

 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
}

您可能已经注意到,代码只允许在内部 for(){...}

中进行一个循环