이제 코드가 오류 없이 막대 1부터 차트 기록을 그리지만 새 막대에 대해서는 그리지 않습니다. 원하는 작업에 따라 코딩하는 방법은 여러 가지가 있습니다. MQ 코더가 이를 수행하는 방법을 보려면 메타에디터에 포함된 표시기를 살펴보십시오. 코드를 읽고 각 행의 이유를 이해할 수 있다면 표시기를 만드는 데 문제가 없을 것입니다.
개인적으로 문서를 읽을 때 상상하기 어렵습니다. 여전히 왜 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 <=
나는 새로운 문서가 말하는 것을 알고 있습니다. 당신이 그들의 방식으로 그것을한다면 당신은 0이 아닌 값에 대해 prev_calculated 를 테스트하고 rate_total - prev_calculated 를 1로 조정해야 합니다. 그것은 감소 indicator_counted 혼란으로 돌아가고 있습니다.
intOnCalculate ( constint rates_total,
constint 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.
}
안녕하세요 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
더욱이, 나를 혼란스럽게 만드는 것은 다른 많은 지표에서 동일한 접근 방식을 사용하고 그러한 범위를 벗어난 문제가 없다는 것입니다.
B600 전에 범위를 벗어남 w 는 심각한 오류가 아닙니다 .
따라서 최대 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까지 순환하므로).
따라서 솔루션은 매우 명확합니다. Make for(i=1; ___ 여기서 이것은 (<)에 대해 1보다 크거나 (<=)___; i++에 대해 1보다 크거나 같아야 합니다. 내 마지막 코드에서는 0과 같습니다.그러나 문서에는 다음과 같이 나와 있습니다. “하지만 start()의 첫 번째 호출이 아닌 경우 Bars-1과 동일한 값이 반환됩니다. 따라서 101-1=100을 반환합니다.
이 하나의 막대가 다른 문제를 일으킵니다. 시스템이 prev_calculated로 100을 반환하는 경우.
prev_calculated=99이면 루프가 작동한다는 것을 알 수 있습니다.
그러나 prev_calculated = 100처럼 보이므로 제한 =0 또는 -1에 따라 루프가 작동하지 않습니다.
이 경우 prev_calculated= Bars-1 뒤에 있는 논리를 볼 수 있는 사람이 있습니까?
도움이 되기를 바랍니다.
SCFX
prev_calculated == rate_total
이제 SDC를 얻었습니다.
개인적으로 문서를 읽을 때 상상하기 어렵습니다. 여전히 왜 prev_calculated= Total_rates -1인지 잘 모르겠습니다.
SCFX
새로운 지표를 생성하고 이 코드를 시작 함수 에 넣고 1분 차트에 첨부하고 틱이 도착할 때 경고를 관찰합니다.
rate_total은 현재 막대의 양입니다.
prev_calculated는 이전 눈금에 있던 막대의 양입니다.
prev_calculated == rate_total
새로운 지표를 생성하고 이 코드를 시작 기능에 넣고 1분 차트에 첨부하고 틱이 도착할 때 경고를 확인합니다.
rate_total은 현재 막대의 양입니다.
prev_calculated는 이전 눈금에 있던 막대의 양입니다.
와우 이상하네요.
이전에 게시한 링크에서 if :BUT start()의 첫 번째 호출이 아닌 경우 Bars-1과 동일한 값이 반환된다고 밝혔습니다.
어떻게 그것이 막대(Rate_totals)를 반환합니까?
예, 그들이 그렇게 말하는 것을 알고 있지만 완전히 정확하지는 않습니다.
실제로 일어나는 일은 이것이다.
rate_total == 현재 틱이 도착했을 때 막대의 총량. prev_calculated == 이전 틱이 도착했을 때 막대의 총량.
따라서 prev-calculated 대 Rates_total의 3가지 주요 상태가 있습니다. 표시기 로드, 중간 막대 눈금, 새 막대 첫 번째 눈금.
prev_calculated == 표시기가 로드된 이후 이전 틱이 없었기 때문에 첫 번째 실행 시 0입니다.
또한 차트가 변경되거나 기록이 추가되면 prev_calculated가 다시 0으로 재설정됩니다.
OnCalculate의 반환 값은 사용되지 않지만 수정될 경우를 대비하여 기본 반환(rates_total)을 사용하는 것이 가장 좋습니다.
나는 새로운 문서가 말하는 것을 알고 있습니다. 당신이 그들의 방식으로 그것을한다면 당신은 0이 아닌 값에 대해 prev_calculated 를 테스트하고 rate_total - prev_calculated 를 1로 조정해야 합니다. 그것은 감소 indicator_counted 혼란으로 돌아가고 있습니다.
return( rate_total - 1 )을 수행하는 것은 아무 의미가 없습니다. prev_calculated의 값은 반환하도록 지시한 내용에 관계없이 마치 return(rates_total)인 것 같습니다.