期货量化软件:赫兹量化如何利用 MQL5 创建自定义指标Heiken
概述我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
赫兹量化交易软件
自定义指标和 Heiken Ashi 定义
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
简单的 Heiken Ashi 指标
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
我们来查看创建此自定义指标需要完成的所有步骤。
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
(indicator_separate_window) 在单独的窗口中显示指标。
(indicator_buffers) 确定指标计算的缓冲区数量。
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。
(indicator_widthN) 还要确定 N 或图形序列的宽度。
(indicator_labelN) 确定图形序列 N 的标签设置。
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1clrBlue, clrRed
#property indicator_width12
#property indicator_label1"Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
double haOpen[];
double haHigh[];
double haLow[];
double haClose[];
double haColor[];
在 OnInit() 中,此函数初始化正在运行的指标。
int OnInit()
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
其参数为:
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
buffer[]: 在我们的自定义指标中声明的数组。
data_type: 我们需要在指标数组中存储的数据类型。
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
SetIndexBuffer(2,haLow,INDICATOR_DATA);
SetIndexBuffer(3,haClose,INDICATOR_DATA);
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
prop_value: 属性的值,我们将指定(_Digits)。
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
plot_index: 图形绘图的索引,我们将指定 0。
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
prop_value: 属性值。
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
return(INIT_SUCCEEDED);
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
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[])
创建一个整数型 “start” 变量,我们稍后将为其赋值:
int start;
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
if(prev_calculated==0)
{
haLow=low;
haHigh=high;
haOpen=open;
haClose=close;
start=1;
}
else
start=prev_calculated-1;
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。
这三个表达式将是:
i=start: 对应起始位置。
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
i++: 加 1 作为新的 i。
我们每次在循环过程中需要执行的操作:
计算四个双精度变量
haOpenVal: 对应 Heiken Ashi 开盘价。
haCloseVal: 对应 Heiken Ashi 收盘价。
haHighVal: 对应 Heiken Ashi 最高价。
haLowVal: 对应 Heiken Ashi 最低价。
在上一步中分配的计算值与以下内容相同
haLow=haLowVal
haHigh=haHighVal
haOpen=haOpenVal
haClose=haCloseVal
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
for(int i=start; i<rates_total && !IsStopped(); i++)
{
double haOpenVal =(haOpen+haClose)/2;
double haCloseVal=(open+high+low+close)/4;
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
double haLowVal=MathMin(low,MathMin(haOpenVal,haCloseVal));
haLow=haLowVal;
haHigh=haHighVal;
haOpen=haOpenVal;
haClose=haCloseVal;
//--- set candle color
if(haOpenVal<haCloseVal)
haColor=0.0;
else
haColor=1.0;
}
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
return(rates_total);
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
//+------------------------------------------------------------------+
//| simpleHeikenAshi.mq5 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1clrBlue, clrRed
#property indicator_width12
#property indicator_label1"Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
double haOpen[];
double haHigh[];
double haLow[];
double haClose[];
double haColor[];
int OnInit()
{
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
SetIndexBuffer(2,haLow,INDICATOR_DATA);
SetIndexBuffer(3,haClose,INDICATOR_DATA);
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
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[],
页:
[1]