'CopyTicks' 테스트 - 페이지 41

 
CopyTicksRange가 요청된 모든 틱을 올바르게 반환하지만 LastError == ERR_HISTORY_TIMEOUT(4403)일 때 버그가 발생했습니다.


 
fxsaber :

tkc 파일은 월별로 분류됩니다. 이에 대한 질문

  1. 틱 데이터가 아직 터미널에 다운로드되지 않은 경우 CopyTicks가 호출될 때 터미널은 어떤 tkc 파일을 가져올지 어떻게 압니까?
현재 항목부터 시작하여 매달 당깁니다.
  1. CopyTicksRange는 CopyTicks를 기반으로 합니까 아니면 독립 실행형입니까?
CopyTicks를 기반으로 합니다. 전혀 최적화되지 않았습니다.
  1. 예를 들어, CopyTicksRange를 사용하면 CopyTicksRange를 사용하는 것이 항상 9월에 대한 틱을 얻는 것이 더 빠를 것이라는 것을 올바르게 이해하고 있습니까? CopyTicks는 입력 매개변수를 통해 어떤 월 데이터를 가져와야 하는지 알지 못합니까?

아니요, CopyTicksRange는 위의 요점 때문에 느릴 것입니다. 다음은 현재 CopyTicksRange 구현의 불합리함을 보여주는 스크립트입니다.

 #define TOSTRING(A) #A + " = " + ( string )(A)

void OnStart ()
{  
  
   MqlTick Ticks[];
  
   ResetLastError ();
  
   Print ( __FUNCTION__ );
   Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , 1 , 2 )));
   Print (TOSTRING( _LastError ));
}

어떤 tkc 파일을 가져와야 하는지에 대한 정보가 명확하게 제공되는 것 같습니다. 그러나 아니요, CopyTicks와 같은 방식으로 모든 tkc 파일을 가져옵니다. 그리고 시간 초과에 대한 작업을 중지합니다. 사실 거의 즉시 작동했어야 했지만.

  1. 가능한 한 빨리 지표에서 이력을 가져와야 합니다. CopyTicksRange를 통해 요청하고 모든 것이 다운로드될 때까지 -1 형식으로 쿵쾅거릴 수 있습니다. 그리고 한 달을 묻는 경우: 현재, 이전 등 속도는 느려지지 않지만 동시에 표시기는 적어도 일부 기록으로 작동할 준비가 됩니다. 권리?

차이가 없음이 밝혀졌습니다(위의 단락 참조).

 

CopyTicks는 UninitializeReason != REASON_CHARTCHANGE 인 경우 OnDeinit에서 작동하지 않습니다.

 #define TOSTRING(A) ( #A + " = " + ( string )(A))

void TickTest()
{
   MqlTick Ticks[];

   ResetLastError ();
   Print (TOSTRING( CopyTicks ( _Symbol , Ticks)));
   Print (TOSTRING( _LastError ));
}

void OnInit ()
{
   Print ( "\n" + __FUNCTION__ );
  
  TickTest();
}

void OnDeinit ( const int )
{
   Print ( "\n" + __FUNCTION__ );
   Print (TOSTRING( UninitializeReason ()));
  
  TickTest();
}


결과(전문가 제거 후)

 OnInit
CopyTicks ( _Symbol ,Ticks) = 2000
_LastError = 0

OnDeinit
UninitializeReason () = 1
CopyTicks ( _Symbol ,Ticks) = - 1
_LastError = 4401


위협 이것은 고문에서 발생합니다. 표시기에서 OnDeinit의 CopyTicks는 잘 작동합니다.

 
계정( 다른 거래 서버 )을 변경할 때 이전 계정의 마지막 2000틱을 파일에 기록해야 합니다 . 그것을 하는 방법?


그것은 작동하지 않습니다

 void OnDeinit ( const int )
{
   MqlTick Ticks[];

   CopyTicks ( _Symbol , Ticks); // Если была смена торгового сервера, то БД-тиков поменялась

   FileSave ( __FILE__ , Ticks);
}


계정을 변경하기 전에 CHARTEVENT_ACCOUNTCLOSING 이벤트를 생성하도록 요청합니다. 이 이벤트는 OnChartEvent에서 전체 거래 환경이 아직 새 환경으로 전환되지 않은 상태입니다.

 
fxsaber :
계정( 다른 거래 서버 )을 변경할 때 이전 계정의 마지막 2000틱을 파일에 기록해야 합니다 . 그것을 하는 방법?


그것은 작동하지 않습니다


계정을 변경하기 전에 CHARTEVENT_ACCOUNTCLOSING 이벤트를 생성하십시오. 처리 중(OnChartEvent에서) 전체 거래 환경이 아직 새 환경으로 전환되지 않았습니다.

마음에 따르면 동일한 Windows에서 수행되는 것처럼 피드백을 추가해야 합니다.

차트(또는 비차트) 이벤트에 플래그 형태로 설정되면 이벤트 자체(이 경우 계정 전환)가 취소됩니다.

 

예리하게 말하지만 버그에 대한 수십 개의 보고서가 수정되고 새로운 것이 계속 나타나며 이 CopyTicks와 함께 나타나는 상황이 높아졌습니다.

그런 농담에 지쳐

 #define TOSTRING(A) ( #A + " = " + ( string )(A))

void OnStart ()
{
   MqlTick Ticks[];

   if ( CopyTicks ( _Symbol , Ticks, COPY_TICKS_ALL , 0 , 131072 + 1 ) > 0 ) // Если прибавлять не единицу, а ноль, то все будет работать
  {
     const ulong BeginTime = Ticks[ 0 ].time_msc;
    
     Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , BeginTime, LONG_MAX )));
     Print (TOSTRING( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , BeginTime, ( TimeCurrent () + 1 ) * 1000 )));
  }
}


결과

 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime, LONG_MAX ) = 0
CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime,( TimeCurrent ()+ 1 )* 1000 ) = 131073


소스에서 장치 제거

 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime, LONG_MAX ) = 131072
CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO ,BeginTime,( TimeCurrent ()+ 1 )* 1000 ) = 131072


다른 기호 및 거래 서버에서 재생할 수 있습니다. 쉬는 날 확인 - 따옴표가 서 있습니다.


이 주제의 버그를 언제 제거할 수 있습니까?

 

실제로 언어의 이러한 흥미로운 기능은 그루터기 데크를 통해 작동합니다 ...

질문입니다. 기호 메뉴를 통해 핸들이 있는 로드된 눈금(685,007개). 2016.11.01 00:00 부터 2016.11.08 00:00 까지 EURUSD가 필요합니다. 여기 스크린샷이 있습니다.



나는 프로그래밍 방식으로 다음과 같이 묻습니다.

 void OnStart ()
  {
   string symbol= "EURUSD" ;
   MqlTick ticks_array[];
   uint flags= COPY_TICKS_INFO ;
   ulong from_msc,to_msc;
   from_msc=( ulong ) D'01.11.2016 00:00' ;
   to_msc=( ulong ) D'08.11.2016 00:00' ;
//--- получить тики - 20 попыток
   for ( int att= 0 ;att< 20 ;att++)
     {
       int copied= CopyTicksRange (symbol,ticks_array,flags,from_msc,to_msc);
       if (copied> 0 )
         break ;
       Sleep ( 100 );
     }
//--- остановка
   DebugBreak ();
  }


출력은 0입니다. 무엇이 잘못되었나요?

 
Dennis Kirichenko :

출력은 0입니다. 무엇이 잘못되었나요?

from과 to를 1000으로 곱합니다.

 
fxsaber :

from과 to를 1000으로 곱합니다.


젠장, 부끄럽다, 보고했다. 고맙습니다.

 
이 CopyTicksRange 버그를 현지화하는 데 많은 시간을 낭비했습니다.


 template < typename T>
T MyPrint( const T Value, const string Str )
{
   static const bool IsDebug = MQLInfoInteger ( MQL_DEBUG );

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

     Print (Str + " = " + ( string )Value);
  }
  
   return (Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + ( string ) __LINE__ + ": " + #A)

int GetSymbolTicks( const string Symb, MqlTick &Ticks[] )
{
   const bool Selected = SymbolInfoInteger (Symb, SYMBOL_SELECT );

   const int Amount = SymbolInfoInteger (Symb, SYMBOL_CUSTOM ) && (Selected || SymbolSelect (Symb, true )) ? _P( CopyTicksRange (Symb, Ticks, COPY_TICKS_INFO )) : - 1 ; // здесь баг!
  
   if (!Selected)
     SymbolSelect (Symb, false );

   return (Amount);
}

bool TicksToSymbol( const string Symb, const MqlTick &Ticks[] )
{
   const int Size = ArraySize (Ticks);
  
   CustomTicksDelete (Symb, Ticks[ 0 ].time_msc, Ticks[Size - 1 ].time_msc);
  
   return (Size ? (_P( CustomTicksReplace (Symb, Ticks[ 0 ].time_msc, Ticks[Size - 1 ].time_msc, Ticks)) > 0 ) : false );
}

void OnStart ()
{
   MqlTick Ticks[];
    
   if ( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , D'2017.12.01' * 1000 , ( TimeCurrent () + 1 ) * 1000 ) > 100 ) // Если поставить сегодня - D'2017.12.05', то баг не проявится
  {
     ArrayResize (Ticks, 100 );
    
     static const string Name = _Symbol + "_Custom" ;
    
     CustomSymbolDelete (Name);
    
     if ( CustomSymbolCreate (Name) && CustomSymbolSetInteger (Name, SYMBOL_DIGITS , _Digits ))
    {    
      TicksToSymbol(Name, Ticks);
    
       MqlTick Ticks2[];
      
      GetSymbolTicks(Name, Ticks2);
    }

     CustomSymbolDelete (Name);
  }
}

EURUSD M1 MetaQuotes-Demo에서 처음 실행한 후 올바른 결과를 얻었습니다.

 bool TicksToSymbol( const string , const MqlTick &[]), Line = 36 : CustomTicksReplace (Symb,Ticks[ 0 ].time_msc,Ticks[Size- 1 ].time_msc,Ticks) = 100
int GetSymbolTicks( const string , MqlTick &[]), Line = 22 : CopyTicksRange (Symb,Ticks, COPY_TICKS_INFO ) = 100


모든 후속 실행에는 버그가 표시됩니다.

 bool TicksToSymbol( const string , const MqlTick &[]), Line = 36 : CustomTicksReplace (Symb,Ticks[ 0 ].time_msc,Ticks[Size- 1 ].time_msc,Ticks) = 100
int GetSymbolTicks( const string , MqlTick &[]), Line = 22 : CopyTicksRange (Symb,Ticks, COPY_TICKS_INFO ) = 0


터미널을 다시 시작한 후 상황이 반복됩니다. 첫 번째 실행은 훌륭하고 다음 실행은 버그입니다.


PS 출처에서 강조 표시된 댓글에 주목하세요!

사유: