초기화 시 ChartNavigate

 

ChartNavigate 기능 에 문제가 발생했습니다. 내가 뭔가 잘못하고 있거나 실제로 기능에 문제가 있습니다. 충분히 자주 사용하는 구독을 취소합니다.

따라서 문제의 본질은 OnInit()에서 함수를 호출하면 ChartNavigate가 터미널이 시작될 때 차트를 이동하지 않는다는 것입니다. 나는 문서를 여러 번 읽었습니다. 초기화 중에 함수를 호출할 수 없다는 말은 어디에도 없습니다.

재생 표시 코드:

 #property indicator_chart_window 
int OnInit ()
{
   if ( ChartNavigate ( 0 , CHART_END , - 1000 ))
       Alert ( "Успешно" );
   else
       Alert ( "Ошибка №" , GetLastError ());

   return ( INIT_SUCCEEDED );
}
void OnDeinit ( const int reason)
{
}
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 (rates_total);
}

플레이 단계:

  1. 차트 자동 스크롤을 비활성화합니다.
  2. 지표를 차트에 부착합니다. ChartNavigate는 차트를 올바른 위치로 이동하여 작동합니다.
  3. 터미널을 언로드합니다.
  4. 터미널을 다운로드합니다. ChartNavigate는 오프셋 없이 차트를 표시하여 작동하지 않습니다.
함수가 오류를 생성했다면. 그러나 그녀는 그렇지 않습니다. 모든 호출이 성공하지만 그래프가 이동하지 않는 것은 터미널이 다시 시작될 때입니다.

 
그래프에서 작동하는 함수를 적용하고 있습니다. 지표의 경우 차트 생성 보장은 Expert Advisor의 경우 OnCalculate 에 대한 첫 번째 항목이며 OnTick()에 대한 첫 번째 항목입니다. 그러나 이전에는 그렇지 않았습니다.
 
Vladimir Karputov :
그래프에서 작동하는 함수를 적용하고 있습니다. 지표의 경우 차트 생성 보장은 Expert Advisor의 경우 OnCalculate의 첫 번째 항목인 OnTick()의 첫 번째 항목입니다. 그러나 이전에는 그렇지 않았습니다.

괜찮아요. 아직 차트가 없으면 함수가 false와 해당 오류 코드를 반환하도록 합니다. 그러나 이것은 사실이 아니며 함수는 성공적으로 완료되었음을 자랑스럽게 보고합니다. 문서에 이것이 차트에 메시지를 성공적으로 보냈다는 표시가 없다는 사실에 주의를 기울입니다. 그것은 분명히 말합니다: 함수의 성공적인 실행.

또한 이것은 재현할 코드입니다. 사실 ChartNavigate 를 호출 하기 전에도 시계열에 액세스하고 있습니다. 그리고 그들은 모두 올바르게 채워졌습니다. 즉, 그래프가 이미 있고 데이터가 있습니다. 또한 터미널을 닫기 전에 차트에 배치된 그래픽 개체를 차트에서 읽을 수 있습니다.

따라서 모든 표시에 따르면 일정이 이미 존재합니다.

 

몇 가지 이상한 점. 문제없이 나를 위해 작동합니다.

또 한 가지 참고 사항: 차트를 이동하기 전에 자동 이동 CHART_AUTOSCROLL 을 비활성화해야 합니다.

 
Ihor Herasko :

괜찮아요. 아직 차트가 없으면 함수가 false와 해당 오류 코드를 반환하도록 합니다. 그러나 이것은 사실이 아니며 함수는 성공적으로 완료되었음을 자랑스럽게 보고합니다. 문서에 이것이 차트에 메시지를 성공적으로 보냈다는 표시가 없다는 사실에 주의를 기울입니다. 그것은 분명히 말합니다: 기능의 성공적인 실행.

또한 이것은 재현할 코드입니다. 사실 ChartNavigate를 호출 하기 전에도 시계열에 액세스하고 있습니다. 그리고 그들은 모두 올바르게 채워졌습니다. 즉, 그래프가 이미 있고 데이터가 있습니다. 또한 터미널을 닫기 전에 차트에 배치된 그래픽 개체를 차트에서 읽을 수 있습니다.

따라서 모든 표시에 의해 일정이 이미 존재합니다.

그래프와 데이터는 매우 다른 두 가지입니다.

차트에 액세스하기 위한 모든 기능은 비동기식입니다. 즉, 단방향 경로가 시작되고 잊혀집니다. 그리고 이 경우 true는 이 함수의 필드를 올바르게 채운 모든 것을 의미합니다. 그 이상은 아닙니다.

모든 데이터가 준비되고 차트가 작성되었을 때 표시는 Oncalculate/OnTick의 첫 번째 항목입니다.

 
Vladimir Karputov :

그래프와 데이터는 매우 다른 두 가지입니다.

차트에 액세스하기 위한 모든 기능은 비동기식입니다. 즉, 단방향 경로가 시작되고 잊혀집니다. 그리고 이 경우 true는 이 함수의 필드를 올바르게 채운 모든 것을 의미하며 그 이상은 아닙니다.

모든 데이터가 준비되고 차트가 작성되었을 때 표시는 Oncalculate/OnTick의 첫 번째 항목입니다.

그렇다면 그것이 나를 위해 완벽하게 작동한다는 사실을 어떻게 설명합니까 ??? OnInit()에서 주제의 첫 번째 메시지와 동일하게 ... 왜 넌센스를 작성합니까?

 
Alexey Viktorov :

몇 가지 이상한 점. 문제없이 나를 위해 작동합니다.

어떤 빌드가 있습니까? 1861이 있습니다.

또 한 가지 참고 사항: 차트를 이동하기 전에 자동 이동 CHART_AUTOSCROLL 을 비활성화해야 합니다.

예, 재생산의 첫 번째 단계에서 이것을 표시했습니다.

 
Ihor Herasko :

어떤 빌드가 있습니까? 1861이 있습니다.

예, 재생산의 첫 번째 단계에서 이것을 표시했습니다.

나는 1861도 가지고 있습니다. 그것은 한 번만 재생산되는 것으로 나타났습니다. 다른 모든 시도는 잘 작동했습니다.

 
Vladimir Karputov :

그래프와 데이터는 매우 다른 두 가지입니다.

차트에 액세스하기 위한 모든 기능은 비동기식입니다. 즉, 단방향 경로가 시작되고 잊혀집니다.

아니, 전부는 아니다. 그렇게 배열된 것들은 특별히 언급된다. 예를 들어, 동일한 ChartApplyTemplate입니다.

그리고 이 경우 true는 이 함수의 필드를 올바르게 채웠다는 의미일 뿐 그 이상은 아닙니다.

차트 자체가 아직 존재하지 않는 경우 함수는 차트 ID가 올바른지 어떻게 결정합니까?

모든 데이터가 준비되고 차트가 작성되었을 때 표시는 Oncalculate/OnTick의 첫 번째 항목입니다.

불행하게도. 코드는 다음과 같습니다.

 #property indicator_chart_window 
int OnInit ()
{
   Print ( __FUNCTION__ , ", баров: " , Bars ( Symbol (), PERIOD_CURRENT ));

   return ( INIT_SUCCEEDED );
}
void OnDeinit ( const int reason)
{
}
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[])
{
   Print ( __FUNCTION__ , ", баров: " , Bars ( Symbol (), PERIOD_CURRENT ));
   return (rates_total);
}

다음과 같이 작동합니다.

 16 : 01 : 31.765     Test (XBNUSD,M1)         OnInit , баров: 0
16 : 01 : 33.531     Test (XBNUSD,M1)         OnCalculate , баров: 37026
16 : 01 : 34.010     Test (XBNUSD,M1)         OnCalculate , баров: 46484

나는 아직 열지 않은 차트, 즉 데이터가 아직 생성되지 않은 새 기호에 표시기를 시작했습니다.

첫 번째 줄(OnInit)에는 실제로 데이터가 없습니다. 그러나 차트 ID가 있고 OnInit()에서 개체를 만들 수 있으며 그러면 차트에 성공적으로 표시됩니다.

두 번째 줄에는 이미 데이터가 포함되어 있지만 불완전합니다. 데이터 완전성은 세 번째 반복에서 달성되었습니다.

OnCalculate에 대한 첫 번째 호출이 데이터 로드를 보장하지 않는다는 결론을 내리는 것이 합리적입니다. 이것은 단순히 차트를 연 후 첫 번째 기호 틱으로, 일부 데이터 뒤에 오거나 다른 데이터 없이 올 수 있습니다.

주제에서 제기된 문제로 돌아가서 ChartNavigate() 함수 가 매개변수의 유효성을 확인하지 않는다는 것을 알았습니다. 결국 OnInit()에 아직 데이터가 없고(막대 0개) 값 -1000이 함수에 전달된 경우 막대가 없는 경우 어떻게 그러한 값이 올바른 것으로 간주될 수 있습니까? 결국, 다른 함수는 존재하지 않는 인덱스가 있는 막대에 액세스할 때 오류를 반환합니다. 그리고 여기 - 성공적으로. 정확히 무엇이 성공합니까?

 

여기에 이러한 표시기가 있습니다. 특히 9틱의 지연, 두 가지 유형의 차트 이동 및 강제 다시 그리기 플래그(켜기/끄기)를 설정했습니다.

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window 
#property indicator_plots 0
//--- input parameters
input bool redraw= true ;
input ENUM_CHART_POSITION position= CHART_BEGIN ;
//---
long count= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   count= 0 ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   count++;
   Comment (count);
   if (count== 9 )
     {
       ResetLastError ();
       if (position== CHART_BEGIN )
        {
         if ( ChartNavigate ( 0 , CHART_BEGIN , 100 ))
             Print ( "Успешно. redraw " ,redraw, ". position " , EnumToString (position));
         else
             Print ( "Ошибка №" , GetLastError (), ". redraw " ,redraw, ". position " , EnumToString (position));
        }
       if (position== CHART_END )
        {
         if ( ChartNavigate ( 0 , CHART_END ,- 100 ))
             Print ( "Успешно. redraw " ,redraw, ". position " , EnumToString (position));
         else
             Print ( "Ошибка №" , GetLastError (), ". redraw " ,redraw, ". position " , EnumToString (position));
        }
       if (redraw)
         ChartRedraw ();
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+


예비: CHART_BEGIN 은 안정적입니다.

파일:
Test.mq5  6 kb
 
Vladimir Karputov :

여기에 이러한 표시기가 있습니다. 특히 9틱 지연, 두 가지 유형의 차트 이동 및 강제 다시 그리기 플래그(켜기/끄기)를 설정했습니다.


예비: CHART_BEGIN 은 안정적입니다.

그리고 진드기가 없으면 주말? 그런 다음 타이머를 연결해야 합니다.

그리고 결국 한 가지 질문을 해결해야 합니다. 성공적인 ChartNavigate 처리 사실을 결정하는 방법은 무엇입니까? true를 반환한다는 사실은 "보여주기 위해"일 뿐이며 실제 작업에 어떤 식으로든 도움이 되지 않습니다.