1赞

3评论

0收藏

屏幕标注

 

avatar 老周 | 2654 人阅读 | 3 人评论 | 2016-11-09

在我学习编写程序的时候, 有位老师曾经说: 做界面是衡量程序员水平的一项重要指标。MQL4 语言不提供丰富的、方便的界面编写指令自有道理,但毕竟它不是 C 语言,编写出能按照策略执行交易的程序才是关键。正因为如此,在信息显示、程序调试方面显得十分“低能” ,例如不提供属性丰富的界面对象编辑,对于调试,不提供断点调试,不提供中间变量的查询等等。


将屏幕显示知识作为独立一章来介绍实在是深感必要。


第一, 我们在调试程序的时候常常要获取中间变量值,来判断逻辑是否合理。


第二,操盘的每一个动作都可以通过屏幕显示观察。


第三,需要将订单的开仓与平仓价位连线(甚至是动态连线)以便直观分析。


第四,指标编写中存在大量画线需求,例如画出高低区间。第五,用色块覆盖某些特定的区域。


MQL4 其实提供了大量的信息显示命令语句以及方法,只是在帮助文件中分布凌乱,而且从来都没有一个专门的文章来系统介绍。 总结编程经验, 我将 MQL4 屏显功能分为三个类型:


第一类是直接显示。

即用“Print”命令在“日志”中显示相关的变量数据。随着新价格不断的到来,在“终端”窗口的“日志”标签栏中会不停地给出以文本方式显示的结果。


第二类是屏幕定位显示。

即以屏幕像素为坐标,在主图或者副图固定位置显示信息。

第三类是 k 线定位显示。

即以 k 线数据(时间和价格)为坐标,在主图或者副图固定位置显示信息。


其实还有一类,那就是指标曲线,本章不做讨论。

直接显示

用最经典的“显示九九表”做练习,先看源码,程序命名为“test.mq4” 。

  1. #property copyright "Copyright 2012, laoyee"
  2. #property link "http://www.docin.com"
  3. //新价格到达时运行一次
  4. int start()
  5. {
  6. return(0);
  7. }
  8. //程序加载时运行一次
  9. int init()
  10. {
  11. string myResult; //定义九九表结果变量
  12. int i=1,j=1; //定义九九表循环变量
  13. for (i=1;i<=9;i++)
  14. {
  15. for (j=i;j<=9;j++)
  16. {
  17. myResult=myResult+" "+i+"*"+j+"="+(i*j); //九九表结果变量赋值
  18. }
  19. Print(myResult); //在"智能交易"栏显示结果
  20. myResult=""; //结果变量清空
  21. }
  22. return(0);
  23. }
  24. //程序卸载时运行一次
  25. int deinit()
  26. {
  27. return(0);
  28. }
复制代码

为了让九九表只显示一次结果,我们把计算代码放置在 int init()模块当中。将程序编译后加载,在“终端”窗口的“智能交易”标签栏中显示如下:


QQ图片20161109172019.png

用“Print”命令显示出每一次变量 i 发生变化后的结果,该命令对换行符号”\n”无效,也就是说不能实现换行显示。


我们采用 Comment 命令再试试,在“test.mq4”基础上修改代码如下。

  1. #property copyright "Copyright 2012, laoyee"
  2. #property link "http://www.docin.com/yiwence"
  3. //新价格到达时运行一次
  4. int start()
  5. {
  6. return(0);
  7. }
  8. //程序加载时运行一次
  9. int init()
  10. {
  11. string myResult; //定义九九表结果变量
  12. int i=1,j=1; //定义九九表循环变量
  13. for (i=1;i<=9;i++)
  14. {
  15. for (j=i;j<=9;j++)
  16. {
  17. myResult=myResult+" "+i+"*"+j+"="+(i*j); //九九表结果变量赋值
  18. }
  19. myResult=myResult+"\n"; //结果变量加上换行符号
  20. }
  21. Comment(myResult);
  22. return(0);
  23. }
  24. //程序卸载时运行一次
  25. int deinit()
  26. {
  27. return(0);
  28. }
复制代码

在结果变量赋值语句中增加了一个换行符"\n",这次在主图的左上角显示:

QQ图片20161109172125.png

Comment 与 Print 命令的差异描述如下:
1、 Comment 命令将变量结果在主图左上角显示, 如果程序代码中有多处使用该命令,则后一次执行的结果将覆盖前一次结果。Print 显示在“终端”窗口的“智能交易”标签栏中,如果程序代码中有多处使用该命令,则按先后顺序全部显示。


2、 Comment 命令可以用换行符实现多信息显示,Print 命令只能一次显示一行信息。

Comment 与 Print 命令的共性描述如下:

两个命令都不能定义字体、颜色及大小,适合在程序调试时使用。

Print 命令在执行过程中产生的结果会被记录到 MT4 的日志文档中(\experts\logs) ,建议调试完毕后最好对此语句加上注释或者删除, 因为日志文档有最大字节数限制, 可以防止意外错误的发生,二是避免日积月累的垃圾文档占用过多的磁盘空间,三是为了策略保密。


事实上,大多数国外的 EA 都喜欢采用 Comment 命令显示相关信息,而 Print 命令通常用于程序调试。由于我们使用中文,用 Comment 命令显示字体太小无法看清楚,即便用放大镜看, 中文字都是模糊的, 信不信由你, 反正我信, 呵呵, 而且如果左上角显示过多信息,会与 k 线重叠,既不美观也不便于技术分析。


QQ图片20161109172248.png

观察主图,我们发现右边红框范围内是空白区域,正好用来显示程序相关的信息,而且箭头所指的部位可以通过鼠标左右拉动调整红框的宽度。这实在是一个很好的位置!

""
还没有人打赏,支持一下

评论|共 3 个

sam821

发表于 2017-3-16 17:50:35 | 显示全部楼层

高手,有没有更改ea logo的代码?谢谢(就是ea那个带博士帽的logo)

stopasb

发表于 2017-12-20 19:42:42 | 显示全部楼层

走过路过不要错过

sunnywh

发表于 2018-4-5 13:59:06 | 显示全部楼层

楼主您好。有事情请教,请问可以提供联系方式吗?

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则