一、学习 OnCalculate 函数的运行原理的意义
- 实现自定义指标:通过编写OnCalculate函数,可以根据自己的需求计算出各种技术指标的值,如移动平均线、相对强弱指标等。这样可以满足个性化的交易策略需求。
- 提高计算效率:OnCalculate函数是在每个新的价格数据到达时被调用的,它只计算最新的价格数据,而不是对整个历史数据进行计算。这样可以大大提高计算效率,减少计算时间。
- 实现自动化交易:通过OnCalculate函数,可以根据计算出的指标值来触发交易信号,实现自动化交易。这样可以消除人为情绪的干扰,提高交易的准确性和效率。
二、OnCalculate 函数原型
基于数据数组的计算
int OnCalculate(
const int rates_total, // price[]数组大小
const int prev_calculated, // 在前一个调用中处理过的柱形图数量
const int begin, //price[]数组中,有意义数据开始的索引编号
const double& price[] // 计算值数组
);
基于当前时间周期时间序列的计算
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[] // 点差数组
);
三、OnCalculate 函数在MT4与MT5区别
在MT4和MT5中,OnCalculate函数中的数组顺序是不一样的。在MT4中,OnCalculate函数中的数组是反序的,即最新的数据在数组的最前面,而最旧的数据在数组的最后面。而在MT5中,OnCalculate函数中的数组是正序的,即最新的数据在数组的最后面,而最旧的数据在数组的最前面。
这种差异可能会导致在从MT4迁移到MT5时出现问题,特别是在处理动态数组时。在MT4中,可以使用ArraySetAsSeries函数将数组转换为正序,以便更方便地处理数据。而在MT5中,不需要使用ArraySetAsSeries函数,因为数组本身就是正序的。
四、OnCalculate 函数的运行原理
- 运行频率:首次加载指标时运行两次,之后每次来报价都会运行一次,无报价运行。
- 参数rates_total:rates_total值等于Bars(_Symbol,_Period)
- 参数prev_calculated:上次OnCalculate函数的return值。