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

 
Alexey Viktorov:

这个问题的解决就像两个手指一样...你知道吗...

在OnDeinit中,在删除对象之前,有必要对去初始化的原因 设置条件...如果不是周期性变化,那么该对象将被删除。就这样了...


是的,我不能在TF变化时删除一些对象或资源,我甚至可以通过对象-资源保存一些小数组,并在资源中写入关于TF变化的信息,但重点是我的单元可能在新的时间范围内执行后开始执行,我应该如何通知单元,时间范围已经改变,应该读取旧的数据?这不是错的吗?
 
Slawa:

什么样的逻辑是被宠坏的?

当你改变时间框架时,就会创建一个新的指标副本,对前一个副本一无所知。在一定时间内(非常短),指标的两个副本都是平行存在的。然后卸下之前的副本。

阅读文件https://www.mql5.com/ru/docs/runtime/running


我已经阅读了链接的描述,但没有发现这样的信息,就像你给的那样。如果真的是这样,对指标开发者来说是一个很大的问题。当你改变时间框架时,采用这样的逻辑来重新加载指标,这是非常奇怪和非常糟糕的。为什么我们需要在内存中存在同一指标的两个副本?谁从中受益?它能带来什么?更合理的做法是,完成指标的一个副本的执行,卸载它,然后才加载下一个副本。
 
Nikolai Semko:
这就是全部!?
我一直在做实验,并尽可能地使用这个原因代码(REASON_CHARTCHANGE)。如果所有的变量都被重新设置为原始状态,OnDeinit可以在一个新的TF的OnInit之后执行,那还有什么用呢?
我只读过关于在去初始化时删除一个对象的文章,而且只是对这个问题作出回应。保存过去的计算结果会更复杂。而显然,这个问题永远不会得到解决。斯拉瓦回答了这个问题,新的指标,新的计算方法。而这是公平的。
 
Alexey Viktorov:
斯拉瓦已经回答了这个问题,新的指标,新的计算方法。而这是公平的。
关键是,指标是相同的,但时间框架是新的。而问题是关于单元和去单元的非同步化,即出现了相反的(非逻辑的)执行顺序,而有时是符合逻辑的。对于一个程序员来说,没有什么比浮动错误和逻辑更糟糕的了。
 
Alexey Viktorov:
而显然,这个问题永远不会得到解决。

我对开发团队有信心,他们是伟大的人,已经做了令人难以置信的大量工作,并将做得更多。我只是还没来得及做。诚然,你总是要从他们那里得到钟爱的反馈。:))
我的任务是说服他们需要这样做。虽然我不排除他们会说服我最好不要这样做,但也许我不了解一些情况。
 
Nikolai Semko:

我对开发团队有信心,他们是伟大的人,已经做了令人难以置信的大量工作,并将做得更多。我只是还没来得及做。但我总是要用手鼓从他们那里得到反馈。:))
我的任务是说服他们需要这样做。虽然我不排除他们会说服我最好不要这样做,但也许我不了解一些情况。


Slawa,文档中的"图书馆不处理任何事件 " 这句话是什么意思

非常模糊

 
nmaratr:

-当Inite 将主图的颜色设置为透明。

我自己画的图表(根据我的参数)。


我想让它在删除我的指标后恢复主图表的颜色

-在DeInit中,我恢复了主图表的颜色


改变TF 时,我的意思是首先DeInit(恢复颜色),然后Init(回到透明状态)。


命令的执行不是连续的;定期地,当改变TF

定期将主图(恢复了颜色)叠加在我的指标上。

下面是一个 "逻辑分解 " 的例子。


也许可以尝试给图形对象分配TF期,作为其名称前缀的一个组成部分。

然后应用这样的东西。

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

-当Inite 将主图的颜色设置为透明。

我自己画的图表(根据我的参数)。


我想让它在删除我的指标后恢复主图表的颜色

-在DeInit中,我恢复了主图表的颜色


改变TF 时,我的意思是首先DeInit(恢复颜色),然后Init(回到透明状态)。


命令的执行不是连续的;定期地,当改变TF

定期将主图(恢复了颜色)叠加在我的指标上。

例如,这里有一个 "逻辑分解"

当然,如果所有的事情都按逻辑顺序发生就更好了,但由于我们必须用我们所拥有的东西来工作,我们可以把主图的颜色 移到OnCalculate,并检查当前值。
 
Nikolai Semko:
这就是全部!?
我一直在做实验,并尽可能地使用这个原因代码(REASON_CHARTCHANGE)。而如果所有的变量都被重新设置为原始状态,并且OnDeinit可以在新的TF的OnInit之后执行,那又有什么用?


尝试将终端更新到1065版本。在以前的版本中,在时间框架变化时,会出现重新初始化的错误。可能有帮助 :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


尝试将终端更新到1065版本。以前的版本仅仅通过改变时间框架就会出现重新初始化的错误。可能会有帮助 :)

https://www.mql5.com/ru/forum/187690

我们谈论的是MT5
原因: