MT5 빌드 1455
테스트 표시기:
#property indicator_buffers 0
#property indicator_plots 0
int OnInit ( void ) { return ( INIT_SUCCEEDED );}
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 &TickVolume[],
const long & Volume [],
const int &Spread[]
) {
static int si_Tick = 0 ;
Print (++si_Tick, ": prev_calculated = " , prev_calculated);
return (rates_total);
}
1. 차트에 지표를 걸어
2. 터미널을 닫습니다
3. 터미널을 연다
로그에서:
2016.10 . 17 08 : 04 : 38.757 Test (USDJPY,M15) 2 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.060 Test (USDJPY,M15) 3 : prev_calculated = 0
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15) 4 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15) 5 : prev_calculated = 100322
...
내가 뭔가를 이해하지 못하거나 prev_calculated 변수를 신뢰하는 것이 불가능한가요? 목발을 잘라야 하나요?
MT5 빌드 1455
테스트 표시기:
#property indicator_buffers 0
#property indicator_plots 0
int OnInit ( void ) { return ( INIT_SUCCEEDED );}
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 &TickVolume[],
const long & Volume [],
const int &Spread[]
) {
static int si_Tick = 0 ;
Print (++si_Tick, ": prev_calculated = " , prev_calculated);
return (rates_total);
}
1. 차트에 지표를 걸어
2. 터미널을 닫는다
3. 터미널을 연다
로그에서:
2016.10 . 17 08 : 04 : 38.757 Test (USDJPY,M15) 2 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.060 Test (USDJPY,M15) 3 : prev_calculated = 0
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15) 4 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15) 5 : prev_calculated = 100322
...
내가 뭔가를 이해하지 못하거나 prev_calculated 변수를 신뢰하는 것이 불가능한가요? 목발을 잘라야 하나요?
변수 prev_calculated는 체크섬이 변경된 경우 히스토리를 페이징하지 않아도 0으로 재설정될 수 있습니다(이는 서비스 데스크의 대략적인 답변임).
프로그래머의 임무는 그러한 이벤트를 잡는 것입니다.
따라서 저는 프로그래머가 아닙니다. 작업이 다릅니다. Joiner, 아마도 - 나는 '목발을 자르고' '나는 이벤트를 잡고 있다'고 생각할 것입니다.
그리고 이 변수의 선언된 목적은 다음과 같기 때문에 과장하지 않습니다.
이 약속 외에도 기록의 변경 플래그와 추적할 몇 가지 다른 변경 사항에 대한 플래그가 걸려 있습니다. 모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.
따라서 저는 프로그래머가 아닙니다. 작업이 다릅니다. Joiner, 아마도 - 나는 '목발을 자르고' '나는 이벤트를 잡고 있다'고 생각할 것입니다.
그리고 이 변수의 선언된 목적은 다음과 같기 때문에 과장하지 않습니다.
이 약속 외에도 기록의 변경 플래그와 추적할 몇 가지 다른 변경 사항에 대한 플래그가 걸려 있습니다. 모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.
따라서 저는 프로그래머가 아닙니다. 작업이 다릅니다. Joiner, 아마도 - 나는 '목발을 자르고' '나는 이벤트를 잡고 있다'고 생각할 것입니다.
그리고 이 변수의 선언된 목적은 다음과 같기 때문에 과장하지 않습니다.
이 약속 외에도 기록의 변경 플래그와 추적할 몇 가지 다른 변경 사항에 대한 플래그가 걸려 있습니다. 모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.
prev_calculated=0이면 전체 재계산이 수행되어야 함을 의미합니다. 이 경우 모든 표준 지표가 완전히 다시 계산됩니다.
명확하지 않은 것은 무엇입니까?
체크섬은 역사가 바뀌었다고 합니다. 체크섬이 변경된 이유를 찾는 것보다 표시기를 다시 계산하는 것이 더 저렴합니다.
문서는 이것을 분명히 말하고 있습니다.
OnCalculate() 함수에서 반환된 값과 두 번째 입력 매개변수 prev_calculated 사이의 관계에 유의하십시오. 함수를 호출할 때 prev_calculated 매개변수에는 이전 호출 에서 OnCalculate() 함수가 반환 한 값이 포함됩니다. 이를 통해 이 기능의 이전 실행 이후 변경되지 않은 막대에 대한 재계산을 피하기 위해 사용자 지정 지표를 계산하는 경제적인 알고리즘을 구현할 수 있습니다.
이렇게 하려면 일반적으로 현재 함수 호출의 막대 수를 포함하는 Rates_total 매개변수의 값을 반환하는 것으로 충분합니다. OnCalculate() 함수에 대한 마지막 호출 이후 가격 데이터가 변경된 경우(더 깊은 기록이 업로드되었거나 기록 공백이 채워진 경우) prev_calculated 입력 매개변수의 값은 터미널 자체에 의해 0으로 설정됩니다 .