You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义指标编译报错:OnCalculate函数未找到及参数类型错误

MT4自定义支撑阻力指标编译错误排查

编译错误信息

  • sumon.mq4第50行第5列:OnCalculate函数声明类型或/及参数错误
  • 第1行第1列:自定义指标中未找到OnCalculate函数

错误原因

MT4的MQL4语言对OnCalculate函数的参数类型有严格要求,当前代码使用了MT5风格的参数定义,其中最后一个参数spread的类型不符合MT4规范:MT4中spread为整数类型,但代码里写成了double类型,导致编译器无法识别正确的函数签名,进而触发"未找到OnCalculate函数"的连锁错误。

修复方案

  1. 修正OnCalculate函数的参数类型
    将函数声明中的最后一个参数const double &spread[]修改为const int &spread[]。

  2. 优化数组系列化设置(可选)
    建议将数组系列化设置移至OnInit函数中,避免每次计算时重复设置,提升效率;同时新增prev_calculated判断,跳过已计算的历史K线,优化运行性能。

修复后的完整代码

//+------------------------------------------------------------------+
//|                                                        sumon.mq4 |
//|                                  Copyright 2024, Asif Iqbal Sumon |
//+------------------------------------------------------------------+
#property copyright "Asif Iqbal Sumon"
#property link      "https://englishact.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime      // Verified Support
#property indicator_color2 Orange    // Weak Support
#property indicator_color3 Red       // Verified Resistance
#property indicator_color4 DarkRed   // Weak Resistance

//--- indicator buffers
double VerifiedSupportBuffer[];
double WeakSupportBuffer[];
double VerifiedResistanceBuffer[];
double WeakResistanceBuffer[];

//--- input parameters
input int lookBackPeriod = 50; // Look back period for support/resistance detection
input double verifiedLevelThreshold = 20; // Threshold for verified levels

//+------------------------------------------------------------------+
//| Custom indicator initialization function                           |
//+------------------------------------------------------------------+
int OnInit()
{
    // Buffers
    SetIndexBuffer(0, VerifiedSupportBuffer);
    SetIndexBuffer(1, WeakSupportBuffer);
    SetIndexBuffer(2, VerifiedResistanceBuffer);
    SetIndexBuffer(3, WeakResistanceBuffer);
    
    // 设置数组为系列模式(从最新到旧)
    ArraySetAsSeries(VerifiedSupportBuffer, true);
    ArraySetAsSeries(WeakSupportBuffer, true);
    ArraySetAsSeries(VerifiedResistanceBuffer, true);
    ArraySetAsSeries(WeakResistanceBuffer, true);
    ArraySetAsSeries(high, true);
    ArraySetAsSeries(low, true);
    
    // 设置指标及缓冲区名称
    IndicatorShortName("Support and Resistance Levels");
    SetIndexLabel(0, "Verified Support");
    SetIndexLabel(1, "Weak Support");
    SetIndexLabel(2, "Verified Resistance");
    SetIndexLabel(3, "Weak Resistance");

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                                |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) // 修正为MT4要求的int类型
{
    // 确保有足够的K线数据用于计算
    if (rates_total < lookBackPeriod)
        return 0;

    // 仅计算新增的K线,避免重复计算历史数据
    int start = prev_calculated > 0 ? prev_calculated - 1 : 0;
    for (int idx = start; idx < rates_total; idx++)
    {
        VerifiedSupportBuffer[idx] = EMPTY_VALUE;
        WeakSupportBuffer[idx] = EMPTY_VALUE;
        VerifiedResistanceBuffer[idx] = EMPTY_VALUE;
        WeakResistanceBuffer[idx] = EMPTY_VALUE;
    }

    for (int i = lookBackPeriod; i < rates_total; i++)
    {
        double highPrice = high[i];
        double lowPrice = low[i];
        int countSupport = 0;
        int countResistance = 0;

        // 统计支撑/阻力触碰次数
        for (int j = 1; j <= lookBackPeriod; j++)
        {
            if (low[i - j] <= lowPrice) countSupport++;
            if (high[i - j] >= highPrice) countResistance++;
        }

        // 标记支撑/阻力级别
        if (countSupport >= verifiedLevelThreshold)
            VerifiedSupportBuffer[i] = lowPrice;
        else
            WeakSupportBuffer[i] = lowPrice;

        if (countResistance >= verifiedLevelThreshold)
            VerifiedResistanceBuffer[i] = highPrice;
        else
            WeakResistanceBuffer[i] = highPrice;
    }
    
    return rates_total;
}
//+------------------------------------------------------------------+

额外说明

  • 修正参数类型后,编译器能正确识别OnCalculate函数,第二个错误会自动消失。
  • 新增的prev_calculated判断可以大幅减少重复计算量,提升指标运行效率。
  • 在OnInit中统一设置数组系列化模式,确保K线索引逻辑一致,避免出现数据错位问题。

内容的提问来源于stack exchange,提问作者Asif Iqbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:40:56