Init()和DeInit()执行顺序

 

大家好!

我面临以下问题

我有一个指标或专家顾问。

其中有两个函数 - Init()和DeInit()。

当我改变TF(时间框架)时,这些函数的执行顺序是什么?

我知道,当我启动或附加指标 时,Init() 应该起作用。

当从图表中删除它时,它应该运行DeInit()。

当改变TF时,首先当前TF的DeInit( )应该工作,然后新TF的Init() 应该工作。

然而,它并不总是按照这个顺序执行,这就破坏了编写程序的逻辑。

我附上一个指标和日志的样本。

请告知谁解决了这个问题,或者干脆忘了这个问题吧!

附加的文件:
ERROR.mq5  2 kb
Log.txt  1 kb
 

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

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

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

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
当你改变时间框架时,OnInit每次都会被调用,造成一些不便。
 
Slawa:

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

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

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


谢谢你的反馈

关于 "逻辑破坏"

我写了一个指标,用它自己的绘图类型DRAW_CANDLES取代了主图表(蜡烛图)。

重点是删除主价格图表,只显示我的图表。

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

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


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

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


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


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

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

这里有一个 "逻辑错误 "的 例子。


PS: (((阅读文档https://www.mql5.com/ru/docs/runtime/running ))

如果你改变专家顾问所连接的图表的符号或时间框架,专家顾问不会被卸载和加载。在这种情况 下, 旧符号/时间线的OnDeinit() 和新符号/时间线的OnInit()(如果有的话)的处理程序被持续 调用,全局变量和静态变量 的值不会被重置。 在初始化(OnInit())完成之前收到的所有EA的事件都会被跳过。


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


关于。

"一个新的指标副本被创建,对前一个副本一无所知"

为什么然后DeInit会删除在新的Init副本中创建的对象。如果它只是一个副本。



 
Petros Shatakhtsyan:
当时间框架改变时,OnInit每次都被调用,造成一些不便。


每次调用OnInit是什么意思?

OnInit的作用是什么 - 一次性初始化所有变量和参数

比如说

我想写一个指标,在当前时间框架的图表上创建一个文本标记。

当删除指标时,它将从图表中删除这个文本标记。

而当改变TF时,它会将其内容更新为一个新的内容(通过删除旧的内容并创建一个新的内容)。

我们得到什么

有几次我们改变了TF,文本标记已经消失了。(所以一开始OnInit和DeInit已经行动了,这就删除了这个标签)。

然后又换了几次TF,它就出现了。

这是不对的。

 
nmaratr:

如果它们是图形对象,它们属于聊天室,可以被运行在该聊天室上的任何软件访问。
 
Alexander Bereznyak:

如果它们是图形对象,它们属于聊天,可以被运行在该聊天上的任何程序访问。


那么,如何才能解决这个问题呢?(有谁拿到了吗??)

或者按原样接受。为了加快计算速度,有可能以非连续的方式执行命令。

什么是与文件相违背的


当改变一个符号或图表的时间框架时,专家顾问被附加在其中,专家顾问将不会被卸载和加载。在这种情况下

依次

旧符号/时间线的处理程序OnDeinit() 和新符号/时间线的处理程序OnInit()(如果有的话)被调用。

 
nmaratr:


那么,这个问题能否得到解决呢?(它对任何人都有效吗?)



我加入了这个话题的作者。这个问题真的不是空穴来风。而且非常具体。
我很久以前就发现了这个问题。我早在2016年6月就联系了servicedesk,提出了一个与本主题作者绝对相似的例子。他们没有理会--这仍然是一个开放的话题。

向服务部门提出申请

当然,我在改变TF时在指标中做了一个参数转移,在这上面花了很多时间。但我不想用钻石做一个简单的任务。
但是开发人员,请实现在指标中创建特殊的全局变量的可能性,在时间框架变化时不会重新初始化。在Expert Advisors中,重新初始化不会在TF变化时发生,而在指标中会发生。如果有可能不在指标中重新初始化一些变量和数组,那么OnInit和OnDeinit的同步就不会发生,对程序员来说就会有新的有趣的机会。我不认为这种变量未初始化的可能性会影响程序的安全性。

它是用来做什么的?
有很多情况。

比如说。
-当我启动指标时,我对独立于TF的变量、索引数组、数据数组进行计算,它们可能相当长,而且体积庞大。问题是,为什么我每次更换TF时都要这样做。
- 我不能通过参数窗口来改变指标参数,但为了方便和清晰,直接从图表中用鼠标操作(你可以看到和使用这个指标,它以最复杂的方式实现了这一点)。而且每次更换TF时,设置都不会丢失。

 

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

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

 
Alexey Viktorov:

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

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

那么就是这样了!?
我一直在试验并充分使用这个原因代码(REASON_CHARTCHANGE)。如果所有的变量都被重新设置为原始状态,并且OnDeinit可以在新的TF的OnInit之后执行,那还有什么用呢?
原因: