You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MQL5反转数组报错及随机指标缓冲区复制顺序异常咨询

解决MQL5中的两个问题:数组反转报错与Stochastic缓冲区数据顺序问题

嘿,我来帮你搞定这两个在MQL5里碰到的问题!咱们一个一个来拆解:

一、反转数组时出现报错

首先,虽然你没贴出反转数组的具体代码,但这类报错大概率是以下几个原因导致的,对应解决方法如下:

  • 数组未正确初始化/无数据:如果调用ArrayReverse()时数组是空的(比如CopyBuffer没成功获取到数据),肯定会报错。解决思路是先检查数据是否成功复制:

    int copiedK = CopyBuffer(stochastic_output, 0, 0, 15, KArray);
    int copiedD = CopyBuffer(stochastic_output, 1, 0, 15, DArray);
    
    // 先判断复制是否成功
    if(copiedK <= 0 || copiedD <=0){
        Print("CopyBuffer失败,错误码: ", GetLastError());
        return;
    }
    

    只有当copiedKcopiedD返回值大于0时,再执行反转操作。

  • 混淆了时间序列模式与手动反转:你已经用ArraySetAsSeries(KArray, true)把数组设置为时间序列模式(最新数据在索引0),如果这时候手动反转,逻辑很容易混乱。其实如果想切换成升序(旧数据在前),直接改ArraySetAsSeries的参数更高效:

    ArraySetAsSeries(KArray, false); // 切换为普通数组模式,旧数据在索引0
    

    完全不需要手动调用ArrayReverse,避免额外的错误风险。

  • 检查反转函数的返回值:如果一定要手动反转,记得判断ArrayReverse的返回结果,方便排查问题:

    if(!ArrayReverse(KArray)){
        Print("ArrayReverse失败,错误码: ", GetLastError());
    }
    

二、Stochastic缓冲区数据按降序排列

这个其实是MQL5的正常行为,因为你执行了ArraySetAsSeries(KArray, true)——这个函数会把数组标记为时间序列数组,此时数组的索引0对应最新的K线数据,索引1对应前一根K线,以此类推,看起来就是“降序排列”(时间从新到旧)。

你可以根据自己的需求选择两种解决方式:

方式1:切换为普通数组模式(旧数据在前)

如果习惯用升序逻辑(最旧的蜡烛数据在索引0),只需要把ArraySetAsSeries的参数改成false

double KArray[],DArray[];
ArraySetAsSeries(KArray,false); // 普通数组模式
ArraySetAsSeries(DArray,false);

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

此时KArray[0]是15根蜡烛里最旧的那根的K值,KArray[14]是最新的。

方式2:保留时间序列模式,调整遍历/打印逻辑

如果你想保留时间序列模式(方便快速获取最新数据),只需要在打印的时候明确说明索引对应的时间顺序即可,比如:

for (int i=0;i < Candles_backtest_Stochastic_quantity;i++) {
    // 这里i=0是最新的蜡烛,i=1是前一根,以此类推
    PrintFormat("K (最新第%d根蜡烛): %f", i+1, KArray[i]);
    PrintFormat("D (最新第%d根蜡烛): %f", i+1, DArray[i]);
}

另外要注意:Candles_backtest_Stochastic_quantity的值要和CopyBuffer的数量(这里是15)保持一致,避免数组越界访问导致的额外错误。

内容的提问来源于stack exchange,提问作者Jaffer Wilson

火山引擎 最新活动