MQL5 反转数组给出错误

MQL5 reversing the array gives error

我正在尝试复制变量中的 stochastic 函数缓冲区。但我看到的是蜡烛按降序复制到数组中。

double KArray[],DArray[];
ArraySetAsSeries(KArray,true);
ArraySetAsSeries(DArray,true);
int stochastic_output = iStochastic(_Symbol,PERIOD_M1,5,3,3,MODE_SMA,STO_LOWHIGH);
CopyBuffer(stochastic_output,0,0,15,KArray);


CopyBuffer(stochastic_output,1,0,15,DArray);
for (int i=0;i < Candles_backtest_Stochastic_quantity;i++)
{
PrintFormat("K %d:  %f",i,KArray[i]);
PrintFormat("D %d:  %f",i,DArray[i]);

}

这很好用,在打印数组值时,我得到 0th 作为当前值,稍后得到以前的值。

2018.03.22 18:07:23.622 2018.02.01 00:00:00   K 0:  57.291667
2018.03.22 18:07:23.622 2018.02.01 00:00:00   D 0:  63.194444
2018.03.22 18:07:23.622 2018.02.01 00:00:00   K 1:  61.458333
2018.03.22 18:07:23.622 2018.02.01 00:00:00   D 1:  68.754756
2018.03.22 18:07:23.622 2018.02.01 00:00:00   K 2:  70.833333
2018.03.22 18:07:23.622 2018.02.01 00:00:00   D 2:  69.294286
2018.03.22 18:07:23.622 2018.02.01 00:00:00   K 3:  73.972603
2018.03.22 18:07:23.622 2018.02.01 00:00:00   D 3:  57.177428
2018.03.22 18:07:23.622 2018.02.01 00:00:00   K 4:  63.076923

等等。

但我想要一个倒置的数组,即 14th 数组元素必须是数组的 0th 并且 0th 必须是数组的 14th 元素.

我试图使 CopyBuffer() 语句反转缓冲区,但出现错误,请参见示例:

2018.03.22 18:11:11.957   Total_back_lagANDvantage_required=3
2018.03.22 18:11:12.073 2018.02.01 00:00:00   K 0:  78.260870
2018.03.22 18:11:12.073 2018.02.01 00:00:00   D 0:  72.579331
2018.03.22 18:11:12.073 2018.02.01 00:00:00   array out of range in 'adxSTUDY.mq5' (173,33)
2018.03.22 18:11:12.073 OnTick critical error
2018.03.22 18:11:12.087 EURUSD,M1: 1 ticks, 1 bars generated. Environment synchronized in 0:00:00.312. Test passed in 0:00:00.594 (including ticks preprocessing 0:00:00.016).
2018.03.22 18:11:12.087 EURUSD,M1: total time from login to stop testing 0:00:00.906 (including 0:00:00.312 for history data synchronization)

请帮助我。我不想有另一个缓冲区来复制数组并反转它,有没有一种方法可以反转数组并使用它?

I do not want to have another buffer to copy the array and reverse it.

是的,每个 copy 在两个维度上都是昂贵的 - 在 [TIME] 域和 [SPACE]-域。出于这两个原因,肯定有更好的方法来避免任何复制发生。


主要有两种方法:

一个)
内部原生 MetaTrader 终端/MQL5 操作方法,它使用一种标志 来指示reversed-time-stepping 处理 TimeSeries 数据,其中 [0] 始终是“NOW" - 因此更改 标志 从 native-addressing 更改为 "natural"-寻址,其中 [0] 是静态最旧的单元格,但是 "NOW"的地址随着时间的推移而不断变化。这是最快的方法,但需要设计人员注意设置访问权限的模式(使用 On-Off-FSA)。

B)
一个proxy-mode,这里可以使用一个访问函数,它在内部转换访问模式,而不必关注FSA-state。

使用 class-based 代理变得更容易进入 proxy-based 操作,因为更多 class-methods 允许设计迭代器和其他工具,re-using 自治的概念proxy-abstracted 详细信息并防止用户 "damaging" proxy-abstracted 操作的状态,并在实际 array[] 的任何一个 native-states 中超出正确寻址范围。

B) - 并不比 A) 慢,但使用起来非常方便,因为人们可以不再记得上次操作在 native-state 中留下了 array[],所以 a舒适(类似地,如果 array[]-s 用于模拟 stack-based 操作和其他 higher-level 抽象 data-structures 在 MQL4/5 域中)。

使用 ArraySetAsSeries 函数。在你的情况下它将是

ArraySetAsSeries(KArray,false);