초기화 시 ChartNavigate - 페이지 6

 
Alexey Viktorov :

이 게시물( https://www.mql5.com/ru/forum/260815/page4#comment_7890492 )에서 문제가 재현될 수 있는 조건에 대해 자세히 설명했습니다. 이것은 귀하의 주장에 따라 재현할 수 있었습니다. 여기에 무엇에 대해 썼습니까?

즉, 조건을 약간만 수정해도 문제가 안정적으로 재현됩니다.

어떤 이유로 당신은 눈치 채지 못했습니다

 
Alexey Viktorov :

P./S.: 코드에서 주석 대신 인쇄를 하면 더 관대할 뿐만 아니라 OnInit()의 인쇄 결과 는 여기에서 비교, 복사 및 붙여넣기가 더 쉽습니다.

 
Alexey Viktorov :

모든 것이 제자리에 있기를 바라는 것이 아니라 동일한 빌드를 갖기 위해 업데이트할 것을 제안했습니다.

Igor, 당신은 지표의 정식 버전에서 실험을 합니까, 아니면 실험용으로 실험을 합니까?

여기 저기에. 그러나 여전히 문제가 무엇인지 확실하게 말할 수는 없습니다. 버그인지 버그인지 여부입니다. 충분히 재현 가능한 조건을 찾는 것이 필요합니다.

 
Alexey Viktorov :

그것을 하는 방법?

주제의 첫 번째 메시지에 있는 설명에 따르면 이것은 열려 있는 차트에 걸려 있는 표시기로 이미 기록이 로드되었음을 의미합니다. 그래서? 우리는 표시기를 걸고, 터미널을 닫고, 터미널을 실행합니다 . --- 기록은 어디로 갈 수 있습니까? 그녀가 이미 그곳에 있었다면...

둘째, EURMXN 기호를 열었습니다. 터미널을 보지 않고 무엇인지 알 수 있습니까? )))

간단하게 수행됩니다.

  1. 표시기 템플릿은 default.tpl이라는 이름으로 저장됩니다.
  2. 이전에 열리지 않았던 차트 기호가 열립니다.
결과적으로 표시기가 먼저 시작된 다음 데이터 펌핑이 시작됩니다. 그리고 한 병에 모든 이벤트가 있습니다.

 
Ihor Herasko :

여기 저기에. 그러나 여전히 문제가 무엇인지 확실하게 말할 수는 없습니다. 버그인지 버그인지 여부입니다. 충분히 재현 가능한 조건을 찾는 것이 필요합니다.

당신은 약간의 나쁜 표현을 가지고 있습니다. 내가 것은 재현 가능한 조건에서 나온 것입니다.

또 다른 점은 예, 아마도 블록 III 에 설명되어 있을 것입니다. 이것은 버그가 아니라 터미널이 다시 시작될 때 데이터를 로드하는 특성입니다.

더욱이 1870년 빌드에서는 1861년에 얻은 것과 재생에 차이가 있었습니다.

메시지 조합(성공 및 오류 4111)도 약간 변경되었습니다. 예를 들어, 이전에 이와 같이 안정적으로 재현 가능한 것이 있었다면:

test 2018 06 26 (GBPUSD,M5)     Alert : Успешно
test 2018 06 26 (GBPUSD,H1)     Alert : Ошибка № 4111

이제 동일한 코드를 사용하여 더 뚜렷한 오류 메시지처럼 보입니다.

test 2018 06 26 (EURNZD,M5)     Alert : Ошибка № 4111
test 2018 06 26 (EURNZD,H1)     Alert : Ошибка № 4111

test 2018 06 26 (EURNZD,M5)     Alert : Ошибка № 4111
test 2018 06 26 (EURNZD,H1)     Alert : Ошибка № 4111

test 2018 06 26 (EURNZD,M5)     Alert : Ошибка № 4111
test 2018 06 26 (EURNZD,H1)     Alert : Ошибка № 4111

test 2018 06 26 (EURNZD,M5)     Alert : Успешно
test 2018 06 26 (EURNZD,H1)     Alert : Ошибка № 4111


그리고 그 포스트 의 블록 III 은 1870년에 더 이상 재생되지 않습니다.

1870년에는 여기에 설명된 내용을 재현할 수 없었습니다. https://www.mql5.com/ru/forum/260815/page5#comment_7901728 마지막으로 - 아마도 운영 체제에 따라 다를 수 있습니다(가정). 즉, 이 Vladimir의 코드는 문제 없이 잘 작동합니다.

 
Ihor Herasko :

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

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

재생 표시 코드:

플레이 단계:

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

표시기의 세 가지 변형을 시도하고 각각의 결과를 확인하십시오.

1. 다른 차트 명령의 끝에서 ChartNavigate

 //+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {


//--- отключим автопрокрутку
   ChartSetInteger ( 0 , CHART_AUTOSCROLL , false );
//--- установим отступ правого края графика
   ChartSetInteger ( 0 , CHART_SHIFT , true );
//--- отобразим в виде свечей
   ChartSetInteger ( 0 , CHART_MODE , CHART_CANDLES );
//--- установить режим отображения тиковых объемов
   ChartSetInteger ( 0 , CHART_SHOW_VOLUMES , CHART_VOLUME_TICK ); 
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate ( 0 , CHART_END ,- 1000 );
//---
   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
   return (rates_total);
  }
//+------------------------------------------------------------------+

2. ChartNavigate 단독 - 다른 차트 명령 없음

 //+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
/*
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
*/
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate ( 0 , CHART_END ,- 1000 );
//---
   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
   return (rates_total);
  }
//+------------------------------------------------------------------+


3. 다른 차트 명령 전에 ChartNavigate

 //+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {

//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate ( 0 , CHART_END ,- 1000 );
//--- отключим автопрокрутку
   ChartSetInteger ( 0 , CHART_AUTOSCROLL , false );
//--- установим отступ правого края графика
   ChartSetInteger ( 0 , CHART_SHIFT , true );
//--- отобразим в виде свечей
   ChartSetInteger ( 0 , CHART_MODE , CHART_CANDLES );
//--- установить режим отображения тиковых объемов
   ChartSetInteger ( 0 , CHART_SHOW_VOLUMES , CHART_VOLUME_TICK ); 

//---
   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
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov :

표시기의 세 가지 변형을 시도하고 각각의 결과를 확인하십시오.

1. 다른 차트 명령의 끝에서 ChartNavigate

  1. 자동 스크롤이 활성화된 M1 차트에 첨부됩니다. 자동 스크롤이 꺼지고 차트가 왼쪽으로 1000바 이동했습니다.
  2. 차트에서 지표를 분리하지 않고 터미널을 다시 시작했습니다. 차트는 현재 양초를 표시했으며 왼쪽으로 1000바 전환이 없었습니다. 자동 스크롤이 비활성화되었습니다.
  3. 2단계를 7번 연속으로 반복했는데, 이 중 왼쪽으로 1000개의 양초로의 전환이 3회, 4회 - 전환이 완료되지 않았습니다.
전환이 완료되지 않은 경우 "업데이트 대기 중"이라는 메시지가 표시되는 것을 확인했습니다. 결론은 히스토리를 로드할 때 터미널이 강제로 차트를 최신 따옴표로 스크롤한다는 것을 암시하는 것 같습니다. 음, 이것은 OnInit()이 실행된 후에 발생하기 때문에 예상치 못한 결과를 얻습니다.

2. ChartNavigate 단독 - 다른 차트 명령 없음

  1. 이 버전에서는 자동 스크롤이 자동으로 비활성화되지 않기 때문에 수동으로 끄고 표시기를 연결했습니다. 차트가 왼쪽으로 1000개의 막대를 이동했습니다.
  2. 차트에서 지표를 분리하지 않고 터미널을 다시 시작했습니다.
  3. 7개 중 2개의 경우 스크롤이 완료됩니다. 또한 두 가지 경우 중 하나의 경우 예상 이력 표시, 현재 촛불 표시, 예상 이력 표시의 세 단계로 발생했습니다. OnInit()가 두 번 실행된 것 같습니다. 한 번은 히스토리를 로드하기 전에, 두 번째는 그 후에 실행되었습니다.

3. 다른 차트 명령 전에 ChartNavigate

  1. 자동 스크롤을 켜고 표시기를 연결했습니다. 차트가 요동쳐서 현재 캔들로 돌아갔습니다. 1000바를 이동하라는 명령 후에 자동 스크롤이 비활성화되기 때문에 예상됩니다.
  2. 차트에서 지표를 분리하지 않고 터미널을 다시 시작했습니다(차트에 현재 촛불이 표시됨).
  3. 7가지 경우 모두 차트에 현재 캔들이 표시되었고 스크롤도 깜박이지 않았습니다.
자동 스크롤을 끄고 기록의 깊이 어딘가에 표시된 차트의 표시 없이 터미널을 다시 시작하면 로드할 때마다 터미널이 꺼진 위치가 표시됩니다. 탐색 명령을 실행하는 동안 어딘가에 현재 촛불로 이동하는 것으로 나타났습니다.
 
Ihor Herasko :

  1. 자동 스크롤이 활성화된 M1 차트에 첨부됩니다. 자동 스크롤이 꺼지고 차트가 왼쪽으로 1000바 이동했습니다.
  2. 차트에서 지표를 분리하지 않고 터미널을 다시 시작했습니다. 차트는 현재 양초를 표시했으며 왼쪽으로 1000바 전환이 없었습니다. 자동 스크롤이 비활성화되었습니다.
  3. 2번 포인트를 7번 연속으로 그 중 왼쪽으로 1000개의 캔들로의 전환이 3번, 4번 - 전환이 완료되지 않았습니다.
전환이 완료되지 않은 경우 "업데이트 대기 중"이라는 메시지가 표시되는 것을 확인했습니다. 결론은 히스토리를 로드할 때 터미널이 강제로 차트를 최신 따옴표로 스크롤한다는 것을 암시하는 것 같습니다. 음, 이것은 OnInit()이 실행된 후에 발생하기 때문에 예상치 못한 결과를 얻습니다.

나는 항상 당신의 메시지/제안이 거꾸로 읽혀질 것이라는 것을 잊습니다. 오래된 농담처럼:

1917년 10월. 손녀인 여성이 Nevsky의 자신의 집에 앉아 있습니다.
데카브리스트. 거리에서 소음이 들리면 관리인에게 그곳에 무엇이 있는지 찾아달라고 요청합니다.
사고.
- 레이디, 혁명이 거기에 있습니다! 청소부가 돌아옵니다.
- 오, 얼마나 멋진가! - 여자는 기뻐합니다-할아버지는 혁명을 꿈꿨습니다!
그리고 가서 혁명가들이 원하는 것이 무엇인지 알아내십시오!
"여주인님, 그들은 부자를 원하지 않습니다." 그가 돌아왔을 때 관리인이 말했습니다.
- 이상하다 - 그 여자는 신중하게 말한다 - 그리고 나의 할아버지는 가난한 사람이 없기를 바랐다!

터미널을 다시 시작하기 전에 차트의 속성을 변경하는 것이 좋겠다고 생각했습니다.
 
Rashid Umarov :

나는 항상 당신의 메시지/제안이 거꾸로 읽힐 것이라는 것을 잊습니다.

어떤 의미에서? 세 가지 지표의 작동을 확인해야 한다고 썼습니다. 이후에 ChartNavigate를 사용하여 터미널을 다시 시작하는 것에 대한 주제이므로 수행한 테스트입니다.

터미널을 다시 시작하기 전에 차트의 속성을 변경하는 것이 좋겠다고 생각했습니다.

터미널이 시작될 때 ChartNavigate가 항상 작동하지 않는 것이 문제라면 이유는 무엇입니까? 요점은 바로 이것입니다.

 
Ihor Herasko :

문제는 터미널이 시작될 때 ChartNavigate가 항상 작동하지 않는다는 것입니다. 요점은 바로 이것입니다.

프로필을 변경할 때도 마찬가지입니다. 또한 ChartNavigate( chart_id, CHART_BEGIN, shift ) 이후에 예를 들어 CHART_FIRST_VISIBLE_BAR 를 얻은 경우 결과는 ChartNavigate가 작동한 것과 같습니다. 그리고 Expert Advisor를 삭제하면 다음에 이 차트에서 Expert Advisor(이것 또는 다른 것)를 시작할 때 CHART_FIRST_VISIBLE_BAR가 수신될 때 결과는 ChartNavigate가 작동하지 않은 것과 같습니다.

결론: 이미 CHART_FIRST_VISIBLE_BAR와 결합된 ChartNavigate 의 극도로 논쟁적인 작업

사유: