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

 
Комбинатор :

변경할 때 tf.

표시기가 이전 TF의 버퍼에 남아 있으면 타이머에도 영향을 줄 수 있습니다. 글쎄, 그것은 금요일 섬망과 같은 것입니다.

더 예쁘다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MetaTrader 4 플랫폼 빌드 1065의 새 버전

세르게이 클리모프 , 2017.04.14 16:34

계정 간 전환 시 지표에서 _Digits 변수는 변경되지 않습니다.

 
fxsaber :
더 예쁘다
거기에 다른 디지털과 함께, 그 길을 따라 서기관은 도처에 전진하고 있습니다. 그는 5년 전에 한 터미널에서 그러한 계정을 교차시키겠다고 맹세했습니다.
 
fxsaber :
더 예쁘다

MT4의 정확한 순서를 말씀하시는 분들을 위한 글입니다.

MT4에서 모든 것이 그렇게 아름답지는 않다는 것을 보고 이해하십시오.

 
fxsaber :
순서는 동일합니다.


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

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

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

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

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

OnInit 및 OnDeinit 순서의 모호성 입증


 #property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {

   datetime t = TimeCurrent ();
   double pr  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

   ObjectCreate ( 0 , "InitDeinit" , OBJ_ARROW_THUMB_UP , 0 ,t,pr);
   ObjectSetInteger ( 0 , "InitDeinit" , OBJPROP_WIDTH , 15 ); 

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , "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);
  }
//+------------------------------------------------------------------+
파일:
 
Nikolai Semko :

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

타이머에 대한 토론이 있었습니다.
 
fxsaber :
타이머에 대한 토론이 있었습니다.

무슨 상관이야. 개체를 만드는 대신 Unit에 EventSetTimer를 넣고 Deunit에 개체를 삭제하는 대신 EventKillTimer를 넣을 수 있습니다. 그리고 불확실성은 이것으로 인해 감소하지 않을 것입니다. 설정된 타이머 는 이전 TF의 Deunit에 의해 종료되며 때로는 그렇지 않을 수도 있습니다. 그리고 더 나빠질 것입니다. 개체는 최소한 표시되지만 타이머는 표시되지 않습니다. 작동하거나 작동하지 않습니다.
 

어쩌면 그들은 이미 그것을 생각해 냈을 수도 있습니다. 나는 모든 것을 읽지 않았습니다. 표시기가 패널을 생성하는 경우 터미널의 전역 변수를 사용하고 초기화에서 해당 값을 1 증가시키고 그래픽 개체의 이름에 추가로 사용할 수 있습니다.

패널 설정을 저장하는 또 다른 작업이 있었습니다. 이를 위해 deinit에서 전역 터미널 변수를 만들었습니다. 문제에 대한 해결책은 간단합니다. 초기화에서 전역 터미널 변수를 만들고 그래픽 패널에서 매개변수가 변경되면 각각을 업데이트합니다. deinit에서는 초기화 해제의 이유가 표시기를 제거하는 경우에만 변수를 삭제합니다.

 
Dmitry Fedoseev

표시기가 패널을 생성하는 경우 터미널의 전역 변수를 사용하고 초기화에서 해당 값을 1 증가시키고 그래픽 개체의 이름에 추가로 사용할 수 있습니다.
목발이 전부입니다. 터미널에서 올바른 주문을 하기만 하면 됩니다. 먼저 이전 인스턴스를 초기화한 다음 새 인스턴스를 초기화합니다.
니콜라이 셈코 :


이 예제를 만들고 이 스레드를 읽지 않은 프로그래머는 어떻게 생각해야 할까요?

완전히 동의 해. Unreaders는 이 기능에 대해 알지 못하고 그것을 알아내려고 시간을 할애할 것입니다. 그리고 수백 명이 될 것입니다 ... 특히 초보자에게는 유감입니다.

버그를 한 번만 수정하면 됩니다.

 
Nikolai Semko :

무슨 상관이야. 개체를 만드는 대신 Unit에 EventSetTimer를 넣고 Deunit에 개체를 삭제하는 대신 EventKillTimer를 넣을 수 있습니다. 그리고 불확실성은 이것으로 인해 감소하지 않을 것입니다. 설정된 타이머 는 이전 TF의 Deunit에 의해 종료되며 때로는 그렇지 않을 수도 있습니다. 그리고 더 나빠질 것입니다. 개체는 최소한 표시되지만 타이머는 표시되지 않습니다. 작동하거나 작동하지 않습니다.
바보 같은 소리. 표시기 복사 타이머는 서로 관련이 없습니다.
 
elibrarius :
목발이 전부입니다. 터미널에서 올바른 주문을 하기만 하면 됩니다. 먼저 이전 인스턴스를 초기화한 다음 새 인스턴스를 초기화합니다.

완전히 동의 해. Unreaders는 이 기능에 대해 알지 못하고 그것을 알아내려고 시간을 할애할 것입니다. 그리고 그것은 수백 명의 사람들이 될 것입니다 ... 특히 초보자에게는 유감입니다.

버그를 한 번 수정하기만 하면 됩니다.


그게 무슨 일이야!
나는 개인적으로 초콜릿, t. 나는 대다수보다 나의 이점을 느낀다. 왜냐하면 나는 이 모든 것을 말로만이 아니라 행동으로 다룰 줄 압니다. 내 프로그램에 이미 패치를 적용하고 목발을 조였습니다.

개발자들이 이 "기능" 버그를 고집스럽게 고려하지 않는 이유를 이해할 수 없습니다.
예를 들어:

슬라바 :

지표는 의도한 목적에 맞게 사용해야 합니다.

즉, 차트 의 기호 -주기를 변경할 때 표시기의 OnInit 및 OnDeinit 실행 순서는 누구도 걱정하지 않아도 됩니다.

그러나 결국 내가 애니메이션 gif로 위에서 인용한 예에서 이 주제를 읽지 않은 프로그래머에게는 명백한 버그입니다! 부적절하게 행해진 것은 무엇입니까?