Init()和DeInit()执行顺序 - 页 20

 
Комбинатор:

当你改变f。

如果指标的缓冲区里有来自旧时间框架的垃圾,它也可能影响到计时器。

更加美丽

关于交易、自动交易系统和策略测试的论坛

新版本的MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

在账户之间切换时,指标中的_Digits变量不会改变。

 
fxsaber:
它更漂亮。
由于所有不同的数字,似乎都在到处跑,我在大约5年前就不再在同一个终端机上跨越这样的账户。
 
fxsaber:
它更漂亮。

这是为那些谈论MT4中适当的一致性的人准备的。

观察并了解到,在MT4中并非一切都那么美好。

 
fxsaber:
队列是毫不含糊的。


那么,哪里是毫不含糊的呢?

试试这个原始的例子。在切换TF时,你会明白 "独特性"。

在这个例子中,一个带有当前时间 和价格坐标的对象在OnInit中被创建。在OnCalculate中,这个对象与价格一起移动。

在OnDeinit中,它被简单地(逻辑地)删除。

当我们切换TF时,该物体出现,然后消失。
为什么会发生这种情况?
因为有时 旧TF的OnDeinit会删除在新TF的OnInit中已经创建的东西这不是一个错误!创建这个例子的程序员应该怎么想,而没有阅读这个分支?

展示OnInit和OnDeinit序列的模糊性


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"InitDeinit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
附加的文件:
 
Nikolai Semko:

那么,她在哪里一心一意地工作。

那里谈到了定时器。
 
fxsaber:
那里提到了定时器。

有什么区别。你可以把EventSetTimer放在Unite,而不是创建对象,把EventKillTimer放在Deunite,而不是删除对象。而这不会减少不确定性,因为设定的计时器 会被老TF的Deunite杀死,而有时不会。而且情况会更糟糕,因为至少你可以看到物体,但你无法看到计时器--无论它是否工作。
 

也许他们已经发明了它,还没有读完。如果指标创建了面板,你可以使用终端的全局变量,在init中把它的值增加1,并把它作为图形对象名称的加法。

我的任务是不同的 - 保存面板的参数,为此我在deinit中创建了终端的全局变量。解决方案很简单--在inite中创建终端的全局变量,并在图形面板的参数变化时更新每个变量。如果去初始化是由移除指标引起的,则只在deinit中删除变量。

 
Dmitry Fedoseev

如果指标创建了一个面板,你可以使用终端的一个全局变量,将其值增加1,并将其作为图形对象名称的附录。
这些都是拐杖。你只需要在终端做出正确的订单,就可以了。首先取消前一个实例,然后才启动新的实例。
尼古拉-森科


创建这个例子的程序员一定在想什么,而且没有看过这个主题?

我完全同意。非阅读者不会知道这个功能,他们会消磨时间,试图弄清楚这个问题。而这将是数百人的事......特别是那些初学者。

你只需要修复一次错误,就可以了。

 
Nikolai Semko:

有什么区别。你可以把EventSetTimer放在Unite,而不是创建对象,把EventKillTimer放在Deunite,而不是删除对象。这不会减少不确定性,因为设定的定时器 会被老TF的Deunite杀死,而有时不会。而且情况会更糟糕,因为至少你可以看到物体,但你无法看到计时器是否工作。
这听起来很傻。指示器副本的定时器相互之间没有任何关系。
 
elibrarius:
这都是拐杖。你只需要在终端做出正确的命令,就可以了。首先取消上一个实例,然后才初始化新的实例。

我完全同意。非阅读者不会知道这个功能,他们会消磨时间,试图弄清楚这个问题。而这将是数百人的事...特别对不起初学者。

你所要做的就是修复一次错误,就可以了。


这就是我所说的!
我个人正在努力,因为我觉得我比大多数人有优势,因为我知道如何处理这一切,不仅仅是在语言上,而且在行动上。我已经做了补丁,并在我的方案中加入了拐杖。

我只是不明白为什么开发人员顽固地拒绝将这一 "功能 "视为一个错误。
例如。

斯拉瓦

指标的使用应符合其预期目的。

换句话说,当图表 符号周期发生变化时,OnInit和OnDeinit指标的执行顺序对任何人来说都不应该关心。

但在我上面的gif动画的例子中,对于一个没有读过这个主题的程序员来说,这绝对是一个bug!哪些事情没有按照预定目的去做?