MQL5变色线的画法(比MQL4更加简单)

分析师:DBG Markets盾博
发布时间:2025-11-17
阅读量:

MQL5里有一种特殊指标数组“颜色数组”,他是和画线的指标数组配合使用的。通过对他的简单赋值可以使画出的线变色。

首先要在指标头部定义里指定一条线对应的数组是要使用变色画线方式,指定方法是:

#property indicator_typeX DRAW_COLOR_LINE

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

DRAW_COLOR_LINE代表画线,此外还可以有如下画线方式:

复制代码

DRAW_COLOR_LINE

Colorful Line彩色线

DRAW_COLOR_SECTION

Multicolored section彩色块

DRAW_COLOR_HISTOGRAM

Multicolored histogram from the zero line彩色柱状图

DRAW_COLOR_HISTOGRAM2

Multicolored histogram of the two indicator buffers彩色柱状图2

DRAW_COLOR_ARROW

Drawing colored arrows彩色箭头

DRAW_COLOR_ZIGZAG

Colorful ZigZag彩色ZigZag

DRAW_COLOR_BARS

Multi-colored bars彩色竹线图

DRAW_COLOR_CANDLES

Multi-colored 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表示是用于变色的颜色数组

注意:

如果这里要画多条彩色线,则画线数组和颜色数组的序号要紧邻。

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

下一步就是在OnCaculate事件里进行画线数组的计算,同时根据自定义的条件对颜色数组进行赋值。

赋值规则是:

当对应K线序号的颜色数组被赋值1.0时,对应画线数组的颜色为 第一个颜色

当对应K线序号的颜色数组被赋值0.0时,对应画线数组的颜色为 第二个颜色

完。

程序举例源码如下:【画出两个变色线】

复制代码

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

//| Test.mq5 |

//| Copyright 2009, MetaQuotes Software Corp. |

//| http://bbs.520fx.com |

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

#property copyright "2009, 520FX"

#property link "http://www.mql5.com"

#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;

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

//| Custom indicator initialization function |

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

int OnInit()

{

//--- indicator buffers mapping

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);

}

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

//| 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

//--- checking for bars count

if(rates_total

return(0);

//--- detect start position

int start;

//if(prev_calculated1) start=prev_calculated-1;

//else start=1;

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

int to_copy;

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

else

{

to_copy=rates_total-prev_calculated;

if(prev_calculated0) to_copy++;

}

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

{

Print("Getting fast SMA is failed! Error",GetLastError());

return(0);

}

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

{

Print("Getting fast SMA1 is failed! Error",GetLastError());

return(0);

}

//--- main cycle

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);

}

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