MT4指标OnCalculate函数报错求助:参数与声明问题排查
MT4指标OnCalculate错误排查与修复
问题原因
MT4自定义指标要求OnCalculate函数必须返回int类型,你当前将函数声明为void,导致MT4无法识别该函数,从而触发两个报错:
- OnCalculate函数声明类型或参数错误
- 自定义指标中未找到OnCalculate函数
修复步骤
- 修改
OnCalculate的返回类型为int - 在函数末尾添加
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
相关产品推荐
相关产品推荐

