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);
}
//+------------------------------------------------------------------+
