mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 31

 
Artyom Trishkin :

내가 보여주는 코드를 본 적이 있습니까? 런칭하셨나요?

표시기 버퍼를 채우는 방법을 묻는 것이 아니라 현재 막대가 아닌 AO에서 값을 가져오면 빈 값이 반환되는 이유를 묻습니다.
나는 이것을 이해했습니다. 히스토리가 없습니다. 로드되고 있으며, 네이티브가 아닌 TF에서 AO를 로드하는 동안 "데이터 없음" 오류를 반환합니다.

이제 질문은 다음과 같습니다. 원하는 TF에 대한 기록이 표시기 주기에 들어가지 않도록 완전히 로드되었는지 확인하는 방법은 무엇입니까?

표시기에서 CopyBuffer를 사용 하여 다른 표시기에서 데이터를 가져오는 경우 다음을 수행해야 합니다.

  1. 차트의 맨 오른쪽 막대가 표시기 버퍼의 인덱스 "0"에 해당하도록 표시기 버퍼를 뒤집습니다.
  2. 따라서 "iMTF_AO.mq5" 표시기의 "현재 막대"는 차트에서 가장 오른쪽 막대가 되며 "Buffer[]" 표시기 버퍼의 "0" 인덱스에 해당합니다.
  3. 그리고 표시기(CopyBuffer(handle,0,shift,1,array))에서 "현재 막대"를 가져오려면 "shift" 매개변수가 "0"과 같아야 합니다.

표시기 버퍼를 뒤집고 싶지 않다면 다음을 수행하십시오(일시적으로). AO(0) - 표시기에서 다른 표시기의 값을 가져오는 방법을 이해하기 위한 것입니다. 아마도 오류가 한 두 번 나타날 것입니다. 그러나 이것은 아직 시계열이 구축되지 않았으며 값이 안정적으로 반환됩니다.

 
Artyom Trishkin :
내 대답 봤어? 당신은 시도 했습니까?
 
블라디미르 카르푸토프 :

표시기에서 CopyBuffer를 사용 하여 다른 표시기에서 데이터를 가져오는 경우 다음을 수행해야 합니다.

  1. 차트의 맨 오른쪽 막대가 표시기 버퍼의 인덱스 "0"에 해당하도록 표시기 버퍼를 뒤집습니다.
  2. 따라서 "iMTF_AO.mq5" 표시기의 "현재 막대"는 차트에서 가장 오른쪽 막대가 되며 "Buffer[]" 표시기 버퍼의 "0" 인덱스에 해당합니다.
  3. 그리고 표시기(CopyBuffer(handle,0,shift,1,array))에서 "현재 막대"를 가져오려면 "shift" 매개변수가 "0"과 같아야 합니다.

표시기 버퍼를 뒤집고 싶지 않다면 다음을 수행하십시오(일시적으로). AO(0) - 표시기에서 다른 표시기의 값을 가져오는 방법을 이해하기 위한 것입니다. 아마도 오류가 한 두 번 나타날 것입니다. 그러나 이것은 아직 시계열이 구축되지 않았으며 값이 안정적으로 반환됩니다.

1. 내 코드 에서는 이고 바로 다음과 같습니다.

   ArraySetAsSeries (Buffer, true );
   int bars= Bars ( NULL ,PeriodForWork);
   datetime time_limit=GetTime( Symbol (),PeriodForWork,bars- 1 );
   int limit_p=GetBarShift( Symbol (), Period (),time_limit);
   if (rates_total< 1 ) return ( 0 );

2. 그렇습니다.

3. 시프트는 사이클 인덱스 i와 같습니다. 그리고 주기는 과거 데이터의 시작 부분(rates_total-1)에서 끝 부분(현재 데이터까지)으로 진행됩니다.

또 다른 질문은 누락된 막대에서 데이터를 수신하지 않으려면 네이티브가 아닌 TF와 관련하여 이러한 데이터를 계산해야 한다는 것입니다. 그리고 원하는 TF의 이력이 완전히 동기화되었는지 주기 전에 결정해야 합니다.

 
Artyom Trishkin :

1. 내 코드 에서는 이고 바로 다음과 같습니다.

2. 그렇습니다.

3. 시프트는 사이클 인덱스 i와 같습니다. 그리고 주기는 과거 데이터의 시작 부분(rates_total-1)에서 끝 부분(현재 데이터까지)으로 진행됩니다.

또 다른 질문은 누락된 막대에서 데이터를 수신하지 않으려면 네이티브가 아닌 TF와 관련하여 이러한 데이터를 계산해야 한다는 것입니다. 그리고 원하는 TF의 이력이 완전히 동기화되었는지 주기 전에 결정해야 합니다.


AO에 대한 액세스 주기를 다시 실행합니다. "0"에서 일부 값으로 설정합니다(이제 일부 값에서 0으로). 오류가 나타나면 즉시 계산된 막대의 수("limit_p")와 현재 표시기의 Rates_total을 비교하십시오.


추가됨: 그리고 이 줄은 계산된 "제한"의 모든 노력을 지웁니다(비원시 기간을 참조하는 경우):

   if (limit> 1 ) 
     {
      limit=rates_total- 1 ;
     }

대략적으로 말하자면, 처음에(비원시적 시간대를 언급할 때) "limit"는 156과 같게 되었고 BAM 이하가 되었습니다! "한도"는 이미 "154566666666"이 되었습니다.



 
알렉세이 코지친 :
동기화를 시도 했습니까? 또한 개발자는 타이머를 통해 필요한 TF/심볼의 데이터를 최신 상태로 유지하는 것이 좋습니다.

아니요, 아직 시도하지 않았습니다. 나는 데이터의 관련성을 유지하는 것에 대해 보았고 기억합니다.

그러나 처음에는 주어진 TF와 현재 TF에 대한 데이터가 아직 동기화되지 않은 경우 OnCalculate()를 종료해야 합니다.

현재에 대해 명확합니다.

 if (rates_total< 1 ) return ( 0 );

주어진 것에 대해 - 당신은 그것을 확인해야합니다 Bars() - Rates_total 대신에 숫자입니다.

하지만 아직 한도를 파악하지 못했습니다. 현재 TF에서 다음과 같이 확인할 수 있습니다(다른 표시기의 예).

   int limit=rates_total-prev_calculated;
   if (limit> 1 ) {
      limit=rates_total- 4 ;
       ArrayInitialize (BufferAoDN, EMPTY_VALUE );
       ArrayInitialize (BufferAoUP, EMPTY_VALUE );
       ArrayInitialize (BufferMacdDN, EMPTY_VALUE );
       ArrayInitialize (BufferMacdUP, EMPTY_VALUE );
       ArrayInitialize (BufferRsiDN, EMPTY_VALUE );
       ArrayInitialize (BufferRsiUP, EMPTY_VALUE );
       ArrayInitialize (BufferStochDN, EMPTY_VALUE );
       ArrayInitialize (BufferStochUP, EMPTY_VALUE );
      }

그러나 이 테스트 표시기에서 우리는 현재 TF(OnCalculate()에서 계산을 표시함)와 지정된 TF에서 AO 데이터를 얻기 위해 지정된 것에서 데이터를 얻습니다.

막대의 수로 필요한 모든 데이터를 아름답게 계산하는 방법은 아직 내 마음에 갇히지 않았습니다. 결국 현재 TF의주기는 가장 먼저 기존 데이터가있는 히스토리 막대의 시간에 해당하는 막대에서 시작해야합니다. 현재 TF 또는 주어진 TF 중 하나(더 적은 수가 있는 경우)는 해당 막대 및 시작 주기에서 가져옵니다. 동시에 새로운 막대의 모양을 포착하기 위해 한계도 올바르게 계산되어야 하며, 이는 완전한 재계산으로 이어지거나 현재 막대만 재계산됩니다(발생한 상황에 따라 - 새 막대 열기 , 또는 로드 기록).

평소처럼 한 번에 모든 것을 생각하려고 하고 너무 많은 생각을 하는 것 같기도 하고...

 
블라디미르 카르푸토프 :


AO에 대한 액세스 주기를 다시 실행합니다. "0"에서 일부 값으로 설정합니다(이제 일부 값에서 0으로). 오류가 나타나면 즉시 계산된 막대의 수("limit_p")와 현재 표시기의 Rates_total을 비교하십시오.


추가됨: 그리고 이 줄은 계산된 "제한"의 모든 노력을 지웁니다(비원시 기간을 참조하는 경우) .

대략적으로 말하자면, 처음에(비원시적 시간대를 언급할 때) "limit"는 156과 같게 되었고 BAM 이하가 되었습니다! "한도"는 이미 "154566666666"이 되었습니다.

예, 나는 서둘러 여기에 대해 망친 것에 대해 즉시 썼습니다.

그러나 나는 분명히 사이클을 다시 실행하지 않을 것입니다. 모든 것이 처음부터 끝까지 기록 계산을 기반으로 하는 다소 복잡한 지표가 있습니다. 완전히 다시 작성하는 것보다 한계를 다시 계산하고 정상적인 데이터 수신을 달성하는 것이 더 쉽습니다. 전체 표시기 - 모든 논리.

 
Artyom Trishkin :

아니요, 아직 시도하지 않았습니다. 나는 데이터의 관련성을 유지하는 것에 대해 보았고 기억합니다.

그러나 처음에는 주어진 TF와 현재 TF에 대한 데이터가 아직 동기화되지 않은 경우 OnCalculate()를 종료해야 합니다.

현재에 대해 명확합니다.

그것은 아주 옳지 않습니다. 표시기가 있는 터미널을 로드하기 시작하면 예상한 결과를 얻지 못할 수 있습니다. 낮과 연결이 끊긴 경우에도 방해가 될 수 있습니다.

OnCalculate() 종료 정보: 초기화 단계에서 Bars()에 대한 첫 번째 요청을 만든 다음 OnCalculate()에서 현재 및 필요한 TF의 동기화를 확인합니다. 동기화가 없으면 종료합니다.

 
Artyom Trishkin :

예, 나는 서둘러 여기에 대해 망친 것에 대해 즉시 썼습니다.

그러나 나는 사이클을 다시 만들지 않을 것입니다. 모든 것이 처음부터 끝까지 기록 계산을 기반으로하는 다소 복잡한 지표가 있습니다. 완전히 다시 작성하는 것보다 한계를 다시 계산하고 정상적인 데이터 수신을 달성하는 것이 더 쉽습니다. 전체 표시기 - 모든 논리.

Artyom, "처음부터 끝까지"은(는) 무슨 뜻인가요?

모든 어레이를 뒤집는 것이 최선의 방법이라고 생각하십니까?

무엇 때문에

 ArraySetAsSeries (Buffer, true );

값을 1개만 복사하면?

현재가 아닌 TF를 복사할 때 필요한 막대의 시간을 CopyBuffer() 함수 에 전달하는 것이 좋습니다. 그렇지 않으면 원하는 바가 복사되지 않습니다.

 
알렉세이 빅토로프 :

1. Artyom, "처음부터 끝까지"는 무엇을 의미합니까?

2. 모든 어레이를 뒤집는 것이 최선의 방법이라고 생각하십니까?

3. 왜

4. 값을 1개만 복사한다면?

현재가 아닌 TF를 복사할 때 필요한 막대의 시간을 CopyBuffer() 함수 에 전달하는 것이 좋습니다. 그렇지 않으면 원하는 바가 복사되지 않습니다.

1. 과거 데이터의 시작은 가장 짧은 개장 시간을 가진 역사상 가장 첫 번째 막대이고, 과거 데이터의 끝은 현재 막대입니다.

2. 나는 4에서 5로 다시 쓴다.

3. 음, 데이터가 rate_total-1에서 0까지의 주기로 Buffer[]에 기록되기 때문입니다. 시계열로 만들지 않으면 차트에서 디스플레이가 앞뒤로 표시됩니다.

4. 주어진 TF의 bar i의 데이터에 해당하는 한 번에 하나의 값을 복사합니다.

추신. mql4의 비 현재 TF에서 데이터를 가져오는 것이 얼마나 간결하고 쉬운지 확인하고 성공적으로 가져오고 모든 것이 의도한 대로 작동합니다. 그리고 mql5에서 지표 데이터를 수신하는 것이 얼마나 이상하고 어떤 식으로든 획득되지 않습니다. 지표가 작동하는 차트의 시간대에 해당하지 않는 시간대가 AO 데이터 수집 기능에 전달되면 항상 오류 4806이 발생합니다. .

 //+------------------------------------------------------------------+
double GetDataAO( string sy, int timeframe, int shift) {
   double array[ 1 ];
   ZeroMemory (array);
#ifdef __MQL4__
   array[ 0 ]= iAO (sy,timeframe,shift);
#else 
   ResetLastError ();
   if ( CopyBuffer (handle_ao, 0 ,shift, 1 ,array)== WRONG_VALUE ) {
       Print ( __FUNCTION__ , " > Error: " , GetLastError ());
       return ( 0 );
      }
#endif 
   return (array[ 0 ]);
}
//+------------------------------------------------------------------+

동시에 데이터를 수신해야 하는 설정에서 해당 TF가 선택된 OnInit()에서 표시기 핸들이 생성됩니다.

handle_ao= iAO (symbol,periodForWork);

즉, 항상 TF를 전환하는 방법에 관계없이 원하는(설정에서 선택한) TF로 핸들이 생성됩니다. 그러나 AO 데이터는 설정에서 선택한 TF가 현재 TF와 일치하는 경우에만 얻을 수 있습니다. 일치하지 않으면 함수에서 항상 0이 반환됩니다.

질문: 왜?

 
Artyom Trishkin :

1. 과거 데이터의 시작은 가장 짧은 개장 시간을 가진 역사상 가장 첫 번째 막대이고, 과거 데이터의 끝은 현재 막대입니다.

2. 나는 4에서 5로 다시 씁니다.

3. 음, 데이터가 rate_total-1에서 0까지의 주기로 Buffer[]에 기록되기 때문입니다. 시계열로 만들지 않으면 차트에서 디스플레이가 앞뒤로 표시됩니다.

4. 주어진 TF의 bar i의 데이터에 해당하는 한 번에 하나의 값을 복사합니다.

추신. mql4의 비 현재 TF에서 데이터를 가져오는 것이 얼마나 간결하고 쉬운지 확인하고 성공적으로 가져오고 모든 것이 의도한 대로 작동합니다. 그리고 mql5에서 지표 데이터를 수신하는 것이 얼마나 이상하고 어떤 식으로든 획득되지 않습니다. 지표가 작동하는 차트의 시간대에 해당하지 않는 시간대가 AO 데이터 수집 기능에 전달되면 항상 오류 4806이 발생합니다. .

동시에 데이터를 수신해야 하는 설정에서 해당 TF가 선택된 OnInit()에서 표시기 핸들이 생성됩니다.

즉, 항상 TF를 전환하는 방법에 관계없이 원하는(설정에서 선택한) TF로 핸들이 생성됩니다. 그러나 AO 데이터는 설정에서 선택한 TF가 현재 TF와 일치하는 경우에만 얻을 수 있습니다. 일치하지 않으면 함수에서 항상 0이 반환됩니다.

질문: 왜?

1. 그냥 설명입니다. 이제 우리가 같은 것에 대해 이야기하고 있다는 것이 분명합니다.

2. 나는 이것을 이해했지만 이것을 위해 어레이를 뒤집을 필요가 있다는 데 동의하지 않습니다. 두 개의 터미널에 대해 하나의 표시기가 필요합니까??? 2in1 낫과 도끼를 만드는 것과 거의 같습니다.

3. Buffer[] 는 CopyBuffer() 함수 에서 수신자가 1개의 표시기 값만 가져오는 데 사용하는 것으로 이해합니다.

4. 가장 중요한 것에 주의를 기울이지 않았습니다. 지표 값의 복사 시작은 막대 인덱스가 아니라 i번째 막대의 시간으로 결정해야 합니다.

 int    CopyBuffer ( 
   int        indicator_handle,     // handle индикатора 
   int        buffer_num,           // номер буфера индикатора 
   datetime   start_time,           // с какой даты 
   int        count,                 // сколько копируем 
   double     buffer[]               // массив, куда будут скопированы данные 
   );
사유: