外部指标的提醒和注释

Vladimir | 8 四月, 2016

简介

实践表明,指标的开发者并非总会在指标代码中包含显示提醒或注释的可能性,因此导致了在指标中添加显示信号的可能性的要求。



MQL4 显示指标信息的可能性

MQL4 编程语言的可能性不包含指标缓冲区的扩展使用,例如,通过添加注释或显示提醒对其扩展,这可以成为简化程序代码编写的一个优点。 另一方面,MQL4 允许读取任何对象的位置并获得它们的全部特征。

本文中,我想展示一种获得添加到图表上的指标信号的数据的方法,并展示其注释、提醒、创建全局变量以进一步用于信息用途,例如将其传递到 Expert Advisor。

图表上绘制的所有标记使用 Wingdings 和箭头代码。 这就是为什么不难获得关于图表上绘制的标记信息的原因。 此外,如果指标开发者包含了对 OBJ_ARROW 对象的详细描述,用户就可以轻松的识别信号。 其中一个示例是经典的日本蜡烛图发明者提供的标记的描述。 在指标的正常情况下,用户只需要把鼠标光标放在标记上,得到带相应文本的弹出帮助窗口。


信号的标准显示

在 MQL4 中,你可以使用一些内置选项使数据呈现更多的信息。

在语言的命令中

double ObjectGet (string name, int prop_id)

函数返回具有特定对象属性的值。 要得到错误数据,调用 GetLastError() 函数。
另请参阅 ObjectSet() 函数

参数:
name - 对象名称。
prop_id - 对象属性的标识符。 可以是来自 对象属性列表 的任何值

对象属性的标识符用于 ObjectGet()ObjectSet() 函数。 可以是下面的任意值:

常量 类型 说明
OBJPROP_TIME10datetime接收/设置时间的第一个坐标
OBJPROP_PRICE11double接收/设置价格的第一个坐标
OBJPROP_TIME22datetime接收/设置时间的第二个坐标
OBJPROP_PRICE23double接收/设置价格的第二个坐标
OBJPROP_TIME34datetime接收/设置时间的第三个坐标
OBJPROP_PRICE35double接收/设置价格的第三个坐标
OBJPROP_COLOR6color接收/设置对象的颜色
OBJPROP_STYLE7int接收/设置对象的线型
OBJPROP_WIDTH8int接收/设置对象的线宽
OBJPROP_BACK9bool接收/设置对象的背景显示标记
OBJPROP_RAY10bool接收/设置 OBJ_TREND 类型以及相似类型的对象的光线属性的标记
OBJPROP_ELLIPSE11bool接收/设置显示 OBJ_FIBOARC 完整椭圆的标记
OBJPROP_SCALE12double接收/设置对象的比例值
OBJPROP_ANGLE13double接收/设置 OBJ_TRENDBYANGLE 的角度值(度数)

OBJPROP_ARROWCODE

14

int

接收/设置 OBJ_ARROW 的箭头代码。 可以是 wingdings 符号之一或预定义的箭头代码之一

OBJPROP_TIMEFRAMES15int接收/设置各种周期上的对象呈现方式。 可以是多个对象可视性常量之一或其组合
OBJPROP_DEVIATION16double接收/设置 OBJ_STDDEVCHANNEL 的偏离值
OBJPROP_FONTSIZE100int接收/设置 OBJ_TEXT 和 OBJ_LABEL 的字体大小
OBJPROP_CORNER101int接收/设置 OBJ_LABEL 的约束角度数 得到的值为 0-3
OBJPROP_XDISTANCE102int接收/设置 OBJ_LABEL 中相对于约束角的 X 坐标的距离(以像素表示)
OBJPROP_YDISTANCE103int接收/设置 OBJ_LABEL 中相对于约束角的 Y 坐标的距离(以像素表示)
OBJPROP_FIBOLEVELS200int接收/设置斐波那契对象的水平数量 可以是从 1 到 32 的数字
OBJPROP_LEVELCOLOR201color接收/设置对象水平的线条颜色
OBJPROP_LEVELSTYLE202int接收/设置对象水平的线型
OBJPROP_LEVELWIDTH203int接收/设置对象水平的线宽
OBJPROP_FIRSTLEVEL+n210+nint接收/设置对象水平数,其中 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);
  }
//+------------------------------------------------------------------+