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

 

改变时间框架时解决问题的选项


如果你刚刚改变了TF

1)可能没有必要删除图形对象

2) 也许没有必要重新初始化一些变量


static int ChanGeTF = 0;  // Признак смены ТФ , держим как статическую переменную в памяти эксперта
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if( ChanGeTF == 0) // при первом вызове код в OnInit полностью обрабатывается  , но не отработает если просто менялся ТФ
     {
      // тут сформируем переменные для нашего эксперта которые отработают  при первом старте экперта
      // возможно сформируем графические объекты 
     }
    else
    {
      ChanGeTF=0;  
     // сюда попадет при смене ТФ 
     // а формировать ничего уже не будем ,  у нас все сформировано и мы не желаем делать инициализацию переменных
     // но если необходимо - что то обработаем в код OnInit 
    }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));   // пишем в лог причину входа в DeInit - очень полезная информация
   if ( REASON_CHARTCHANGE != _UninitReason )
     {
      // сюда не попадаем , если произошла смена ТФ
      // удалим графические объекты - для полноценного завершения работы эксперта 
      // 
     }
    else
    {
      // сюда попадем если просто произошла смена ТФ 
      // сделаем то что нам интересно - но при этом - к примеру - не будем удалять с графика графические объекты
         ChanGeTF=1; 
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
  {
   string text="";
//--- 
   switch(reasonCode)
     {
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";
         break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";
         break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
//--- 
   return text;
  }

 
Yuriy Zaytsev:

改变时间框架时解决问题的选项


如果你刚刚改变了TF

1)可能没有必要删除图形对象

2) 也许没有必要重新初始化一些变量


唯一的问题是,静态在指标中不起作用 它被重置。它 在专家顾问中有效,但在指标
 
Yuriy Zaytsev:

改变时间框架时解决问题的选项


如果只是有一个时间框架的变化

1)也许你不应该删除图形对象

2) 也许你不应该重新初始化任何变量



你的代码将无法工作。

再一次。

你不能控制Inite中Deinit的结果,因为Deinit可能会在Inite完成后发挥作用。

 
Sergey Chalyshev:


你的代码 将无法工作

再一次。

你不能在Inite中控制Deinit的结果,因为Deinit可以在Inite运行后被触发。

你是说 在指标中不起作用? 它在专家顾问系统中起作用。
 
Yuriy Zaytsev:
你的意思是它在指标中不起作用? 在专家中它起作用。
专家顾问不存在任何问题。这个话题只是关于指标。仔细阅读。
 
Sergey Chalyshev:

如何在一个指标中处理这些取消初始化的代码,这些代码有什么作用?因为没有可能在指标中等待,所以睡眠不起作用。

你没有读过我写的东西几遍吗?

指标中没有办法。你不可能从一开始就用五个人做这件事。因为你下载的是一个完全新的指标副本,并带有所有后果。

 
Nikolai Semko:
专家是没有问题的。这个话题只是关于指标。仔细阅读。

我读了第一个帖子。
它说,我引用一下。
"书面指示人或共同评估人"
 
Yuriy Zaytsev:

我读了第一个帖子。
它说,我引用一下。
"由指标或共同作者撰写"。
这就是关于EA的结束。
在写东西之前,把自己限制在阅读第一篇帖子上并不总是明智的。
 
Nikolai Semko:
这就是专家顾问的结束。
在写任何东西之前,限制自己阅读第一篇帖子并不总是明智的。

说什么是合理的,什么是不合理的,这是不太正确的。
在写之前,我对这一主题做了一个小小的梳理。

我在主题中粘贴了一个代码样本,现在阅读主题的人可以看到,这种机制在指标中不起作用,在EA中起作用。

该话题的作者至少得到了一个问题的答案,而且是用一个例子。
 
Yuriy Zaytsev:

嗯,说什么是合理的,什么是不合理的,其实并不准确。
在写作之前,我对这个问题做了一点研究。

现在读过该主题的人可以看到,这种机制在指标中不起作用,在EA中起作用。
当然,谢谢你的代码。它在专家顾问系统中运行良好,因为当我们改变TF时,变量不会被重新初始化,而在指标中,它们会被重新初始化。如果你真的想帮忙提供建议,请不要那么匆忙地再 "跑 "一次。