量化交易软件下载:赫兹量化图形对象的防破坏保护
在 MQL5/MQL4 中重点对象的保护
如果没有这种保护, 对程序创建对象属性的访问就会更加开放.
我来向您解释一下我的意思. 为了保护对象, 防止它们被删除或者修改属性 - 名称, 描述, 颜色等等. 提供了一个OBJPROP_HIDDEN特性, 可以被明确使用. 它可以设置障碍, 使得图形对象的名称在终端的对象列表菜单中不显示: 图表 -> 对象 -> 对象列表. 默认情况下, 显示日历事件的对象, 交易历史和MQL5程序所创建的对象都设置了这一选项 .
明确设置禁止(没有默认设置) 可以在代码中如下实现:
ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,true);
其中:
ObjectSetInteger 是用于设置对象相关属性数值的函数;
chart_id 标示出放置对象的图表(当前图表为0);
name 是应用此函数的对象的名称;
true 与OBJPROP_HIDDEN一起调用会在对象列表中隐藏此对象(false取消隐藏).
这种实现方式以及相关代码可以在文档中找到. 通过点击提供的对象类型列表中的任意链接, 您就可以看到使用函数创建对象的例子代码.
在图形对象名称列表中禁止显示的对象, 不论是明确说明还是默认的, 都可以通过按下全部按钮来显示图表上的全部对象来看到. 对于通过对象列表人工干预图形对象的属性来说这只是初级保护.

编辑切换为居中
图 2. 在按下"全部"按钮之前的图表上的对象列表

编辑切换为居中
图 3. 在按下"全部"按钮之后的图表上的对象列表
事实上, 图形对象就算您让它不可见, 它在图表上也无法完全隐藏, 这是一个优点而不是缺点. 您可以在列表中快速浏览, 修改或者复制对象的属性, 而不需要检查整个图表, 因为图表中甚至可能包含前些年的对象和柱形. 另外, 列表中的对象可以根据类型, 名称和其他一些参数进行排序.
MetaTrader 5和MetaTrader 4交易终端的众多优点之一就是可以自己简单地开发自动化交易程序, 也可以使用其他人开发的多个应用. 但是人们会永远都不犯错吗?另外, 写程序的准备水平也可能是不一样的. 也有内在的伦理边界. 编程语言就和人一样, 随着时间也能改变和提高.
所以, 如果您能够在程序创建图形时就保证正确, 绝对是件好事. 您可以在列表中快速找到需要的对象并看到它们的属性, 而不是在整个图表上寻找它们. 另外, 您可以确保图表中不含有任何错误或者故意隐藏的对象, 包括程序代码中错误生成的对象.
通过在列表中显示全部对象, 然后选择其中的一些进行删除, 也有可能意外删除控制面板中当时还需要的对象.
在继续程序的回应操作之前, 我们可以利用前文中提到的MQL5和MQL4语言的优点. 我是指能够在代码中使用不同的方法来完成不同的任务.
3. 创建对象的策略
如有必要, 这将有助您在代码中创建您自己的解决方案, 而不是浪费时间在寻找方案中走上错误或者复杂的道路.
为了防止听起来过于正式和专业, 我将告诉您我是怎样找到这种策略的. 之后提到的代码附加在文章的末尾. 为了它们能够运行您需要把代码库中的包含文件ObjectCreateAndSet, 保存到您客户终端的Include文件夹中. 它包含了用于创建对象和通过必要的检查来修改它们属性的函数. 这个文件在附加的test_types_of_chart_events指标的运行中并不需要.
3.1. 在实际写代码之前的考量和操作
根据文档, 您可以使用OnChartEvent()函数, 在图表上有变化或用户事件的时候, 为了您任务的目标, 获得和处理大约9种类型的事件. 它们中的一些是通知关于图形对象的删除, 修改和创建的.
首先, 我是想如何在代码中实现如下功能:
如果对象被人工或者程序删除或修改了, 它们可以"自我恢复";
在有这样的外部操作时程序可以从图表上"自我分离".
这两种功能都需要同时实现图表上因为某人或者程序重命名的变成"外来者"的对象, 并且不能有更多循环的事件处理.
我的第一个思路是在整个程序中当收到有关对象被修改或者删除的事件时, 来自我检测其属性的变化, 但是这看起来不是最好和最实用的方法. 然后我想到, 完全自我检测可能意味着有许多不必要的操作.
例如, 在对象行为的事件处理中, 图表对象的名称在程序中都会进行比较和跟踪. 当在程序中跟踪任意类型的事件时, 我们的得到的不仅是图形对象的信息, 而是图表上的全部对象. 对象名称的类型是string(字符串), 而 string 类型数据的处理时间比其他类型要长. 图表上可能有很多人工创建或者其他程序创建的对象, 其中可能会进行各种操作, 这样会产生大量的事件.
以下是一个类似的代码框架, 在启用了图表对象删事件通知的情况下, 会进行检测对象名称的匹配比较. 代码中没有进行预先处理以减少比较的次数, 它应用于多个图形对象的处理中:
if(id==CHARTEVENT_OBJECT_DELETE) { string deletedChartObject=sparam; //--- for(int i=QUANT_OBJ-1;i>=0;i--) { if(StringCompare(deletedChartObject,nameObj[i],true)==0) { /*这里有一些代码, 如果 事件中主题的名称和 程序中对象的名称完全匹配的话, 会进行相应处理.*/ return; } } }