默认的指标程序(指标编程教程第三篇:MQL5 文件结构)

提示

这是 2011 年写的一个系列教程。

新建自定义指标后,会看到如下代码,约 40 行。

//+------------------------------------------------------------------+
//|                                                       bary-2.mq5 |
//|                                            Copyright 2011, bary. |
//|                                             http://www.bary.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, bary."
#property link "http://www.bary.com/"
#property version "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    //--- indicator buffers mapping
    //---
    return(0);
}
//+------------------------------------------------------------------+
//| 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 long &volume[],
                const int &spread[])
{
    //---
    //--- return value of prev_calculated for next call
    return(rates_total);
}
//+------------------------------------------------------------------+

第一行的双斜线 //,就是 MQL5 里用来标识注释用的,其后一整行的内容都不会被编译,不会影响程序,可写一些说明和必要信息。像 +--------------+ 就是为了画出方格好看,无实际意义。单行注释用 //,多行注释以 /* 开始,以 */ 结束。比如:

// 这是一个单行注释。
/* 这是
   一个
   多行
   注释。 */

要注意的是多行注释不能嵌套,下面的注释是合法的:

/* 注 1 */
/* 释 1 */

下面的注释是不合法的:

/* 注 2
/* 释 2 */
    3 */

第二种里的注释会到“释 2”后面的 */ 结束注释。多行注释中只能嵌入双斜线的单行注释。

前面方框中一些简单信息后开始声明特殊参数,用 #property 标识,包含一些程序属性:copyright(版权)、link(链接)、version(版本),最后一个 indicator_chart_window 表示指标是显示在 K 线图上的,如果指标是独立窗口的话,这里会变成 indicator_separate_window

再往下就是:

int OnInit()
{
    //--- indicator buffers mapping
    //---
    return(0);
}

int OnInit() 是初始化函数,程序一上来就运行它后面大括号之内的部分,int 表示这个函数的返回值是整数值型的,每个函数执行完都要返回一个值,可以是数值(如 3)、字符串(如 "abc")、布尔值(如 true)等等。这个函数目前不执行什么,只返回一个 0,在最后一句:return(0);

函数名前面声明函数类型,后面一个小括号,放参数,一个大括号,放执行语句。参数如同函数一样,也需要声明类型。

看后一个函数,int OnCalculate(... 表示这个函数是数值型的,括号里的 const 先不用管,它表示后面给的这些参数你是不可以改变其值的,程序自动赋值。

后面的:

int rates_total, // 输入时间序列大小,就是调用的K线总数,整数值型。
int prev_calculated, // 前一次调用处理的柱
datetime &time[], // 时间,时间型。
double &open[], // 开盘价,双精度浮点型,支持小数点后好多位。
double &high[], // 最高价
double &low[], // 最低价
double &close[], // 收盘价
long &tick_volume[], // 订单交易量,长数值型,支持很大的整数。
long &volume[], // 真实交易量
int &spread[] // 点差

再往后大括号里只有一句 return(rates_total); 会执行,也就是返回 K 线总数。

回顾一下程序的主要结构,最上面是一块注释,写一些基本信息,往下是声明一些特殊参数,目前是根据选项自动生成的,然后是函数,一个初始化函数 OnInit(),一个自定义的迭代函数 OnCalculate()OnInit() 是程序一开始运行执行一次的,OnCalculate() 可以理解为每一次价格变化就执行的,如果我们需要把某一功能或流程写成一个函数方便重复调用,只要是写在特殊参数后面就可以。

  • 898
回复内容较长可以拖右下角↑
回到
顶部