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) 일부 변수를 다시 초기화하면 안 됩니다.


유일한 질문은 정적 이 표시기에서 작동하지 않고 재설정된다는 것입니다. EA에서는 작동하지만 지표에서는 작동하지 않습니다.
.
 
Yuriy Zaytsev :

기간 변경 시 문제 해결 옵션


단순히 TF에 변화가 있었다면

1) 그래픽 개체를 삭제 하면 안 됩니다.

2) 일부 변수를 다시 초기화하면 안 됩니다.



코드가 작동하지 않습니다.

다시 한 번 반복합니다.

Init에서는 Init가 완료된 후에 Deinit가 작동할 수 있기 때문에 Deinit의 결과를 제어할 수 없습니다.

 
Sergey Chalyshev :


코드 가 작동하지 않습니다.

다시 한 번 반복합니다.

Init에서는 Init가 완료된 후에 Deinit가 작동할 수 있기 때문에 Deinit의 결과를 제어할 수 없습니다.

표시기에서 작동하지 않는다는 뜻입니까? 그는 전문가에서 일합니다.
 
Yuriy Zaytsev :
표시기에서 작동하지 않는다는 뜻입니까? 그는 전문가에서 일합니다.
전문가에게는 문제가 없습니다. 이 스레드는 지표에 관한 것입니다. 주의 깊게 읽으십시오.
 
Sergey Chalyshev :

그러면 표시기의 Inite에서 이러한 초기화 해제 코드를 처리하는 방법은 무엇입니까? 이 코드는 무엇을 위한 것입니까? 결국 표시기에서 기다릴 가능성은 없으며 절전 모드가 작동하지 않습니다.

내가 몇 번 쓴 것을 읽지 않았습니까?

지표에는 없습니다. 처음부터 상위 5위 안에는 아무것도 없었습니다. 표시기의 완전히 새로운 사본이 모든 후속 결과와 함께 로드되기 때문에

 
Nikolai Semko :
전문가에게는 문제가 없습니다. 이 스레드는 지표에 관한 것입니다. 주의 깊게 읽으십시오.

첫 번째 글을 읽었습니다.
그것은 말하고 나는 인용한다:
"서면 지표 또는 협력자"
 
Yuriy Zaytsev :

첫 번째 글을 읽었습니다.
그것은 말하고 나는 인용한다:
"서면 지표 또는 협력자"
이것이 프로 어드바이저가 끝나는 곳입니다.
무언가를 작성하기 전에 첫 번째 게시물만 읽는 것으로 제한하는 것이 항상 합리적인 것은 아닙니다.
 
Nikolai Semko :
이것이 프로 어드바이저가 끝나는 곳입니다.
무언가를 작성하기 전에 첫 번째 게시물만 읽는 것으로 제한하는 것이 항상 합리적인 것은 아닙니다.

글쎄요, 무엇이 합리적이고 무엇이 합리적이지 않다고 말하는 것은 전적으로 옳지 않습니다.
주제에, 나는 쓰기 전에 달렸다.

주제에 코드 예제를 넣었습니다. 이제 주제를 읽는 사람들은 제안된 메커니즘이 표시기에서는 작동하지 않지만 어드바이저에서는 작동한다는 것을 알 수 있습니다.

주제 작성자는 질문에 대한 답변과 예를 하나 이상 받았습니다.
 
Yuriy Zaytsev :

글쎄요, 무엇이 합리적이고 무엇이 합리적이지 않다고 말하는 것은 전적으로 옳지 않습니다.
주제에, 나는 쓰기 전에 달렸다.

주제에 코드 예제를 넣었습니다. 이제 주제를 읽는 사람들은 제안된 메커니즘이 표시기에서는 작동하지 않지만 어드바이저에서는 작동한다는 것을 알 수 있습니다.
물론 코드에 감사드립니다. Expert Advisors를 통해서만 모든 것이 정상입니다. TF를 변경할 때 변수의 재초기화는 없지만 지표에서는 그렇게 하기 때문입니다. 정말 조언에 도움이 되고 싶으시다면 성급하게 다시 "달리세요".