다중 통화 지표를 개발하는 방법을 아는 사람이 있습니까?

 
다중 통화 지표 를 개발하는 방법을 아는 사람이 있습니까?

BETWEEN 1에서 10개의 다른 통화와 각 통화에 대해 5개의 막대를 선택하고 싶습니다.

그러나 나는 이것을 하는 방법을 모른다.

 

표준 표시기에서는 OnCalulate( ... ) 이벤트 함수를 통해 전송된 매개변수의 데이터로 버퍼 배열을 구축합니다. 그러나 다중 통화 및/또는 다중 시간 프레임 의 경우 다음 두 가지 솔루션 중 하나를 사용해야 합니다.

  • iTime() , iVolume , iOpen , iClose 등과 같은 "iFunction" 변형의 이전 방법을 사용하지만 기본 _Symbol 또는 Symbol( ) .
  • MqlRates 의 배열 포인터 와 함께 ArrayCopyRates() 함수의 첫 번째 변형의 새로운 방법을 사용합니다. "복사된" 배열은 실제로 공간을 차지하지 않으며 다양한 기호 및 시간 프레임의 기존 데이터에 대한 포인터일 뿐입니다.

그러나 이것이 작동하려면 다중 기호 및/또는 다중 시간 프레임이 작동하려면 두 가지 조건 중 하나가 있어야 합니다.

  • 기호 및 시간 프레임에 대한 해당 차트가 이미 열려 있으므로 오류가 생성되지 않습니다.
  • 또는 데이터를 처음 요청할 때 오류 4066 (ERR_HISTORY_WILL_UPDATED)이 발생하고 데이터가 다운로드될 때까지 기다렸다가 데이터를 다시 요청하려면 절전 및 재시도 루프 를 코딩해야 합니다.

4066 오류를 처리하는 가장 효율적이고 가장 쉬운 방법으로 개인적으로 제안한 솔루션은 ArrayCopyRates()MqlRates 메서드입니다.

이 MQL4 문서 및 도움말 파일에 대한 자세한 정보가 있습니다.

추신! 주의! 다양한 기호 및 시간 프레임에 대해 iMA () , iATR( ) 등과 같은 내장 표시기 기능에 액세스할 때 4066 오류가 발생하지 않도록 절전 및 재시도 루프도 구현해야 합니다. 다음은 MQL4 문서의 인용문입니다.

Any indicator can be calculated on the data of not only current chart, but also on the data of any available symbol/period. If data (symbol name and/or timeframe differ from the current ones) are requested from another chart, the situation is possible that the corresponding chart was not opened in the client terminal and the necessary data must be requested from the server. In this case, error ERR_HISTORY_WILL_UPDATED (4066 - the requested history data are under updating) will be placed in the last_error variable, and one will has to re-request (see example of ArrayCopySeries() )
 
OP는 표시기에 대해 묻고 있음을 기억하십시오. 표시기에서 Sleep()은 무시됩니다.
 
GumRai :
OP는 표시기에 대해 묻고 있음을 기억하십시오. 표시기에서 Sleep()은 무시됩니다.

미안해 몰랐어! 나는 이 방법을 EA에서는 상당히 광범위하게 사용하지만 지표에서는 사용하지 않기 때문에 수면 장애에 대해 알지 못했습니다.

이 경우 OnCalculate() 함수에 대한 모든 틱 호출에서 연속적인 호출 주위에 재시도 루프를 구축해야 합니다( ArrayCopyRates() 를 사용하는 것이 더 나은 솔루션임).

또는 OnInit() 함수에서 작동하는 경우 지표에 대한 데이터를 준비하는 데 선호되는 방법일 수 있으며 이 경우 재시도 횟수가 매우 길 수 있습니다(잠자기 없음).

 
FMIC :

...

  • 또는 데이터를 처음 요청할 때 오류 4066 (ERR_HISTORY_WILL_UPDATED)이 발생하고 데이터가 다운로드될 때까지 기다렸다가 데이터를 다시 요청하려면 절전 및 재시도 루프 를 코딩해야 합니다.

추신! 주의! 다양한 기호 및 시간 프레임에 대해 iMA () , iATR( ) 등과 같은 내장 표시기 기능에 액세스할 때 4066 오류가 발생하지 않도록 절전 및 재시도 루프도 구현해야 합니다. 다음은 MQL4 문서의 인용문입니다.


최근에 변경하지 않는 한 조건이나 기록 업데이트 진행 상황에 관계없이 첫 번째 함수 호출(그리고 이 첫 번째 호출에서만)에서 매번 4066 오류가 발생합니다. 실용적인 용도가 없습니다.
 
Ovo :
최근에 변경하지 않는 한 조건이나 히스토리 업데이트 진행 상황에 관계없이 첫 번째 함수 호출에서 매번(이 첫 번째 호출에서만) 4066 오류가 발생합니다. 실용적인 용도가 없습니다.
저에게는 그렇지 않았습니다. 데이터가 이미 완전히 사용 가능한 경우 4066 오류가 발생하지 않습니다. 그러나 직접 사용할 수 없는 경우 해당 특정 기호 및 time.frame에 대한 함수 의 첫 번째 호출에서만 오류가 발생합니다. 그 후 해당 데이터를 요청하는 다른 함수는 더 이상 오류를 제공하지 않습니다.
 

FMIC :

이 경우 OnCalculate() 함수에 대한 모든 틱 호출에서 연속적인 호출 주위에 재시도 루프를 구축해야 합니다( ArrayCopyRates() 를 사용하는 것이 더 나은 솔루션임).

또는 OnInit() 함수에서 작동하는 경우 지표에 대한 데이터를 준비하는 데 선호되는 방법일 수 있으며 이 경우 재시도 횟수가 매우 길 수 있습니다(잠자기 없음).

  1. 표시기의 루프(길거나 그렇지 않은 경우)는 작동 하지 않습니다 . 표시기가 실행되는 동안 터미널에서 아무 일도 일어나지 않습니다. 이것이 수면이 지표에서 작동하지 않는 이유입니다. 그리고 ArrayCopyRates가 비동기식인 이유(지표의 경우)
  2. 초기화에서 요금 배열을 활성화합니다. OnTick 에서 테스트하고 재시도 를 처리하십시오. 또한 다른 차트는 다른 시간에 새 막대를 생성한다는 것을 기억하십시오.
     string pairs[] = { "EURUSD" , "GBPUSD" ...}
    MqlRates pair0[], pair1[], ...
    bool initial;
    OnInit (){ initial= true ;
       ArrayCopyRates(pair0, pairs[ 0 ], _Period );   
       ArrayCopyRates(pair1, pairs[ 1 ], _Period );
       :
    }
    OnCalculate ( ... ){
       int count = IndicatorCounted();
       if (initial){
           if (pair 1 [ 0] .time == 0 ) return ;
           if (pair 2 [ 0 ].time == 0 ) return ;
          :
          initial= false ; count = 0 ; // process all bars
       }
       for ( int i = Bars - 1 - MathMax (lookback, count); i >= 0 ; --i){
           int shift0 = iBarsShift(pairs[ 0 ], _Period , Time[i]);
           int shift1 = iBarsShift(pairs[ 1 ], _Period , Time[i]);
          buffer[i] = pair 0[ shift0 ].close - pair 1[ shift1 ].close;

  3. ArrayCopyRates 를 사용하지 않으려면 필요하지 않지만 [ if(initial) 에서 ] pairN[0].timeiTime() 으로 바꿔서 다른 쌍을 로드해야 합니다.
 
   if (pair1[ 0 ].time == 0 ) return ;

이것은 결코 사실이 아닐 것입니다.

심볼과 타임프레임에 대해 로드된 히스토리가 있는 경우 함수는 가장 최근 값을 검색합니다.

로드된 히스토리가 없으면 Array out of range 오류가 발생합니다.

iTime 등과 동일

 
GumRai :

이것은 결코 사실이 아닐 것입니다.

심볼 및 타임프레임에 대해 로드된 히스토리가 있는 경우 함수는 가장 최근 값을 검색합니다.

로드된 히스토리가 없으면 Array out of range 오류가 발생합니다.

iTime 등과 동일

나는 동의하는 경향이 있습니다!

개인적으로 "ArrayCopyRates()"의 반환 값을 확인한 후 배열 데이터에 액세스하기 전에 배열 크기를 추적합니다.

"iTime()" 및 기타 이러한 기능 과 관련하여 저는 항상 "iBars()"를 먼저 확인합니다.

 
GumRai :

이것은 결코 사실이 아닐 것입니다.

  if (pair1[ 0 ].time == 0 ) return ;

심볼 및 타임프레임에 대해 로드된 히스토리가 있는 경우 함수는 가장 최근 값을 검색합니다.

로드된 히스토리가 없으면 Array out of range 오류가 발생합니다.

iTime 등과 동일

ACR을 살펴보는 역사적(구축 전 600) 예가 많이 있습니다. 다른 방법은 없습니다. ACR 또는 iTime에 대한 후속 호출은 4066을 반환하지 않으므로 데이터가 다운로드되었는지 여부를 어떻게 알 수 있습니까?

iTime은 항상 오류에 대해 0을 반환했습니다.

 
WHRoeder :

ACR을 살펴보는 역사적(구축 전 600) 예가 많이 있습니다. 다른 방법은 없습니다. ACR 또는 iTime에 대한 후속 호출은 4066을 반환하지 않으므로 데이터가 다운로드되었는지 여부를 어떻게 알 수 있습니까?

iTime은 항상 오류에 대해 0을 반환했습니다.

"다른 방법이 없습니다"은(는) 무슨 뜻인가요?

"ArrayCopyRates"에서 반환 횟수를 확인하고 배열 크기를 확인하는 것이 " 배열 인덱스가 범위를 벗어났습니다 "를 쉽게 반환할 수 있는 "pair1[0].time == 0"을 수행하는 것보다 더 강력한 확인 방법인 " 오류.

편집: 귀하의 게시물을 더 자세히 다시 읽은 후 내 진술 중 일부를 제거했습니다.

사유: