我正在尝试复制变量中的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)
请帮助我。我不想有另一个缓冲区来复制数组并将其反转,有没有办法可以反转数组并使用它?
答案 0 :(得分:1)
使用ArraySetAsSeries函数。在你的情况下它将是
ArraySetAsSeries(KArray,false);
答案 1 :(得分:0)
我不希望有另一个缓冲区来复制数组并将其反转。
是的,每个 copy
在两个方面都很昂贵 - 在[TIME]
- 域和[SPACE]
- 域中。由于这两个原因,肯定有更好的方法可以避免任何副本发生。
A)
内部的,原生的 MetaTrader终端/ MQL5运营模式,它使用一种 标志 来表示对TimeSeries数据的反向时间步进寻址,其中 [0]
始终是“ NOW ” - 因此更改标志从原生更改 - 追求“自然” - 地址,其中[0]
是一个静态最古老的细胞,但随着时间的推移,“现在”的地址不断爬行。这是最快的方法,但要求设计人员注意设置访问的模式(使用On-Off-FSA)。
B)
代理模式,可以使用访问功能,在内部转换访问模式,而不必关注FSA状态。
使用基于类的代理变得更容易进入基于代理的操作,因为更多类方法允许设计迭代器和其他工具,重用自动代理抽象细节的概念并防止用户“损坏” “代理抽象操作的状态不属于实际array[]
本地状态中的正确寻址。
B) - 并不比A)慢,但使用起来非常方便,因为人们可以停止记住最后一次操作留下array[]
的原始状态,所以很舒服(如果array[]
- 用于模拟基于堆栈的操作和MQL4 / 5域中的其他更高级别的抽象数据结构。