MQL5:写一个简单的自定义指标
在MT5平台中,交易者可根据自己的习惯、需要,去编写供自己参考的指标。
如何写一个简单的自定义的指标?
在这里将写一个 取当日最高价和最低价中值的折线 的指标 作为演示(结尾有可运行的完整代码)。
写指标一般可以概述为如下步骤:
1.新建自定义指标项目
2.代码部分
2.1 设置指标属性
2.2 定义数据存放的数组
2.3 在初始化函数 OnInit中设置数组映射
2.4 在OnCalculate函数中,编写绘制指标的算法
1.新建自定义指标项目。
在编辑器中,点击左上角的 新
然后在 向导 中 选择 自定义指标。
填写 自定义指标 的名字和 作者信息
在模板选择中选择 OnCalculate(…,开盘,最高,最低,收盘)
为什么选择OnCalculate(…,开盘,最高,最低,收盘)?
首先OnCalculate是所有价格计算处理函数,其次此处我们要写的是一个取当日最高价和最低价中值的折线指标。选择带有最高价(&high[])和最低价(&low[])参数的OnCalculate更合适。
然后点击下一步,下一步不选择独立窗口,最后点击完成。
在得到的my_indicator.mq5中可以看到已经生成的模板
//+------------------------------------------------------------------+
//| my_indicator.mq5 |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
到这步就已经完成了自定义指标的第一步准备。
2.代码部分
2.1 设置指标属性
使用语句 **#property identifier value **来设置指标属性。
#property
每个mql5-程序都允许指定额外的名为#property的特殊参数,有助于客户端不用启动程序就能够进行贴切的互联网服务。首先,它包括指标外部设置。包括文件中描述的属性完全忽略。属性必须在mql5-主文件中指定。
该部分写在全局,
具体代码和释义如下:
#property indicator_chart_window //显示依附在 图表窗口 的指标
#property indicator_buffers 1 //表示有1个缓冲数组
#property indicator_plots 1 //表示有1种类型的指标图解
#property indicator_label1 "my_indicator"
#property indicator_type1 DRAW_LINE //type后的1为图解系列的序号,从1开始排序。DRAW_LINE表示画线
#property indicator_color1 clrGold //color后1为图解系列的序号,从1开始排序。clrBlue为颜色。
#property indicator_style1 STYLE_SOLID//STYLE_SOLID为实线
#property indicator_width1 1 //线段的粗细为1
2.2 定义数据存放的数组
该数组为自定义。在本文中,因为要计算的是 当前K线的最高价和最低价的中值,所以应该定义一个双精度数组。
double mybuffer[];//定义一个存放数据的数组,该数组存放用于描绘指标的值
2.3 在初始化函数 OnInit中设置数组映射
关键部分
int OnInit()
{
//SetIndexBuffer函数在全局 水平使用一维动态 双精度 数组捆绑指定指标缓冲区。INDICATOR_DATA是数据
SetIndexBuffer(0,mybuffer,INDICATOR_DATA);//指标缓冲数组映射。
return(INIT_SUCCEEDED);
}
2.4 在OnCalculate函数中,编写绘制指标的算法
这个算法就是简单的(最高价+最低价)/2 。代码如下。
注意要先检查循环的变量值,若忽略该部分,可能导致画不出指标 。
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 pos;
int i;
//检查循环变量
if(prev_calculated==0)
pos=0;
else
pos=prev_calculated-1;
//main cycle
for(i=pos; i<rates_total; i++)
{
//--- 指标值写入缓冲区
mybuffer[i]=(high[i]+low[i])/2;
}
//return value of prev_calculated for next call
return(rates_total);
}
然后编译,效果如图
到此,就完成了一个简单指标的编写。
完整代码,放在这
//设置指标属性
#property indicator_chart_window //显示依附在 图表窗口 的指标
#property indicator_buffers 1 //表示有1个缓冲数组
#property indicator_plots 1 //表示有1种类型的指标图解
#property indicator_label1 "my_indicator"
#property indicator_type1 DRAW_LINE //type后的1为图解系列的序号,从1开始排序。DRAW_LINE表示画线
#property indicator_color1 clrGold //color后1为图解系列的序号,从1开始排序。clrBlue为颜色。
#property indicator_style1 STYLE_SOLID//STYLE_SOLID为实线
#property indicator_width1 1 //线段的粗细为1
double mybuffer[];//定义一个存放数据的数组,该数组用于描绘指标
int OnInit()
{
//SetIndexBuffer函数在全局 水平使用一维动态 双精度 数组捆绑指定指标缓冲区。INDICATOR_DATA是数据z
SetIndexBuffer(0,mybuffer,INDICATOR_DATA);//指标缓冲数组映射。
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 pos;
int i;
//检查循环变量
if(prev_calculated==0)
pos=0;
else
pos=prev_calculated-1;
//main cycle
for(i=pos; i<rates_total; i++)
{
//--- 指标值写入缓冲区
mybuffer[i]=(high[i]+low[i])/2;
}
//return value of prev_calculated for next call
return(rates_total);
}
以上。