Init() 및 DeInit() 실행 순서 - 페이지 23

 
fxsaber :

원칙적으로 한 줄로 할 수 있습니다.

한 줄로 만들었습니다 .
 
Nikolai Semko :


글쎄, 그녀는 정확히 어디에 있습니까?

이 원시적인 예를 사용하십시오. 그리고 TF를 전환할 때 "고유성"을 이해하게 될 것입니다.

이 예에서는현재 시간 과 가격의 좌표를 사용하여 OnInit에서 개체가 생성됩니다. OnCalculate에서 이 개체는 가격과 함께 움직입니다.

OnDeinit에서는 단순히 (논리적) 제거됩니다.

TF를 전환하면 개체가 나타나거나 사라집니다.
왜 이런 일이 발생합니까?
때로는 이전 TF의 OnDeinit가 새 TF의 OnInit에서 이미 생성된 것을 삭제하기 때문입니다. 이것은 버그가 아닙니다! 이 예제를 만들고 이 스레드를 읽지 않은 프로그래머는 어떻게 생각해야 할까요?



패자의 원시적인 예를 사용하는 요점이 무엇입니까?

ALMOST 올바른 코드의 더 나은 예 사용

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots    0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {

   datetime t = TimeCurrent ();
   double pr  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   if ( ObjectFind ( 0 , "InitDeinit" ) < 0 )                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate ( 0 , "InitDeinit" , OBJ_ARROW_THUMB_UP , 0 ,t,pr);
     Print ( __FUNCTION__ , " создан InitDeinit" );
    }
    
   ObjectSetInteger ( 0 , "InitDeinit" , OBJPROP_WIDTH , 50 ); 
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if ( UninitializeReason () != REASON_CHARTCHANGE )      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete ( 0 , "InitDeinit" );
     ChartRedraw ( 0 ); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print ( __FUNCTION__ , "  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);
  }
//+------------------------------------------------------------------+
파일:
 
Alexey Viktorov :

ALMOST 올바른 코드의 더 나은 예 사용

그래서 같은. 개체는 표시기의 실제 복사본이 아니라 Deinit를 통해 삭제할 수 있습니다. 그리고 OnInit real은 이 이벤트 전에 실행됩니다.

그러나 이전 사본의 OnDeinit에서 새 사본의 OnInit로의 정보 전송을 표시하는 것이 훨씬 좋습니다. 사실 이것이 요점입니다.

 
fxsaber :
그래서 같은. 개체는 표시기의 실제 복사본이 아니라 Deinit를 통해 삭제할 수 있습니다. 그리고 OnInit real은 이 이벤트 전에 실행됩니다.
 if ( UninitializeReason () != REASON_CHARTCHANGE )
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

다른 모든 경우에는 컴퓨터의 전원 플러그를 뽑는 것을 제외하고 개체가 삭제됩니다.

 
fxsaber :


그러나 이전 사본의 OnDeinit에서 새 사본의 OnInit로의 정보 전송을 표시하는 것이 훨씬 좋습니다. 사실 이것이 요점입니다.

나는 간단한 솔루션이 당신의 장점이 아니라는 것을 오래전에 깨달았습니다. :-)))
 
Alexey Viktorov :

다른 모든 경우에는 컴퓨터의 전원 플러그를 뽑는 것을 제외하고 개체가 삭제됩니다.

특정 토론 문제에 대한 솔루션을 시연했습니다. 일반적인 문구는 다음과 같습니다
fxsaber :

이전 복사본의 OnDeinit에서 새 복사본의 OnInit로 모든 정보를 안정적으로 전송합니다 .

결과적으로 OnDeinit / OnInit 실행의 명확한 순서가 필요합니다. 나는 이것이 필요하지 않았지만 문제없이 솔루션 이라는 아이디어 를 구현했습니다.

 
fxsaber :
특정 토론 문제에 대한 솔루션을 시연했습니다. 일반적인 문구는 다음과 같습니다

결과적으로 OnDeinit / OnInit 실행의 명확한 순서가 필요합니다. 나는 이것이 필요하지 않았지만 문제없이 솔루션 이라는 아이디어 를 구현했습니다.

네, 상관없습니다. 그러나 왼발 새끼 발가락으로 오른쪽 귀를 긁는 것은 나를위한 것이 아닙니다. 이런 간단한 수표 대신에 " this " 라고 쓰세요... 뭐라고 불러야 할지 모르겠네요. 마조히즘은 존재할 권리가 있기 때문에 아마추어라고 하자 . 귀하의 프로그래밍 전문성을 충분히 존중합니다.

 
Alexey Viktorov :

그런 간단한 검사 대신 " "를 작성하십시오 ...

글쎄, 당신은 이 스레드에서 논의된 문제의 본질을 이해하지 못했습니다.
 
fxsaber :
글쎄, 당신은 이 스레드에서 논의된 문제의 본질을 이해하지 못했습니다.

나는 이해했지만 문제에 대한 토론을 당신의 능력(작지 않음)으로 번역했습니다.

그리고 결국 내 대답은 나쁜 사람 코드의 특정 예에 대한 것이지 On_Init 및 On_Deinit 실행 순서를 규제하는 데이터 전송의 예와 귀하의 능력에 대한 응답이 아닙니다.

대화를 계속하는 목적은 무엇입니까? 왼발 새끼 발가락으로 오른쪽 귀를 긁는 것이 매우 즐겁다고 나에게 설득하려는 것인가? 아니면 다른 목적?

 
Alexey Viktorov :

아니면 다른 목적?

재작업한 예제는 논의 중인 문제와 완벽하게 맞지 않았습니다. UninitializeReason 솔루션 이 없는 다른 예를 보여주는 것이 가능합니다.