MQL5变色线画法详解与代码示例

在MQL5中,有一种特殊的指标数组被称为“颜色数组”,它与用于绘制线条的指标数组配合使用。通过对颜色数组进行简单的赋值,即可实现线条变色的效果,这一过程比MQL4更为简便。

首先,需要在指标头部定义中指定某条线对应的数组采用变色画线方式,具体指定方法如下:

#property indicator_typeX DRAW_COLOR_LINE

这里的X代表画线数组的序号。

DRAW_COLOR_LINE代表画线,除此之外,MQL5还支持以下几种画线方式:

复制代码

DRAW_COLOR_LINE

彩色线

DRAW_COLOR_SECTION

彩色块

DRAW_COLOR_HISTOGRAM

从零线开始的彩色柱状图

DRAW_COLORCBCX_HISTOGRAM2

双指标缓冲区的彩色柱状图

DRAW_COLOR_ARROW

彩色箭头

DRAW_COLOR_ZIGZAG

彩色ZiCBCXgZag线

DRAW_COLOR_BARS

彩色竹线图

DRAW_COLOR_CANDLES

彩色蜡烛图

之后,需要紧跟一个颜色定义语句:

#property indicator_colorX Red,Green

多个颜色之间使用逗号进行分隔。

============================================

针对上述程序头部的定义,接下来需要进行全局数组的定义。值得注意的是,要实现变色效果,需要为一条线配备两个数组,例如:

double bMaBuffer[], bColorBuffer[];

随后,在OnInit事件中对这两个数组进行分别设定:

SetIndexBuffer(0,bMaBuffer,INDICATOR_DATA);//INDICATOR_DATA表示该数组用于画线

SetIndexBuffer(1,bColorBuffer,INDICATOR_COLOR_INDEX);//INDICATOR_COLOR_INDEX表示该数组用于变色

注意事项:

如果需要绘制多条彩色线,那么画线数组和颜色数组的序号应当紧邻排列。

============================================

下一步,在OnCalculate事件中,需要完成画线数组的计算,并根据自定义条件对颜色数组进行赋值。赋值规则如下:

当对应K线序号的颜色数组被赋值为1.0时,该画线数组的颜色为第一个定义的颜色;当被赋值为0.0时,颜色则为第二个定义的颜色。

至此,变色线的绘制方法介绍完毕。

以下为完整示例源码:【绘制两条变色线】

复制代码

//+------------------------------------------------------------------+

//| Test.mq5 |

//+------------------------------------------------------------------+

#property copyright "示例程序"

#property version "1.00"

#property indicator_chart_window

#property indicator_buffers 4

#property indicator_plots 2

#property indicator_color1 Red,Green

#property indicator_type1 DRAW_COLOR_LINE

#property indicator_style1 STYLE_SOLID

#property indicator_width1 2

#property indicator_color2 Yellow,Blue

#property indicator_type2 DRAW_COLOR_LINE

#property indicator_style2 STYLE_SOLID

#property indicator_width2 2

input int MaPeriod=13;

double bMaBuffer[],bMaBuffer1[],bColorBuffer[],bColorBuffer1[];

int iMaHandle,iMaHandle1;

//+------------------------------------------------------------------+

//| 自定义指标初始化函数 |

//+------------------------------------------------------------------+

int OnInit()

{

//--- 指标缓冲区映射

SetIndexBuffer(0,bMaBuffer,INDICATOR_DATA);

SetIndexBuffer(1,bColorBuffer,INDICATOR_COLOR_INDEX);

SetIndexBuffer(2,bMaBuffer1,INDICATOR_DATA);

SetIndexBuffer(3,bColorBuffer1,INDICATOR_COLOR_INDEX);

IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

iMaHandle=iMA(NULL,0,MaPeriod,0,MODE_SMA,PRICE_CLOSE);

iMaHandle1=iMA(NULL,0,MaPeriod+50,0,MODE_SMA,PRICE_CLOSE);

//---

return(0);

}

//+------------------------------------------------------------------+

//| 自定义指标迭代函数 |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime& time[],

const double& open[],

const double& high[],

const doubCBCXle& low[],

const double& close[],

const long& tick_volume[],

const long& volume[],

const int& spread[])

{

//--- 检查K线数量

if(rates_total

return(0);

//--- 确定起始位置

int start;

if(prev_calculated<0)return(-1);else start=rates_total-prev_calculated+1;

int to_copy;

if(prev_calculated==rates_total || prev_calculated<0) to_copy=rates_total;

else

{

to_copy=rates_total-prev_calculated;

if(prev_calculated==0) to_copy++;

}

if(CopyBuffer(iMaHandle,0,0,to_copy,bMaBuffer)<=0)

{

Print("获取快速均线数据失败!错误代码",GetLastError());

return(0);

}

if(CopyBuffer(iMaHandle1,0,0,to_copy,bMaBuffer1)<=0)

{

Print("获取第二均线数据失败!错误代码",GetLastError());

return(0);

}

//--- 主循环

for(int i=start;i

{

if(bMaBuffer[i]>close[i-1])

bColorBuffer[i]=1.0;

else bColorBuffer[i]=0.0;

if(bMaBuffer1[i]>close[i-1])

bColorBuffer1[i]=1.0;

else bColorBuffer1[i]=0.0;

}

return(rates_total);

}

//+------------------------------------------------------------------+