표준 표시기에서는 OnCalulate( ... ) 이벤트 함수를 통해 전송된 매개변수의 데이터로 버퍼 배열을 구축합니다. 그러나 다중 통화 및/또는 다중 시간 프레임 의 경우 다음 두 가지 솔루션 중 하나를 사용해야 합니다.
- iTime() , iVolume , iOpen , iClose 등과 같은 "iFunction" 변형의 이전 방법을 사용하지만 기본 _Symbol 또는 Symbol( ) .
- MqlRates 의 배열 포인터 와 함께 ArrayCopyRates() 함수의 첫 번째 변형의 새로운 방법을 사용합니다. "복사된" 배열은 실제로 공간을 차지하지 않으며 다양한 기호 및 시간 프레임의 기존 데이터에 대한 포인터일 뿐입니다.
그러나 이것이 작동하려면 다중 기호 및/또는 다중 시간 프레임이 작동하려면 두 가지 조건 중 하나가 있어야 합니다.
- 기호 및 시간 프레임에 대한 해당 차트가 이미 열려 있으므로 오류가 생성되지 않습니다.
- 또는 데이터를 처음 요청할 때 오류 4066 (ERR_HISTORY_WILL_UPDATED)이 발생하고 데이터가 다운로드될 때까지 기다렸다가 데이터를 다시 요청하려면 절전 및 재시도 루프 를 코딩해야 합니다.
4066 오류를 처리하는 가장 효율적이고 가장 쉬운 방법으로 개인적으로 제안한 솔루션은 ArrayCopyRates() 및 MqlRates 메서드입니다.
이 MQL4 문서 및 도움말 파일에 대한 자세한 정보가 있습니다.
추신! 주의! 다양한 기호 및 시간 프레임에 대해 iMA () , iATR( ) 등과 같은 내장 표시기 기능에 액세스할 때 4066 오류가 발생하지 않도록 절전 및 재시도 루프도 구현해야 합니다. 다음은 MQL4 문서의 인용문입니다.
OP는 표시기에 대해 묻고 있음을 기억하십시오. 표시기에서 Sleep()은 무시됩니다.
미안해 몰랐어! 나는 이 방법을 EA에서는 상당히 광범위하게 사용하지만 지표에서는 사용하지 않기 때문에 수면 장애에 대해 알지 못했습니다.
이 경우 OnCalculate() 함수에 대한 모든 틱 호출에서 연속적인 호출 주위에 재시도 루프를 구축해야 합니다( ArrayCopyRates() 를 사용하는 것이 더 나은 솔루션임).
또는 OnInit() 함수에서 작동하는 경우 지표에 대한 데이터를 준비하는 데 선호되는 방법일 수 있으며 이 경우 재시도 횟수가 매우 길 수 있습니다(잠자기 없음).
...
- 또는 데이터를 처음 요청할 때 오류 4066 (ERR_HISTORY_WILL_UPDATED)이 발생하고 데이터가 다운로드될 때까지 기다렸다가 데이터를 다시 요청하려면 절전 및 재시도 루프 를 코딩해야 합니다.
추신! 주의! 다양한 기호 및 시간 프레임에 대해 iMA () , iATR( ) 등과 같은 내장 표시기 기능에 액세스할 때 4066 오류가 발생하지 않도록 절전 및 재시도 루프도 구현해야 합니다. 다음은 MQL4 문서의 인용문입니다.
FMIC : 이 경우 OnCalculate() 함수에 대한 모든 틱 호출에서 연속적인 호출 주위에 재시도 루프를 구축해야 합니다( ArrayCopyRates() 를 사용하는 것이 더 나은 솔루션임). 또는 OnInit() 함수에서 작동하는 경우 지표에 대한 데이터를 준비하는 데 선호되는 방법일 수 있으며 이 경우 재시도 횟수가 매우 길 수 있습니다(잠자기 없음). |
|
if (pair1[ 0 ].time == 0 ) return ;
이것은 결코 사실이 아닐 것입니다.
심볼과 타임프레임에 대해 로드된 히스토리가 있는 경우 함수는 가장 최근 값을 검색합니다.
로드된 히스토리가 없으면 Array out of range 오류가 발생합니다.
iTime 등과 동일
이것은 결코 사실이 아닐 것입니다.
if (pair1[ 0 ].time == 0 ) return ;
심볼 및 타임프레임에 대해 로드된 히스토리가 있는 경우 함수는 가장 최근 값을 검색합니다.
로드된 히스토리가 없으면 Array out of range 오류가 발생합니다.
iTime 등과 동일
ACR을 살펴보는 역사적(구축 전 600) 예가 많이 있습니다. 다른 방법은 없습니다. ACR 또는 iTime에 대한 후속 호출은 4066을 반환하지 않으므로 데이터가 다운로드되었는지 여부를 어떻게 알 수 있습니까?
iTime은 항상 오류에 대해 0을 반환했습니다.
ACR을 살펴보는 역사적(구축 전 600) 예가 많이 있습니다. 다른 방법은 없습니다. ACR 또는 iTime에 대한 후속 호출은 4066을 반환하지 않으므로 데이터가 다운로드되었는지 여부를 어떻게 알 수 있습니까?
iTime은 항상 오류에 대해 0을 반환했습니다.
"다른 방법이 없습니다"은(는) 무슨 뜻인가요?
"ArrayCopyRates"에서 반환 횟수를 확인하고 배열 크기를 확인하는 것이 " 배열 인덱스가 범위를 벗어났습니다 "를 쉽게 반환할 수 있는 "pair1[0].time == 0"을 수행하는 것보다 더 강력한 확인 방법인 " 오류.
편집: 귀하의 게시물을 더 자세히 다시 읽은 후 내 진술 중 일부를 제거했습니다.
BETWEEN 1에서 10개의 다른 통화와 각 통화에 대해 5개의 막대를 선택하고 싶습니다.
그러나 나는 이것을 하는 방법을 모른다.