诚信为本
量力而为
当前位置:峰汇在线 ea编程知识 正文

OnCalculate 函数详细解析

OnCalculate() 函数在自定义指标中被调用,主要用于通过 Calculate 事件来计算指标值。这通常发生在接收到符号的新 tick 时,这个符号是该指标计算的对象。这个指标不需要附加到这个符号的任何价格图表上。

函数结构

函数必须返回一个 int 类型的值。

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

参数解释

  • rates_total: 当前计算函数调用的条形图数量。
  • prev_calculated: 在之前的调用中处理的条形图数量。
  • time[]: 含有时间值的数组。
  • open[], high[], low[], close[]: 分别包含开盘价、最高价、最低价和收盘价的数组。
  • tick_volume[]: 剔除的成交量历史数据。
  • volume[]: 实际成交量的历史数据。
  • spread[]: 包含交易安全的点差历史数据(如果有)。

通过 ArrayGetAsSeries() 可以确定 time[], open[], high[], low[], close[], tick_volume[], volume[] 和 spread[] 的索引方向。为了不依赖默认值,预期要与这些数组一起工作时,应该无条件地调用 ArraySetAsSeries() 函数。

函数功能

当在图表上出现新的条形或数据更改时,OnCalculate() 会被调用。其返回值与之前计算的条形图数(即 prev_calculated 参数)有关。这允许指标的算法在计算时更为经济高效,避免对自上次运行该函数以来未更改的条形进行重复计算。

示例

考虑以下简单指标,它使用 OnCalculate() 来计算移动平均值:

//+------------------------------------------------------------------+
//|                                               SimpleMovingAverage |
//|                                      Generated by BingxuanL       |
//|                                                                  |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

double ExtMapBuffer1[];

int OnInit()
  {
   IndicatorBuffers(1);
   SetIndexBuffer(0, ExtMapBuffer1, INDICATOR_DATA);
   ArraySetAsSeries(ExtMapBuffer1, true);
   return(INIT_SUCCEEDED);
  }

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[])
  {
   int begin = 10;
   int limit;
   if(rates_total <= begin)
      return(0);
   if(prev_calculated > 0)
      limit = rates_total - prev_calculated;
   else
      limit = rates_total - begin;
   for(int i = 0; i < limit; i++)
      ExtMapBuffer1[i] = (close[i] + close[i+1] + close[i+2] + close[i+3] + close[i+4] + close[i+5] + close[i+6] + close[i+7] + close[i+8] + close[i+9])/10;
   return(rates_total);
  }

这个指标简单地计算了10期的移动平均值,并将其绘制在图表上。

总的来说,OnCalculate() 是 MQL4 自定义指标中的一个核心函数,它处理指标计算逻辑。了解它如何工作及其参数的含义是开发高效、准确指标的关键。

版权所有转载请注明标题及链接:峰汇在线 » OnCalculate 函数详细解析