指标: ID 精简信息 MA

 

ID 精简信息 MA:

指标显示均线 (MA) 数值, 与数值之间的差价以及与 MA 之间的差价。

指标行, 标记以及最高和最低价之间的点数差, 近似到 2 位小数, 绘于 3-位小数的图表

作者: Dina Paches

 

如果该指标对您不起作用。而您的交易终端的 MetaEditor 在编译带有该指标的文件时显示了此类错误信息(例如,在为MetaTrader5第 1150 版编译时):



编译并运行该指标

1. 复制该函数并将其添加到指标代码的末尾:

//+------------------------------------------------------------------+
//| 按对象名称中的通用前缀删除对象 ||
//||(如果需要,还有对象类型):|
//| 2014 (最后修改: 14.07.2015), Dina Paches | |
//|https://login.mql5.com/ru/users/dipach  ||
//+------------------------------------------------------------------+
//| string prefix_obj = 对象名称中的常用前缀
//| long chart_ID = 图表标识符 || 
//| int sub_window=-1 = 窗口索引|
//| int type=-1 = 对象类型(或用 | 代替 int - 对象类型)。
//| 枚举 ENUM_OBJECT)|
//| int start_pos=-1 = 共用前缀子串在 | 中的起始位置。
//| 对象名称|
//+------------------------------------------------------------------+
void ObDeleteN(string prefix_obj,int chart_ID=0,int sub_window=-1,
               int type=-1,int start_pos=0)
  {
   int quantObj=ObjectsTotal(chart_ID,sub_window,type);
   if(quantObj>0)
     {
      int count=0;
      int prefixLen=StringLen(prefix_obj);
      string name[];
      ArrayResize(name,quantObj,quantObj+1);
      ArraySetAsSeries(name,true);

      for(int i=quantObj;i>=0;i--)
        {
         string objNameX=ObjectName(chart_ID,i,sub_window,type);
         string findValue=StringSubstr(objNameX,start_pos,prefixLen);

         if(StringCompare(findValue,prefix_obj,true)==0)
           {
            count=count+1;
            name[count-1]=objNameX;
           }
        }
      if(count>0)
        {
         ArrayResize(name,count,count+1);
         for(int i=count-1;i>=0; i--)
           {
            ObjectDelete(chart_ID,name[i]);
           }
        }
     }
     else return;
  }
//+------------------------------------------------------------------+


2. 2. 在代码的OnDeinit()OnChartEvent() 部分的这一行前加上双斜线"//":

 ObjectsDeleteAll(0,prefixObj,0,-1);


3. 复制这一行并将其放入指标代码中(将其放在上面一行的下面,由于上面一行在代码中出现了两次,因此应将这一行放在两个地方):

ObDeleteN(prefixObj,0,0);


4. 这样,功能变体不起作用的代码部分(例如,在第 1150 版中)的代码将如下所示:


   //ObjectsDeleteAll(0,prefixObj,0,-1);
   ObDeleteN(prefixObj,0,0);


5. 然后,编译代码。错误信息将消失,指标将可在 MetaTrader5 版本 1150 的图表上运行。


附/附注: 如果您有任何问题,请在此处讨论或发送私人消息。

 
附/附注: 上面帖子中的对象删除功能已替换为一个功能更全面、更省事的选项。
 

唉......我的灵魂就像掉了一块石头。幸运的是,"寻找的人总会找到的"(c) 这次起作用了。

我终于找到了上述函数变体的原型。

现在我可以说,非常感谢 教科书 作者科瓦廖夫、阿尔乔姆 和我不知道名字的7777877 所提供的详细方案。


附/附注: 在我自己解析这个函数的原型、了解其含义并进行实验时,我曾一度没有从 MQL4 中保存(不是故意的!)它的源代码,在此基础上,它最终被编译并以不同形式用于我在 MQL4 和 MQL5 中的代码 我以前未公开或公开发布过该函数(或其其他变体)的代码。

我记得,我在网站上非常不幸地偶然发现了作品/搜索不起作用(或者是我的搜索,正如我现在意识到的那样,是错误的),这时我的良知提醒我去寻找来源。特别是,我记得我在论坛上看到过关于该计划的信息,但我不记得教科书。因此,我把这件事推到了 "以后"。

因此,在尊重他人工作的前提下,如果可能的话,我尽量立即复制信息,从哪里/从谁那里获取的信息。

因此,我由衷地庆幸,在没有任何外界提示或提醒的情况下,我自己找到了这一功能的主要来源--原型。

 
请公布修改后的指标代码,这对我来说是一片黑暗的森林,但我非常需要它!我自己搞不定。如果不难的话,请提供 mt5 的编译文件!!!!!
 
Siarhei Pekar:
请公布修改后的指标代码,这对我来说是一片黑暗的森林,但我非常需要它!我自己搞不定。如果不难的话,请提供 mt5!!!! 的编译文件!

Kodobase中的指标版本已更改为1.01版,并已做了修改,现在可直接从该指标页面下载。

 
Siarhei Pekar:

在考虑替换代码时,我设法删除了我的解释:

在 1.01 版中,ObjectsDeleteAll() 函数被另一个函数取代,该函数用于按名称前缀删除对象,运行速度更快,这有助于提高代码性能。

因此,在从第 1150 版正式过渡到另一个版本后(该版本发布时,ObjectsDeleteAll() 函数按名称前缀删除对象的功能尚未在文档中修复),最好将指标代码的版本更改为使用ObjectsDeleteAll() 的版本:


 

我更新了该指标的代码。其中包括,检测到并纠正了在图表上 开关显示指标线时 的错误(在关闭后开关显示线不起作用时存在问题)

当前版本:1.39

 

我发现在 MT5(1.39 版)的这一指标代码中,没有添加类似 MT4 指标代码中在 prev_calculated=0 时重新计算数值的附加功能。也就是说,在使用1.39 版时,可能会出现在 prev_calculated=0 时指标表中出现零值的情况。

对不起。

现在,我已将新版本(1.42) 发送给大家。

由于 CodeBase 版主很忙,更新可能不会很快发布,因此我暂时将更正后的版本附在这里。

 

非常感谢 CodeBase 版主。

代码已于今天下午更新至1.42

附/附注:我删除了上面附带的文件。

 

昨天发布了1.45 版更新(我现在才登录)。

主要内容:我替换了从图表中删除指标的功能--修正了其中一个输入参数的值。