【注】本文于2015年首发于我本人的QQ空间(https://user.qzone.qq.com/80364276/blog/1439353992),刚刚又有人问到这个问题,我就把这篇文章发到这里来了,希望更多的人看到,并且学会怎样在K线图上面显示背景图,并且还能随意修改背景图片。
MT4越来越花哨了,MT4图表上面都可以显示图片了,甚至还可以玩俄罗斯方块和扫雷了。
//| 自定义图表背景图片.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); } |
以上代码我刚刚测试过了,正常有效,如果你还有问题,可以加我QQ:80364276,咨询我。