下载MetaTrader 5

外部指标的提醒和注释

8 四月 2016, 17:17
Vladimir
0
495

简介

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



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);
  }
//+------------------------------------------------------------------+


本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/1568

附加的文件 |
AlertSignal.mq4 (6.31 KB)
交易者的工具箱: 设计指标 交易者的工具箱: 设计指标

本文主要介绍设计指标的主要任务,解决方案和自动化。

金融证券的叠加和干扰 金融证券的叠加和干扰

随着影响货币对行为受到更多因素影响,评估其行为和对未来进行预测将愈发困难。 因此,如果我们成功提取货币对的组成部分,随时间改变的国家货币值,通过和带有此货币以及影响其行为的多个因素的货币对相比较,我们便可以相当程度上界定国家货币移动的自由度。 因此我们可以提高对其行为评估和未来预测的精准度。 如何办到?

计量经济学 EURUSD 先行预测 计量经济学 EURUSD 先行预测

本文主要讲述使用 EViews 软件对 EURUSD 的先行预测以及使用 EViews 语言程序对预测结果进行的进一步评估。 此预测采用回归模型,通过专为 MetaTrader 4 开发的 Expert Advisor 进行评估。

Expert Advisor 参数的测试(优化)技术和一些选择条件 Expert Advisor 参数的测试(优化)技术和一些选择条件

我们可以毫不费力地找到测试的圣杯,然而,要摆脱它却困难得多。 本文重点介绍 Expert Advisor 操作参数的选择,以及在最大限度利用终端性能和最大限度减少终端用户负载的情况下对优化和测试结果进行自动化分组处理。