MT4越来越花哨了,MT4图表上面都可以显示图片了,甚至还可以玩俄罗斯方块和扫雷了。
我今天教大家如何自定义图表背景图片,我通过一个指标例子告诉大家怎么写代码,这个指标的功能就是在MT4任意一个图表上面显示一张图片,点击图片就会切换到另一张,用的是两张图片随意切换。
显示图片的原理是创建label对象,过去label对象只能显示文字,可以设置大小,位置,颜色等,自从MT4升级到build600之后,label对象开始可以显示图片了,而且还做成了按钮,可以实现按下按钮显示一张图片,抬起按钮显示另一张图片。
指标程序代码如下:
我写了尽可能详细的注释,有一点MQL4基础的,通过看注释应该就能够明白这是怎么实现的,有不明白的,可以单独来问我。
注意:直接复制下面的代码后,还需要准备两张图片,分别命名为p11w.bmp和\p12w.bmp并存放到MT4的数据文件夹\MQL4\Images下面,你的指标才可能正常运行。
- //+------------------------------------------------------------------+
-
- //| 自定义图表背景图片.mq4 |
-
- //| Copyright 2015, MetaQuotes Software Corp. |
-
- //| QQ:80364276 |
-
- //+------------------------------------------------------------------+
-
- #property copyright "Copyright 2015, MetaQuotes Software Corp."
-
- #property link "https://www.mql5.com"
-
- #property version "1.00"
-
- #property strict
-
- #property indicator_chart_window
-
- string label_name="p11w_label"; // 设定OBJ_BITMAP_LABEL对象的名称
-
- string p11w ="\\Images\\p11w.bmp"; // 指定图片文件的路径,位于MT4的数据文件夹\MQL4\Images\p11w.bmp
-
- string p12w ="\\Images\\p12w.bmp"; // 指定图片文件的路径,位于MT4的数据文件夹\MQL4\Images\p12w.bmp
-
-
-
- //+------------------------------------------------------------------+
-
- //| 自定义指标初始化函数 |
-
- //+------------------------------------------------------------------+
-
- int OnInit()
-
- {
-
- //--- 首选在图上搜索是否有我们创建的对象,如果没有,那么就创建
-
- if(ObjectFind(0,label_name)<0)
-
- {
-
- //--- 生成图像标签对象
-
- bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
-
- if(created)
-
- {
-
- //--- 设置对象的位置,在左上角,意思就是对象的(0,0)坐标在左上角
-
- ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
-
- //--- 设置对象的x,y坐标
-
- ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,0);
-
- ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,0);
-
- //--- 重置错误代码为0
-
- ResetLastError();
-
- //--- 设置这个图像标签对象被按下的时候显示的图片为p11w
-
- bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,p11w);
-
- //--- 重置错代码为0
-
- ResetLastError();
-
- //--- 设置这个图像标签对象被松开按键的时候显示的图片为p12w
-
- set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,p12w);
-
- //--- 发送一个命令,让图表上面这个对象自动立即重绘
-
- ChartRedraw(0);
-
- }
-
- else
-
- {
-
- //--- 如果对象创建失败,给出提醒
-
- PrintFormat("创建图像标签对象失败,错误代码 %d",GetLastError());
-
- }
-
- }
-
-
-
- //---
-
- return(INIT_SUCCEEDED);
-
- }
-
- //+------------------------------------------------------------------+
-
- //| 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
-
- return(rates_total);
-
- }
-
- //+------------------------------------------------------------------+
-
- void OnDeinit(const int reason)
-
- {
-
- //--- 卸载指标的时候,清除这个对象。
-
- ObjectDelete(0,label_name);
-
- }
复制代码
|