文章 "MQL5 细则手册:指标子窗口控件 - 按钮" - 页 6

 
tol64:

不一定是每秒,在另一个事件上有另一种选择(已经讨论过)。请举例说明我 如何做到的。) Expert Advisor 需要这个事件,而指标不需要。这样会更清楚。

附注 :更正。我犯了一个错误。))您的变体并不更正确。完全不合适。因此,最好根据上述条件举例说明。

如果指标不需要该事件,它就不会处理。此外,EA 不应该禁用它不需要的事件。可以打开,但不能关闭。因为什么事件通过他的窗口以及谁可能需要这些事件都与他无关。

 
C-4:

如果指标不需要该事件,它就不会处理。此外,EA 不应该禁用它不需要的事件。他可以打开,但不能关闭。因为什么事件通过他的窗口以及谁可能需要这些事件,都与他无关。

问题的关键在于,这个事件可以不处理(你可以忘掉它)。但这并不意味着OnChartEvent() 函数中的事件队列不会被某个时刻不需要的事件填满。

这意味着每分钟会有成千上万个不必要的事件发生。如果图表上有多个程序呢?不是一个参数?

如果每秒钟检查一次事件是否启用,并在当前未启用但需要时启用它,那么浪费的资源就会大大减少。这也不是理由?那就按你的方法来。

我没有更多的论据了。我会坚持我的观点,因为我还没有听到任何可以改变我观点的东西。

很好。那么我有一个问题要问那些认为这个事件不需要被启用它的程序禁用的人。

为什么?)

那就是

1.为什么要留下不需要的东西(每分钟成千上万的事件)?

2.(换一种说法)既然可以少花钱,为什么还要多花钱?

我个人完全不喜欢 "如果不需要某个事件,就不处理它 "这样的选项。你不能禁用一个,也不能禁用另一个,你能从中得到什么呢?

 

亲爱的文章作者,你不解释一下你的产品的内部矛盾是徒劳的,而你正试图解决这些矛盾并教导 "初学者"。

因此,作者展示了可能会扰乱其指标正确工作的滑动时刻。很好,现在 "初学者 "已经很清楚了:

  1. 从图表中删除任何程序时,都应考虑到不要损害其他程序。
  2. 在任何情况下,您都不应该在一个图表上放置相互冲突的程序,但最好将它们放置在相关符号图表的其他窗口中。如果有人不知道这一点,那么一个符号就可以打开足够多的图表窗口
  3. 每个图表都有自己的固有属性。因此,更改这些属性会影响其他程序的正常工作。在任何情况下都不能这样做!
  4. 必须做到 "万无一失"。也就是说,如果指标或其他程序形式的病毒试图更改您程序中使用的图表属性,您必须进行检查。如果经常出现这种情况,则应删除病毒!
  5. 金融市场程序中的错误往往会导致巨大损失。请记住
 
tol64:

1.为什么要留下不需要的东西(每分钟成千上万的事件)?

2.(换一种说法)既然可以少花钱,为什么还要多花钱?

我个人完全不喜欢 "如果不需要某个事件,就不处理它 "这样的选项。你不能禁用一个,也不能禁用另一个,你能得到什么呢?

你会得到一个完全受控的代码。

你强调性能,但启用这个事件后性能是否会下降很多?为了回答这个问题,我专门编写了一个简单的智能交易系统 来测试这个事件。通过测试不同的组合,我得到了下表:

模式
CPU 负载百分比
启用 EVENT_MOVE_MOUSE,在智能交易系统中处理该事件。9%
启用 EVENT_MOVE_MOUSE,禁用 Expert Advisor 中的该事件处理。
6%
EVENT_MOVE_MOUSE 已关闭,EA 中该事件的处理已关闭。
5-6%
智能交易系统关闭。图表关闭。将鼠标移至 MetaTrader 窗口上即可。
5-6%

如您所见,只有在实际处理该事件时,实际负载才会增加。值得注意的是,从 CPU 负载来看,无论是否启用订阅该事件,MetaTrader 都会跟踪鼠标位置。一般来说,节省假设资源是没有意义的,因为无论如何都会执行鼠标跟踪。

测试 Expert Advisor 代码:

//+------------------------------------------------------------------+
//|测试。mq5
//| 2013 年 MetaQuotes 软件公司版权所有。
//|http://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "Edit", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, "Edit", OBJPROP_XSIZE, 400);
   //根据我们的需要开启或关闭事件
   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, false);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   //如果不需要处理接收到的事件,请在该代码块中添加注释。
   if(id == CHARTEVENT_MOUSE_MOVE)
   {
      string label = (string)lparam + " " + (string)dparam + " " + sparam;
      //printf(sparam);
      ObjectSetString(0, "Edit", OBJPROP_TEXT, label);
      ChartRedraw(0);
   }
}
Знакомство с MQL5: написание простого советника и индикатора
Знакомство с MQL5: написание простого советника и индикатора
  • 2010.03.16
  • Denis Zyatkevich
  • www.mql5.com
В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.
 

1.应始终考虑堆栈中遗漏事件的情况。如果在遗漏事件的情况下会发生重要事件,那就非常糟糕了。

2.根据自己的需要定制图表是很糟糕的。这就像在自动交易机上交易而不使用魔法一样。

 
DC2008:

亲爱的文章作者,你不解释一下你的产品的内部矛盾是徒劳的,而你正试图解决这些矛盾并教导 "初学者"。

因此,作者展示了可能会扰乱其指标正确工作的滑动时刻。很好,现在 "初学者 "已经很清楚了:

...

你可以再想出 20 条规则来证明你的自大,然后你一定会迷惑自己,"帮助 "初学者。在这种情况下,矛盾和误解被你观察到了。)

C-4:

您将得到一个完全受控的代码。

...

当你控制它时,它就会受到控制。在这种情况下,您建议不选中所有内容,即不选中暂时不需要但可以经常重现的事件。在简单的示例中,这可能并不明显。也许在更复杂的程序中,您会发现有必要禁用一切不需要的功能。

 
TheXpert:

1.应始终考虑堆栈中遗漏事件的情况。如果在遗漏事件的情况下会发生重要事件,那就非常糟糕了。

...

比如事件队列溢出?
 

tol64:

请问,我是否打扰了您写另一篇教程或食谱?

如果没有,那就让我们继续讨论你那篇关于指标子窗口控制的文章吧。 所以,你提供了一个如何在指标中制作便捷菜单的大众解决方案(或想法)。很好,这篇文章的目的很有价值!但是,"初学者 "程序员该如何使用这些工具呢?在哪里放置自定义函数?请举例说明。同时解释一下,要使用 5 个按钮,需要在代码中修改哪些内容?就当是初学者的问题吧。

 
tol64:
比如当事件队列溢出时?
是的
 
DC2008:
你确定你文章中的每句话都是完美无缺的吗?