오류, 버그, 질문 - 페이지 3031

 
Igor Makanu :

내 코드는 다음과 같이 작성한 표시기 번호 1만 " 모든 틱 에서 타작"합니다.

이렇게 하면 터미널이 "선임 TF"를 독립적으로 구축할 수 있습니다.

저에게는 "이전 시간대"의 기록을 동기화할 때 코드에서 발생하는 표시기 1번의 완전한 재계산을 수행하는 것보다 "저렴합니다"

예, 하지만 낮은 기간에 prev calc가 재설정되는 이유는 무엇입니까?

 
Andrey Dik :

예, 하지만 낮은 기간에 prev calc가 재설정되는 이유는 무엇입니까?

0을 반환하기 때문에;
 
Andrey Dik :

예, 하지만 낮은 기간에 prev calc가 재설정되는 이유는 무엇입니까?

많은 옵션, 우리는 구현을 모릅니다


작년에 MT4에서 비슷한 토론이 있었고 개발자 중 한 명(Slava 생각)은 "상급 TF"에 대한 각 호출이 필요한 경우 데이터 동기화 를 시작한다고 말했습니다....

나는 MT5에서 터미널이 필요한 경우 독립적으로 TF를 구축한다고 생각하지만 네트워크 지연이 있거나 ..... 구현을 알지 못합니까? ... 터미널, 이전 TF의 표시기에 데이터를 제공하기 전에 , 이것이 즉시 발생하면 서버와 기록 데이터를 동기화하고 아마도 오랜 시간 동안 prev_calculated = 0이 될 것입니다.

 
Igor Makanu :

많은 옵션, 우리는 구현을 모릅니다

다운로드가 하위 TF의 기록 데이터를 변경하면 하위 TF의 카운터는 터미널 자체에 의해 강제로 0으로 재설정되므로 갑자기 문제를 일으킬 필요가 없습니다.

 
Andrey Dik :

내 말을 확인했구나, 동지.

나는 인코더의 친구가 아닙니다. 이것은 확인이 아니라 힌트입니다. 0을 반환하지 마십시오. 여기에서 모든 문제가 발생합니다. 당신은 지표의 전체 재계산을 호출합니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

안드레이 딕 , 2021.05.28 17:26

prev calc는 다음 막대에서 1만큼 증가하지 않습니다.


prev_calculated는 전혀 증가하지 않으며, 계산이 끝날 때 반환되는 것과 항상 동일합니다.

 return (rates_total);


저것들. OnCalculated() 종료 시 반환되는 것은 prev_calculated의 다음 틱에서 얻을 수 있는 것입니다( prev_calculated == 0 제외, 이것은 표시기가 시작되거나 TF가 동기화될 때 터미널이 수행하는 작업입니다. )


Andrei Trukhanovich :

다운로드가 하위 TF의 기록 데이터를 변경하면 하위 TF의 카운터는 터미널 자체에 의해 강제로 0으로 재설정되므로 갑자기 문제를 일으킬 필요가 없습니다.

글쎄, 나는 이틀 동안 이것에 대해 그에게 편지를 쓰고있다 - Mladen의 지표를 가져 와서 연구 - 그들은 작동하고 TF 간의 복잡한 동기화없이 작동하며 여기 ... 우리는 리소스를 절약하고 터미널이 호출 된 TF를 형성하지 못하게합니다.

 
Andrei Trukhanovich :

바꾸다

그리고 테스트.

말하지 마... 어쨌든 당신은 그것을 믿지 않을 것입니다.

 
Alexey Viktorov :

나는 ... 인코더는 친구가 아닙니다. 이것은 확인이 아니라 힌트입니다. 0을 반환하지 마십시오. 여기에서 모든 문제가 발생합니다. 당신은 지표의 전체 재계산을 호출합니다.

어리석은 사람은 말할 수 있지만 모든 사람이 자세히 이해하고 도울 수 있는 것은 아닙니다.

 
Andrei Trukhanovich :

바꾸다

그리고 테스트.

안드레이 감사합니다. 당신은 질문을 완전히 이해한 유일한 사람입니다.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) 기간 3의 지표는 아직 계산되지 않았습니다.

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) 기간 3의 지표는 아직 계산되지 않았습니다.

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262초, 50046바 계산, 총 50046바

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693초, 계산된 50000바, 총 50000바

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) 기간 3의 지표는 아직 계산되지 않았습니다.

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000초, 계산된 1개 막대, 총 막대 50047개

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015초, 1개 막대 계산, 총 50001개 막대

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007초, 계산된 1개 막대, 총 50002개 막대

이제 모든 것이 의도한 대로 작동하고 지표는 첫 번째 실행 시 한 번만 완전히 계산된 다음 새 막대에서 각각 한 번만 계산됩니다.


두 번째 표시기의 최종 코드는 내가 원하는 사람에게 유용할 것입니다.

 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 &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if ( SeriesInfoInteger ( Symbol (), OldTF, SERIES_SYNCHRONIZED ))
   {
       if ( iBars ( Symbol (), OldTF) != BarsCalculated (Handle))
      {
         Print ( "Индикатор на периоде " , OldTF, " ещё не рассчитан" );
         return prev_calculated;
      }
   }
   else 
   {
     Print ( "Период " , OldTF, " не синхронизирован." );
     return prev_calculated;
   }

   ArraySetAsSeries (high, true );
   ArraySetAsSeries (time, true );

   int limit = rates_total - prev_calculated - 1 ;

   double buff [];
   int ind = 0 ;
   for ( int i = limit; i >= 0 ; i--)
   {
      ind = iBarShift ( Symbol (), OldTF, time [i], false );
       if ( CopyBuffer (Handle, 0 , ind, 1 , buff) != - 1 )
      {
        IBuffer [i] = buff [ 0 ];
      }
       else
      {
         Print ( "Ошибка копирования буфера " , GetLastError ());
         return 0 ;
      }
   }

   //----------------------------------------------------------------
   double e = ( GetMicrosecondCount () - t) / 1000000.0 ;
   Print ( DoubleToString (e, 6 ), " sec, расcчитано " , rates_total - prev_calculated, " баров, всего баров " , rates_total);
   return (rates_total);
}
 
Andrey Dik :

어리석은 사람은 말할 수 있지만 모든 사람이 자세히 이해하고 도울 수 있는 것은 아닙니다.

그들이 당신에게 얼마나 많은 바보를 말하는지 세십시오 ... 현명한 사람은 아무도 듣지 않고 쉬었습니다 ... ... ... ...

Andrei Trukhanovich 의 조언을 확장할 수 있는 곳이 있고 모든 것이 바보에게 분명합니다. 스스로 문제를 만들고 ... 코드를 mql 버그로 노출하려고 합니다.