
外部指标的提醒和注释
简介
实践表明,指标的开发者并非总会在指标代码中包含显示提醒或注释的可能性,因此导致了在指标中添加显示信号的可能性的要求。
MQL4 显示指标信息的可能性
MQL4 编程语言的可能性不包含指标缓冲区的扩展使用,例如,通过添加注释或显示提醒对其扩展,这可以成为简化程序代码编写的一个优点。 另一方面,MQL4 允许读取任何对象的位置并获得它们的全部特征。
本文中,我想展示一种获得添加到图表上的指标信号的数据的方法,并展示其注释、提醒、创建全局变量以进一步用于信息用途,例如将其传递到 Expert Advisor。
图表上绘制的所有标记使用 Wingdings 和箭头代码。 这就是为什么不难获得关于图表上绘制的标记信息的原因。 此外,如果指标开发者包含了对 OBJ_ARROW 对象的详细描述,用户就可以轻松的识别信号。 其中一个示例是经典的日本蜡烛图发明者提供的标记的描述。 在指标的正常情况下,用户只需要把鼠标光标放在标记上,得到带相应文本的弹出帮助窗口。
信号的标准显示
在 MQL4 中,你可以使用一些内置选项使数据呈现更多的信息。
在语言的命令中
double ObjectGet (string name, int prop_id)
函数返回具有特定对象属性的值。 要得到错误数据,调用 GetLastError() 函数。
另请参阅 ObjectSet() 函数。
参数:
name - 对象名称。
prop_id - 对象属性的标识符。 可以是来自 对象属性列表 的任何值。
对象属性的标识符用于 ObjectGet() 和 ObjectSet() 函数。 可以是下面的任意值:
常量 | 值 | 类型 | 说明 |
---|---|---|---|
OBJPROP_TIME1 | 0 | datetime | 接收/设置时间的第一个坐标 |
OBJPROP_PRICE1 | 1 | double | 接收/设置价格的第一个坐标 |
OBJPROP_TIME2 | 2 | datetime | 接收/设置时间的第二个坐标 |
OBJPROP_PRICE2 | 3 | double | 接收/设置价格的第二个坐标 |
OBJPROP_TIME3 | 4 | datetime | 接收/设置时间的第三个坐标 |
OBJPROP_PRICE3 | 5 | double | 接收/设置价格的第三个坐标 |
OBJPROP_COLOR | 6 | color | 接收/设置对象的颜色 |
OBJPROP_STYLE | 7 | int | 接收/设置对象的线型 |
OBJPROP_WIDTH | 8 | int | 接收/设置对象的线宽 |
OBJPROP_BACK | 9 | bool | 接收/设置对象的背景显示标记 |
OBJPROP_RAY | 10 | bool | 接收/设置 OBJ_TREND 类型以及相似类型的对象的光线属性的标记 |
OBJPROP_ELLIPSE | 11 | bool | 接收/设置显示 OBJ_FIBOARC 完整椭圆的标记 |
OBJPROP_SCALE | 12 | double | 接收/设置对象的比例值 |
OBJPROP_ANGLE | 13 | double | 接收/设置 OBJ_TRENDBYANGLE 的角度值(度数) |
OBJPROP_ARROWCODE | 14 | int | |
OBJPROP_TIMEFRAMES | 15 | int | 接收/设置各种周期上的对象呈现方式。 可以是多个对象可视性常量之一或其组合 |
OBJPROP_DEVIATION | 16 | double | 接收/设置 OBJ_STDDEVCHANNEL 的偏离值 |
OBJPROP_FONTSIZE | 100 | int | 接收/设置 OBJ_TEXT 和 OBJ_LABEL 的字体大小 |
OBJPROP_CORNER | 101 | int | 接收/设置 OBJ_LABEL 的约束角度数 得到的值为 0-3 |
OBJPROP_XDISTANCE | 102 | int | 接收/设置 OBJ_LABEL 中相对于约束角的 X 坐标的距离(以像素表示) |
OBJPROP_YDISTANCE | 103 | int | 接收/设置 OBJ_LABEL 中相对于约束角的 Y 坐标的距离(以像素表示) |
OBJPROP_FIBOLEVELS | 200 | int | 接收/设置斐波那契对象的水平数量 可以是从 1 到 32 的数字 |
OBJPROP_LEVELCOLOR | 201 | color | 接收/设置对象水平的线条颜色 |
OBJPROP_LEVELSTYLE | 202 | int | 接收/设置对象水平的线型 |
OBJPROP_LEVELWIDTH | 203 | int | 接收/设置对象水平的线宽 |
OBJPROP_FIRSTLEVEL+n | 210+n | int | 接收/设置对象水平数,其中 n 是已安装/已接收水平的索引。 可以是从 0 到 31 的数字 |
这就是为什么我们使用 OBJPROP_ARROWCODE 参数来查找所需的对象,我们会得到所有对象的列表。 之后,我们在数组中选择所需的对象,并以要求的格式在上面显示信息。
然后创建用于接收关于“日本”指标的蜡烛图名称信息的代码。 我们将得到以下代码:
int obj_total=ObjectsTotal(); // Define the total number of objects on a chart for(int i=0;i<obj_total;i++) // Loop of going through all objects with the purpose of finding necessary ones { if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE) // reading the code
首先,我们应定义如何处理 Wingdings 并在程序代码中相应的设置参数。 在本例中,我们将处理 Wingdings 表中从 100 开始的部分。
if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>100&& ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])
ExtBars 变量用于定义寻找图表上绘制对象的最后柱形的数量。
现在我们将演示提醒和(或)注释。
if (ExtAlert==true){ Alert(Symbol(),Period()," ", TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ", TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":", TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ", ObjectName(i));} if (ExtComment==true){ Comment("\n","\n","\n", Symbol(),Period()," ", TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ", TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":", TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ", ObjectName(i));}
在注释行中
("\n","\n","\n",
用于在显示器的第三行显示信息。
根据需要,你可以包含发送信息至全局变量,以在 Expert Advisor 中使用它们。 这样就消除了侵犯指标开发者版权的可能性,我们可以将信息用于提醒以实现自己的目的,而不必请求开发者修改他们的代码。
使用上面的方法,我们得到以下结果:
显示外部信息的指标运行结果
代码的工作方式跟 ExCandles2 指标类似。 这是 MQL4 论坛发布的第二个指标,将该指标及其发布的代码一起进行检验。
总结
下面是指标的源代码,用于显示关于指标出现信号的信息:
//+------------------------------------------------------------------+ //| AlertSignal.mq4 | //| Copyright © 2009, WWW.FIBOOK.RU | //| http://fibook.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, FIBOOK.RU" #property link "http://fibook.ru" #property indicator_chart_window extern int ExtBars=10; // Number of last bars for calculation extern int ExtArrow=100; // Code number in the "wingdings" table for the count start extern bool ExtAlert=true; // Switch of Alerts displaying extern bool ExtComment=true; // Switch of Comments displaying //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if (per == Time[0]) return; // Correct once per a period per = Time[0]; int cod=0; //---- int obj_total=ObjectsTotal(); for(int i=0;i<obj_total;i++) { if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>ExtArrow&& ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars]) { if (ExtAlert==true){ Alert(Symbol(),Period()," ", TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ", TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":", TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ", ObjectName(i));} if (ExtComment==true){ Comment("\n","\n","\n", Symbol(),Period()," ", TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".", TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ", TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":", TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ", ObjectName(i));} } } //---- return(0); } //+------------------------------------------------------------------+
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1568


