自定义指标
自定义指标
这是一组用来创建自定义指标的函数,这些函数不能用于编辑EA交易和脚本。
| 函数 | 功能 |
|---|---|
| SetIndexBuffer | 将指定指标缓冲区和一维双精度动态数组绑定一起 |
| IndicatorSetDouble | 设置双精度型指标属性值 |
| IndicatorSetInteger | 设置整型型指标属性值 |
| IndicatorSetString | 设置字符串指标属性值 |
| PlotIndexSetDouble | 设置双精度型指标行属性值 |
| PlotIndexSetInteger | 设置整型指标行属性值 |
| PlotIndexSetString | 设置字符串指标行属性值 |
| PlotIndexGetInteger | 返回整数型指标行属性值 |
指标属性可以使用编译程序指令或使用函数来设定。若要更好的理解这点,建议您学习指标类型示例。
自定义指标中所有必要的运算都在预定义的OnCalculate()函数中,如果短时间使用OnCalculate()函数调用,如
int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])而后rates_total参量包括price[]数组中的全部元素数量值,以输入参量传递到计算指标值中。
参量 prev_calculated 是先前调用的OnCalculate() 计算结果,允许为计算指标值组织一种节约算法,例如,如果当前值是rates_total = 1000, prev_calculated = 999, 足够为每个指标缓冲区计算值。
如果是关于输入数组价格的信息是不能利用的,它会为每个指标缓冲区计算1000个必要值。第一次调用OnCalculate() value prev_calculated = 0,如果price[]数组在某种程度上改变,case prev_calculated 会等于0。
begin参量表示价格数组原始值的数量,不包括计算数据。例如,如果Accelerator Oscillator 值(开头37个值没有计算)以输入参量使用,那么begin = 37。例如,列举一个简单指标:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- 绘图标签1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- 指标缓冲区
double Label1Buffer[];
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 指标缓冲区绘图
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+------------------------------------------------------------------+
//| 自定义指标重复函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---
Print("begin = ",begin," prev_calculated = ",prev_calculated," rates_total = ",rates_total);
//--- 为下一次调用返回prev_calculated值
return(rates_total);
}从"导航器" 界面离开到加速震荡指标窗口,我们认为该计算一定以先前指标的值为基础。

结果是,第一次调用prev_calculated的OnCalculate()值等于0,之后调用等于rates_total 值(直到增加价格图表的柱的数量)。

开始参量的值直接等于原始字节数量,加速指标的值不能根据指标逻辑值来计算。如果浏览自定义指标加速器.mq5的源代码,可以看到 OnInit() 函数线:
//--- 从被画的指数中设置第一柱
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);使用函数PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values), 可以建立自定义指标的0指标数组中非存在第一值的编号,这样,我们不需要接收计算(empty_first_values). 因此,可以机械使用:
- 建立指标的原始值数字,不能用了计算另外自定义指标;
- 当调用另一自定义指标时,获得关于第一忽略值的数量信息,不需要进入计算逻辑值。