这是MT4编程开发实战系列的第2站,在上一节中,我们学习了如何利用ObjectCreate函数在图表上画直线。在这一节中,我们将继续用ObjectCreate函数在图表上画出更多的图形。
有时候我们想对某些时间段的图形用椭圆形标识出来,下面我们一起来实现这样的一个指标。
利用ObjectCreate函数可以方便的在图表上画出一个椭圆形,MQL语言中表示椭圆的常量是OBJ_ELLIPSE。画一个椭圆需要两个坐标点,所以,画一个椭圆的基本语句如下:
ObjectCreate(“ellipse”, OBJ_ELLIPSE, 0, x1, y1, x2, y2)
新建一个指标文件,命名为”Lesson2_DrawShape_1”,然后在start函数中加入如下语句:
保存文件,按F5编译指标文件,然后把在MT4中新建一个图表,把Lesson2_DrawShape_1指标添加到图表上,可以看到我们已经在图表上画出了一个椭圆形。
解释一下ObjectCreate函数中的各个参数,第1个是图形的名字,可以任意写(忘记了就回头看看第一节);第2个是MT4系统默认的一个常量,意思是告诉MT4我们要画一个椭圆;第3个0是表示我们要在主窗口上进行画图;第4个是坐标点1的x坐标,简单起见,我这里写了Time[0],代表起点是当前时间(还记得MT4图表的方向是从右到左的吗?);第5个参数是坐标点1的y坐标,为简单起见,这里我写了Bid,表示当前的卖出价;第6个是坐标点2的x坐标,Time[10]表示在当前图表上从当前时间往左第10根K线的位置;第7个是坐标点2的y坐标,Ask表示当前的买入价。
椭圆已经画出来了,颜色似乎不够醒目,那我们应该如何修改已画出来的图形的颜色呢?用ObjectSet函数。例如我现在想把椭圆的颜色改为红色,可以在ObjectCreate函数下面添加这样一句:
编译后把指标重新添加到图表上,可以看到椭圆已经变为红色了:
ObjectSet的第一个参数是图形的名字,意思是告诉MT4我将要对”ellipse”这个图形进行修改;OBJPROP_COLOR这个参数是MT4默认的系统常量,表示Object的颜色属性,在后面我们将会看到,Object还会有很多各种各样的属性,这些属性命名的规则都是OBJ_XXX这样的,只要把这个常量更改为我们想要修改的属性就行了;第3个参数Red是MT4默认的系统常量,表示红色,在MQL语言中,各种颜色都可以直接用它们的英文名称来表示,非常方便。
椭圆的颜色已经修改好了,但是大小似乎还不满意,我们再把它改大一点,在前面代码的基础上再添加一句:
编译运行后重新添加到图表上,我们发现椭圆变大了:
OBJ_SCALE表示对图形进行缩放,1是缩放的数值,越小椭圆就越大,具体效果可以自己修改看看。
下面,我想用一个矩形来替代上面我们画出来的椭圆,该如何做呢?很简单,只要用OBJ_RECTANGLE代替OBJ_ELLIPSE就行了。下面我们一起动手做。首先新创建一个指标文件,命名为Lesson2_DrawShape_2,在start函数加入如下语句:
编译后运行,然后在MT4中新建一张图表,把Lesson2_DrawShape_2指标添加到图表上,可以看到我们已经在图表上画了一个矩形:
解释一下上面的代码:我们用OBJ_RECTANGLE代替了前面的OBJ_ELLIPSE,意思是告诉MT4我们将要在图表上画一个矩形;Time[0]和Time[10]分别是坐标点1的x轴坐标和坐标点2的x轴坐标,这个我们在前面都讲过了,关键是iHigh和iLow这两个函数,iHigh和iLow都是MT4自带的系统函数,iHigh的意思是获取指定周期的最高价格,iHigh函数里面有3个参数:Symbol()函数表明用当前图表上的货币、1440表示天图、0表示取当天的最高价。这里做个补充,在MT4编程中,表示时间周期有两种方法:一是直接用数字表示,MT4中的时间单位是分钟,所以你要指定哪个时间周期,就直接填多少分钟行了,在上面的例子中,因为1天是1440分钟,所以直接填1440就行了,如果要取1小时图的最高值就填60,30分钟图就填30,如此类推;二是用MT4默认的系统变量,像上面的语句,我们也可以这样写:
编译出来的指标是一样的,PERIOD_D1是MT4默认的系统变量,表示周期为天,如果1小时图就是PERIOD_H1,30分钟图就是PERIOD_M30,如此类推。同理,iLow就是取指定周期的最低价;最后一个参数是0,这里表示取最天图最右边的K线的最高价和最低价,即当天的最高价和最低价,如果改为1,上面的例子就是取昨天的最高价和最低价了(还记得MT4图表的方向是由右往左吧?)。
同样,我们可以用ObjectSet函数把上面画出来的矩形变为红色:
现在,我们把指标Lesson2_DrawShape_2从图表上删除掉,发现已经画出来的矩形并没有从图表上删除,为什么呢?在MT4中,已经画出来的图形默认是不会随指标一起被删除的,这时我们就要用到deinit和ObjectDelete函数了。前面说过,deinit函数是在指标被删除的时候调用的,主要用来做一些清理性的工作,ObjectDelete函数是删除一个指定的图形对象,因此,我们可以在deinit函数中加入如下代码:
ObjectDelete函数中的参数表示告诉MT4我们要删除哪个图形。