一、学习 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值。
03-23 22:29