1

我正在尝试复制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)

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

4

2 回答 2

2

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

ArraySetAsSeries(KArray,false);
于 2018-05-18T11:08:47.630 回答
0

我不想有另一个缓冲区来复制数组并反转它。

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


有两种主要方法:

A )
内部原生MetaTrader 终端/MQL5 操作方式,它使用一种标志来指示 TimeSeries 数据上的反向时间步进寻址,其中[0]始终是“现在” - 因此更改标志会从原生寻址发生变化到“自然”寻址,这[0]是一个静态最古老的单元格,但随着时间的推移,“现在”的地址一直在爬行。这是最快的方法,但需要设计人员注意设置访问的模式(使用 On-Off-FSA)。

B )
代理模式,其中可以使用访问功能,该功能在内部转换访问模式,而无需关注 FSA 状态。

使用基于类的代理在基于代理的操作中变得更加容易,因为更多的类方法允许设计迭代器和其他工具,重用自主代理抽象细节的概念并防止用户“破坏”状态代理抽象操作的数量,并且不在实际array[]的任何一个本地状态中的正确寻址范围内。

B)- 并不比 A) 慢,但使用起来非常方便,因为人们可以停止记住array[]上次操作留下的本机状态,所以很舒服(类似地,如果array[]-s 用于模拟堆栈基于 MQL4/5 域中的操作和其他更高级别的抽象数据结构)。

于 2018-03-22T18:02:22.507 回答