评论

收藏

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

avatar 億秒 | 679 人阅读 | 0 人评论 | 2014-02-18

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

//+------------------------------------------------------------------+
//| telihai-2.mq5 |
//| Copyright 2011, telihai. |
//| http://www.telihai.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, telihai."
#property link "http://www.telihai.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()”可以理解为每一次价格变化就执行的,如果我们需要把某一功能或流程写成一个函数方便重复调用,只要是写在特殊参数后面就可以。


""
还没有人打赏,支持一下