표시기의 OnDeinit - 페이지 7

 

개발자 여러분, 어딘가에 100% 오류가 있습니다.

 void OnDeinit ( const int reason)
{
 //Comment("");
 Comment ( ArrayInitialize (body_down, EMPTY_VALUE ), "  " ,body_down[ 0 ], "  " ,body_down[ 1 ], "  " ,body_down[ 2 ], "  " ,body_down[ 3 ]);
}

댓글이 터미널을 닫고 1분 후에 열어준 스크린샷을 보세요.

초기화된 요소의 수와 버퍼의 첫 번째, 두 번째, 세 번째 및 네 번째 요소가 비어 있다는 사실입니다.

표시기는 0번째 버퍼만 계산합니다. 그렇다면 왜 촛불이 2개일까요?


 
네. ArrayInitialize 가 아무 것도 반환하지 않는다고 영어 도움말에도 나와 있습니다.

 
eevviill :

개발자 여러분, 어딘가에 100% 오류가 있습니다.

댓글이 터미널을 닫고 1분 후에 열어준 스크린샷을 보세요.

초기화된 요소의 수와 버퍼의 첫 번째, 두 번째, 세 번째 및 네 번째 요소가 비어 있다는 사실입니다.

표시기는 0번째 버퍼만 계산합니다. 그렇다면 왜 촛불이 2개일까요?


새로운 막대를 분석할 때 막대의 수를 확인하지 않고 시간만 확인하는 것으로 제한하기 때문입니다. 터미널이 시작되거나 작동 중 서버와의 연결이 중단되면 누락된(전체 기록까지) 막대가 도착하기 전에 틱이 옵니다. 이 틱에 대해 새로운 양초가 생성되지만, 서버에서 다운로드되어 제자리에 삽입되는 터미널의 히스토리와 그 사이에 갭(누락 히스토리)이 있고, 막대의 개수를 분석하지 않기 때문에, 다음 계산에서 새로운 막대 번호가 있다고 생각할 것입니다. 바로 그 때 두 번째 촛불이 나타납니다. 새 막대를 열면 사라집니다.
 
mql5 :
새로운 막대를 분석할 때 막대의 수를 확인하지 않고 시간만 확인하는 것으로 제한하기 때문입니다. 터미널이 시작되거나 작동 중 서버와의 연결이 중단되면 누락된(전체 기록까지) 막대가 도착하기 전에 틱이 옵니다. 이 틱에 대해 새로운 양초가 생성되지만, 서버에서 다운로드되어 제자리에 삽입되는 터미널의 히스토리와 그 사이에 갭(누락 히스토리)이 있고, 막대의 개수를 분석하지 않기 때문에, 다음 계산에서 새로운 막대 번호가 있다고 생각할 것입니다. 바로 그 때 두 번째 촛불이 나타납니다. 새 막대를 열면 사라집니다.

그리고 무조건 터미널이 닫혀 있을때 리셋이 되는건 상관없나요?

 

바실리 바의 수 를 인쇄하는 테스트 표시기를 구동합니다.

 //+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int       rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   if (NewBar( PERIOD_CURRENT , lb))
    {
     Print ( "rates_total = " , rates_total);
     rates_ = rates_total;
    }
   return (rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//if(reason == REASON_CLOSE)
Print ( "OnDeinit сработал " , rates_);
}

bool NewBar( int tf, datetime &lastbar)
{
   datetime curbar = iTime( _Symbol , tf, 0 );
   if (lastbar != curbar)
    {
     lastbar = curbar;
     return ( true );
    }
   else return ( false );
} //******************************************************************|

다음은 로그에 인쇄된 내용입니다.

 0        22 : 52 : 04.765     Custom indicator Test\test EURUSD.z,M1: loaded successfully
0        22 : 52 : 04.795     test EURUSD.z,M1: initialized
0        22 : 52 : 04.795     test EURUSD.z,M1: rates_total = 75183
0        22 : 52 : 11.902     test EURUSD.z,M1: rates_total = 75184
0        22 : 52 : 28.712     test EURUSD.z,M1: uninit reason 9
0        22 : 52 : 28.712     test EURUSD.z,M1: OnDeinit сработал 75184
0        22 : 52 : 28.832     Custom indicator test EURUSD.z,M1: removed
0        22 : 57 : 10.366     Custom indicator Test\test EURUSD.z,M1: loaded successfully
0        22 : 57 : 10.396     test EURUSD.z,M1: initialized
0        22 : 57 : 10.396     test EURUSD.z,M1: rates_total = 75184
0        22 : 57 : 14.972     test EURUSD.z,M1: rates_total = 75185
0        22 : 57 : 59.167     test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0        22 : 58 : 34.237     test EURUSD.z,M1: uninit reason 1
0        22 : 58 : 34.237     test EURUSD.z,M1: OnDeinit сработал 75190
0        22 : 58 : 34.247     Custom indicator test EURUSD.z,M1: removed


문제가 어디에 있는지 알 수 있을지도...

 
eevviill :

개발자분들의 간단한 답변 부탁드립니다.

터미널이 닫힐 때 차트에 첨부된 프로그램에서 DeInit() 함수가 실행됩니까?

엄밀히 말하면 아니

OnDeinit가 실행됩니다. DeInit는 OnDeinit에서 명시적으로 호출하는 경우에만 실행됩니다.

이전 deinit 함수를 참조하는 경우 함수 이름이 대소문자를 구분한다는 점도 염두에 두십시오. 즉, DeInit는 알 수 없는 함수이고, deinit는 초기화 해제를 위한 표준 진입점입니다(OnDeinit처럼).

 
eevviill :

그리고 무조건 터미널이 닫히면 리셋이 되는건가요?

무슨 상관이야? 터미널이 닫히면 이 버퍼가 필요하지 않습니다. 왜냐하면 OnDeinit 직후에 발생하는 프로그램이 언로드될 때 버퍼가 즉시 해제되기 때문입니다.

기간을 변경해 보십시오. OnDeinit는 작동하고 버퍼는 유지되지만(이 경우 프로그램이 언로드되지 않기 때문에) 아무도 "과거 생활"의 내용을 보장하지 않습니다.

마지막으로 설명서를 읽으십시오! https://docs.mql4.com/ru/runtime/runninghttps://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo :

무슨 상관이야? 터미널이 닫히면 이 버퍼가 필요하지 않습니다. 왜냐하면 OnDeinit 직후에 발생하는 프로그램이 언로드될 때 버퍼가 즉시 해제되기 때문입니다.

기간을 변경하려고 합니다. OnDeinit는 작동하고 버퍼는 유지되지만(이 경우 프로그램이 언로드되지 않기 때문에) 아무도 "과거 생활"의 내용을 보장하지 않습니다.

마지막으로 설명서를 읽으십시오! https://docs.mql4.com/ru/runtime/runninghttps://docs.mql4.com/ru/runtime/event_fire#deinit

즉, 내 경우에는 차트를 다시 열 때 이미 버퍼 분할이 발생합니까?
 
eevviill :
즉, 내 경우에는 차트를 다시 열 때 이미 버퍼 분할이 발생합니까?

버퍼 분할이 없습니다.

이것이 자신의 버퍼를 채우는 방법입니다. 렌더링 시 처음으로, 데이터 일부가 도착할 때 두 번째. 동일한 Time[0] 값으로 작업하는 두 번

 
stringo :

버퍼 분할이 없습니다.

이것이 자신의 버퍼를 채우는 방법입니다. 렌더링 시 처음으로, 데이터 일부가 도착할 때 두 번째. 동일한 Time[0] 값으로 작동하는 두 번

확인.

그런 다음 영어 도움말을 수정하면 됩니다.

ArrayInitialize 가 아무 것도 반환하지 않는다고 영어 도움말에도 나와 있습니다.

사유: