새 시간 프레임 차트로 변경할 때마다 내 표시기가 사라집니다. - 페이지 3

 

안녕하세요 SDC입니다.

알겠어요. 감사합니다.

100바가 있는 경우 총 비율은 0에서 99까지 시작합니다.

처음에는 pre_cal =0 --> limit=100 bar - 0 =100입니다.

for(int=1에서 limit=100; I++)

결국 I=100(인덱스 값)이고 그런 막대 100은 없습니다.

따라서 최대 I=99를 만들기 위해 limit -1을 넣었습니다.

더 좋은 방법이 있는지 궁금합니다.

더욱이, 나를 혼란스럽게 만드는 것은 다른 많은 지표에서 동일한 접근 방식을 사용하고 그러한 범위를 벗어난 문제가 없다는 것입니다.

또한 전문가 탭에 감사드립니다.

SCFX


   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 2 ;
//---
 
 for ( int i= 1 ;i<limit- 1   ;i++)
{   if ((High[i]-Low[i])== 0 ) continue ;

   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50      ) 
      boring[i]=Close[i];
 
scfx :

더욱이, 나를 혼란스럽게 만드는 것은 다른 많은 지표에서 동일한 접근 방식을 사용하고 그러한 범위를 벗어난 문제가 없다는 것입니다.



B600 전에 범위를 벗어남 w 는 심각한 오류가 아닙니다 .
 
scfx : .

따라서 최대 I=99를 만들기 위해 limit -1을 넣었습니다.

더 좋은 방법이 있는지 궁금합니다.

이제 코드가 오류 없이 막대 1부터 차트 기록을 그리지만 새 막대에 대해서는 그리지 않습니다. 원하는 작업에 따라 코딩하는 방법은 여러 가지가 있습니다. MQ 코더가 이를 수행하는 방법을 보려면 메타에디터에 포함된 표시기를 살펴보십시오. 코드를 읽고 각 행의 이유를 이해할 수 있다면 표시기를 만드는 데 문제가 없을 것입니다.

 

이제 SDC를 얻었습니다.

개인적으로 문서를 읽을 때 상상하기 어렵습니다. 여전히 왜 prev_calculated= Total_rates -1인지 잘 모르겠습니다.

그래서 여기에서 수치적 예를 들겠습니다. 저와 같은 새로운 사람에게 도움이 되었으면 합니다.

일반적으로 우리는 다음을 봅니다.

한도= rate_total- prev_calculated; //(아니오-1)

또는

for(i=1;i<limit;i++) 또는 for(i=1;i<=limit;i++)

중요한 것은 LIMIT >=1인지 확인하는 것입니다. 내 상황에서는 LIMIT=0이므로 새 틱이 들어올 때 표시기가 REFSHED되지 않습니다.

왜, 보자. (나는 적어도 내 경우에는 그 원인이 prev_calculated라고 생각한다)

차트에 100개의 막대가 있을 때 표시기를 붙인다고 가정합니다. 다음은 변수 값입니다.

첫 번째 값 테이블
변하기 쉬운
Total_rates 100
막대 0-99의 인덱스
prev_calculated 0
제한 100
루프 i 값 1-99

모든 좋은. 값은 막대 1에서 차트 시작 부분까지 처음으로 표시됩니다. 얼마나 많은 막대가 이미 계산되었습니까? 그것은 내 실수에 대한 중요한 포인트이며 100% 명확하지 않습니다.

새 막대가 시작되면 차트에서 이제 101 막대입니다. 표시기는 이미 닫힌 막대(현재 막대 1)에서 업데이트되지 않습니다.

두 번째 가치 테이블
변하기 쉬운
Total_rates 101
막대 0-100의 색인
prev_calculated 99 또는 100(아래 참조)
제한 2 또는 1
루프 i 값 1to1 또는 1에서 0

첫 번째 표를 기반으로 표시기는 99bar를 계산합니다(1에서 99까지 순환하므로).
그러나 문서에는 다음과 같이 나와 있습니다. “하지만 start()의 첫 번째 호출이 아닌 경우 Bars-1과 동일한 값이 반환됩니다. 따라서 101-1=100을 반환합니다.
이 하나의 막대가 다른 문제를 일으킵니다. 시스템이 prev_calculated로 100을 반환하는 경우.
prev_calculated=99이면 루프가 작동한다는 것을 알 수 있습니다.
그러나 prev_calculated = 100처럼 보이므로 제한 =0 또는 -1에 따라 루프가 작동하지 않습니다.
이 경우 prev_calculated= Bars-1 뒤에 있는 논리를 볼 수 있는 사람이 있습니까?

따라서 솔루션은 매우 명확합니다. Make for(i=1; ___ 여기서 이것은 (<)에 대해 1보다 크거나 (<=)___; i++에 대해 1보다 크거나 같아야 합니다. 내 마지막 코드에서는 0과 같습니다.

   int pcal=prev_calculated;
   
   if (prev_calculated> 0 )
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if (limit<= 0 ) limit= 2 ; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

도움이 되기를 바랍니다.

SCFX

 

prev_calculated == rate_total

scfx :

이제 SDC를 얻었습니다.

개인적으로 문서를 읽을 때 상상하기 어렵습니다. 여전히 왜 prev_calculated= Total_rates -1인지 잘 모르겠습니다.

SCFX

새로운 지표를 생성하고 이 코드를 시작 함수 에 넣고 1분 차트에 첨부하고 틱이 도착할 때 경고를 관찰합니다.

 Alert ( "rt = " ,rates_total, "  pc = " ,prev_calculated);

rate_total은 현재 막대의 양입니다.

prev_calculated는 이전 눈금에 있던 막대의 양입니다.

 
SDC :

prev_calculated == rate_total

새로운 지표를 생성하고 이 코드를 시작 기능에 넣고 1분 차트에 첨부하고 틱이 도착할 때 경고를 확인합니다.

rate_total은 현재 막대의 양입니다.

prev_calculated는 이전 눈금에 있던 막대의 양입니다.


와우 이상하네요.

이전에 게시한 링크에서 if :BUT start()의 첫 번째 호출이 아닌 경우 Bars-1과 동일한 값이 반환된다고 밝혔습니다.

어떻게 그것이 막대(Rate_totals)를 반환합니까?

 

예, 그들이 그렇게 말하는 것을 알고 있지만 완전히 정확하지는 않습니다.

실제로 일어나는 일은 이것이다.

rate_total == 현재 틱이 도착했을 때 막대의 총량. prev_calculated == 이전 틱이 도착했을 때 막대의 총량.

차트의 막대 표시기 상태 요금 합계 미리 계산된 rate_total-prev_calculated
1000 로드될 때 첫 번째 실행 1000 0 1000
1000 다음 틱 1000 1000 0
1000 다음 틱 1000 1000 0
1001 새 막대의 첫 번째 눈금 1001 1000 1
1001 다음 틱 1001 1001 0
1001 다음 틱 1001 1001 0

따라서 prev-calculated 대 Rates_total의 3가지 주요 상태가 있습니다. 표시기 로드, 중간 막대 눈금, 새 막대 첫 번째 눈금.

prev_calculated == 표시기가 로드된 이후 이전 틱이 없었기 때문에 첫 번째 실행 시 0입니다.

또한 차트가 변경되거나 기록이 추가되면 prev_calculated가 다시 0으로 재설정됩니다.

OnCalculate의 반환 값은 사용되지 않지만 수정될 경우를 대비하여 기본 반환(rates_total)을 사용하는 것이 가장 좋습니다.

 
차트의 막대 표시기 상태 요금 합계 미리 계산된 rate_total-prev_calculated
1000 로드될 때 첫 번째 실행 1000 0 1000
그리고 바 1000은 존재하지 않습니다.

나는 새로운 문서가 말하는 것을 알고 있습니다. 당신이 그들의 방식으로 그것을한다면 당신은 0이 아닌 값에 대해 prev_calculated 를 테스트하고 rate_total - prev_calculated 를 1로 조정해야 합니다. 그것은 감소 indicator_counted 혼란으로 돌아가고 있습니다.
 int OnCalculate ( const int rates_total,
                 const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if (indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for (iBar = rates_total - 1 - indicator_counted; i>= 0 i--){
      Buffer[iBar] = ...;
   }
   return ( rates_total - 1 ); // Recalculate bar zero next tick.
}
표시기 진행률 표시 - MQL4 포럼 참조
 

return( rate_total - 1 )을 수행하는 것은 아무 의미가 없습니다. prev_calculated의 값은 반환하도록 지시한 내용에 관계없이 마치 return(rates_total)인 것 같습니다.

 
SDC : return( rate_total - 1 )을 수행하는 것은 의미가 없습니다. prev_calculated의 값은 반환하도록 지시한 내용에 관계없이 마치 return(rates_total)인 것처럼 보입니다.
서비스 데스크 에 문제 를 게시했습니까?