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 自定义指标中的一个核心函数,它处理指标计算逻辑。了解它如何工作及其参数的含义是开发高效、准确指标的关键。