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

MT4指标OnCalculate函数报错求助:参数与声明问题排查

MT4指标OnCalculate错误排查与修复

问题原因

MT4自定义指标要求OnCalculate函数必须返回int类型,你当前将函数声明为void,导致MT4无法识别该函数,从而触发两个报错:

  • OnCalculate函数声明类型或参数错误
  • 自定义指标中未找到OnCalculate函数

修复步骤

  1. 修改OnCalculate的返回类型为int
  2. 在函数末尾添加return(rates_total);,返回已计算的K线总数,让MT4跟踪计算进度

修复后的完整代码

#property strict

// Define indicator buffers
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime

// Define indicator labels
#property indicator_label1 "Doji"
#property indicator_label2 "Exhaustion"
#property indicator_label3 "Engulfing"

// Declare indicator buffers
double DojiBuffer[];
double ExhaustionBuffer[];
double EngulfingBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   // Set buffer arrays
   SetIndexBuffer(0, DojiBuffer);
   SetIndexBuffer(1, ExhaustionBuffer);
   SetIndexBuffer(2, EngulfingBuffer);
   
   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 int &spread[])
  {
   int i;
   for(i = prev_calculated; i < rates_total; i++)
     {
      // Calculate candle range
      double candle_range = high[i] - low[i];

      // Calculate upper shadow length
      double upper_shadow = high[i] - MathMax(open[i], close[i]);

      // Calculate lower shadow length
      double lower_shadow = MathMin(open[i], close[i]) - low[i];

      // Check for Doji candle condition
      if (candle_range > 0 && upper_shadow < 0.05 * candle_range && lower_shadow < 0.05 * candle_range) {
          DojiBuffer[i] = low[i];
      } else {
          DojiBuffer[i] = EMPTY_VALUE;
      }
      
      // Check for Exhaustion candle condition
      if (i > 0 && candle_range > 2 * MathAbs(close[i] - close[i - 1]) && upper_shadow < 0.15 * candle_range && lower_shadow < 0.15 * candle_range) {
          ExhaustionBuffer[i] = low[i];
      } else {
          ExhaustionBuffer[i] = EMPTY_VALUE;
      }
      
      // Check for Engulfing candle condition
      if (i > 0 && close[i] > open[i] && open[i - 1] > close[i - 1] && close[i] > open[i - 1] && open[i] < close[i - 1] && (close[i] - open[i]) > 0.9 * (high[i] - low[i]) && (open[i - 1] - close[i - 1]) > 0.9 * (high[i - 1] - low[i - 1])) {
          EngulfingBuffer[i] = low[i];
      } else {
          EngulfingBuffer[i] = EMPTY_VALUE;
      }
     }
   return(rates_total);
  }

额外说明

你的指标逻辑中,Exhaustion和Engulfing形态需要参考前一根K线(i>0),循环从prev_calculated开始是合理的,当prev_calculated为0时,i=0的迭代会自动跳过这两个形态的判断,无需额外调整。

内容的提问来源于stack exchange,提问作者younss boudali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:14