표시기가 손상됨 - 페이지 6

 
Rosh :
알았어, 기다릴게

20시간 이상 경과하면 표시등이 제대로 작동합니다. 무슨 말을 해야 할지 모르겠어.


 

Rosh, 확대/축소, 왼쪽/오른쪽으로 스크롤합니다. 64/32비트에서 어떤 플랫폼을 테스트하고 있습니까?

 
AnkaSoftware :

Rosh, 확대/축소, 왼쪽/오른쪽으로 스크롤합니다. 64/32비트에서 어떤 플랫폼을 테스트하고 있습니까?

32비트에서 일반적인 문제를 복제할 수 있습니다. O/S가 관련이 있어 보이는 유일한 방법은 64비트 시스템이 막대 기록의 시작 또는 중간에 주기적으로 새 데이터를 가져오는 것처럼 보이는 반면 32비트 시스템(및 RaptorUK의 64비트 시스템)은 그렇지 않습니다. 그럼에도 불구하고, 당신은 다른 사람들에게 당신의 지표를 제공하려는 것으로 보이며, 바 기록의 변경은 당신이 실생활에서 분명히 마주하게 될 문제입니다. 단, 당신의 사용자가 브로커 연결이 끊어져 누락된 바가 삽입되기 때문이라면 재접속의 역사 속으로.

이미 설명하려고 했지만 이 "버그"가 코드에 있는지 아니면 MT4에 있는지는 논쟁의 여지가 있습니다. 지표가 MT4에서 어떻게 작동할 것인지에 대한 예상이 있으며 귀하의 지표는 그런 식으로 작동하지 않습니다. 예를 들어, MetaEditor를 사용하여 새 지표를 생성하면 "int counted_bars=IndicatorCounted();" 행이 삽입됩니다. 이것을 제거하고 IndicatorCounted()를 무시합니다.

다음 표시기를 사용하여 일반적인 문제를 재현할 수 있습니다. 이 표시기는 처음 시작할 때 마지막 10개의 최고 막대 사이에 단순히 선을 그립니다.

 #property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer( 0 , indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true ;
   if (IsFirstCall) {
      IsFirstCall = false ;
       for ( int i = 0 ; i < 10 ; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

그런 다음 다음을 수행하여 동일한 종류의 문제를 복제할 수 있습니다.

* 모든 기호에 대한 차트 열기

* 차트에 지표 추가

* "차트 자동 스크롤"을 끕니다(다음 단계를 더 쉽게 하기 위함이며 문제에 영향을 미치기 때문이 아님).

* 홈을 눌러 차트의 시작 부분으로 이동

* 추가 데이터를 강제로 다운로드하려면 Page Up을 누르십시오. (NB 이 시점에서 실제로 차트에 일부 추가 데이터가 추가되지 않는 한 문제는 없습니다.)

* End를 눌러 차트의 끝으로 이동합니다. 고점 사이의 빨간색 선은 이제 위치를 벗어납니다. 시간이 지나면서 뒤로 이동되었을 것입니다.

[이 모든 것은 RaptorUK가 이미 확인한 내용을 구체화한 것입니다.]

 

알겠습니다. 표시줄이 누락되거나 표시기가 손상된 경우 IndicatorCounted()가 -ve 숫자를 반환하는지 확인할 수 있습니까? 표시기 배열을 다시 초기화하고 룩백 바에서 움직임을 다시 그려 보겠습니다 .

 
AnkaSoftware :

알겠습니다. 표시줄이 누락되거나 표시기가 손상된 경우 IndicatorCounted()가 -ve 숫자를 반환하는지 확인할 수 있습니까?

아니요, 5페이지에서 이미 말했듯이 쉽게 직접 테스트할 수 있습니다. 위의 하나. 이것은 일반적으로 Bars와 IndicatorCounted() 간의 차이를 사용하여 어떤 막대가 "더럽고" 업데이트해야 하는지 결정하기 때문에 일반 표시기가 모든 과거 값을 다시 그리도록 합니다. IndicatorCounted()가 0이면 표시기는 모든 과거 막대를 다시 계산합니다. 즉, Bars - 0 = Bars이기 때문입니다.

IndicatorCounted() 문서( https://docs.mql4.com/customind/IndicatorCounted )는 이를 수행하는 한 가지 예를 제공하며 https://www.mql5.com/en/forum/132447 과 같은 대체 버전이 있습니다. https://docs.mql4.com/customind/IndicatorCounted 의 표준 코드가 "깨끗한" 막대 하나를 불필요하게 다시 계산하기 때문에 성능이 아주 약간 향상되는 것을 목표로 합니다.
 

IndicatorCounted()를 추가하면 IndicatorCounted()가 값 0을 반환할 때 표시기를 확인하고 다시 초기화하여 히스토리 또는 추가 막대 를 삽입할 때 발생하는 표시기 이동 문제를 해결합니다.

그러나 히스토리 바의 삽입으로 인한 것이 아닌 것으로 보이는 지표의 손상의 또 다른 문제가 있습니다. 문제를 재현하기 위해 동봉된 샘플 코드는 10시간 이상 실행해야 하며 표시기(예: 표시기 시작 후)가 0을 반환하는 IndicatorCounted()가 두 번 이상 다시 초기화될 때까지 실행해야 합니다.

파일: