'CopyTicks' 테스트 - 페이지 24

 
Alexey Kozitsyn :

왜요?

int    CopyTicks (
   string            symbol_name,           // имя символа
   MqlTick &         ticks_array[],         // массив для приёма тиков
   uint              flags = COPY_TICKS_ALL ,   // флаг, определяющий тип получаемых тиков
   ulong             from = 0 ,                 // дата, начиная с которой запрашиваются тики
   uint              count = 0                  // количество тиков, которые необходимо получить
   );
굵게 강조 표시했습니다. 끝까지 배열 - 기본값 거부.
 
fxsaber :
int    CopyTicks (
   string            symbol_name,           // имя символа
   MqlTick &         ticks_array[],         // массив для приёма тиков
   uint              flags = COPY_TICKS_ALL ,   // флаг, определяющий тип получаемых тиков
   ulong             from = 0 ,                 // дата, начиная с которой запрашиваются тики
   uint              count = 0                  // количество тиков, которые необходимо получить
   );
굵게 강조 표시했습니다.
눈에 띄지 않았지만 아마도 위에서 대답했을 것입니다 ...
 
fxsaber :
int    CopyTicks (
   string            symbol_name,           // имя символа
   MqlTick &         ticks_array[],         // массив для приёма тиков
   uint              flags = COPY_TICKS_ALL ,   // флаг, определяющий тип получаемых тиков
   ulong             from = 0 ,                 // дата, начиная с которой запрашиваются тики
   uint              count = 0                  // количество тиков, которые необходимо получить
   );
굵게 강조 표시했습니다. 끝까지 배열 - 기본값 거부.

예, 캐시의 눈금 크기는 설명서에서 명확하게 식별할 수 있습니다. 전체 캐시를 정확히 가져와야 하는 경우 설명서를 보고 다음과 같은 매개변수를 사용하여 함수로 필요한 수를 요청합니다.

int 복사 버퍼 (
    정수         Indicator_handle , // 표시기 핸들
    정수         buffer_num , // 표시 버퍼 번호
    정수         start_pos , // 시작 위치
    정수         count , // 복사할 양
    더블      완충기[]                // 데이터를 복사할 배열
);

결국, 왜 새로운 것을 발명하는지 이미 알아 냈습니까?

 
Alexey Kozitsyn :

기본 설정을 저장하는 것보다 날짜부터 로드하는 것이 훨씬 더 중요하다고 생각합니다.

그래서 그것은 날짜부터 날짜까지 될 것입니다. 이름에 Copy가 있다는 이유만으로 CopyTicks 구문을 Copy-functions에 맞추려고 하면 편리하지 않습니다. 편리하고 정당합니다. 이것은 다음과 같은 전처리기 작업을 할 수 있는 때입니다.

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
   class CLASS ##NAME                                                                                           \
  {                                                                                                           \
   public :                                                                                                     \
     static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
       return ((Copy ##FUNC((Symb == NULL ) ? _Symbol : Symb, _Period , iShift, 1 , tValue) > 0 ) ? tValue[ 0 ] : - 1 ); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                      \
    {                                                                                                         \
       return (CLASS ##NAME::Get(_Symbol, _Period , iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS ##NAME NAME;                                                                                           \
                                                                                                              \
  T i ##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
     return (CLASS ##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE( Volume , TickVolume, long )
DEFINE_TIMESERIE( Time , Time , datetime )
DEFINE_TIMESERIE( Open , Open , double )
DEFINE_TIMESERIE( High , High , double )
DEFINE_TIMESERIE( Low , Low , double )
DEFINE_TIMESERIE( Close , Close , double )
그리고 CopyTicks의 경우 이 작업을 수행할 수 없습니다. 두 개의 서로 다른 물리적 스트림(TRADE 및 INFO)과 하나의 합성(ALL) 플래그가 있습니다.
 
fxsaber :

그래서 그것은 날짜부터 날짜가 될 것입니다. 이름에 Copy가 있다는 이유로 CopyTicks 구문을 Copy-functions에 맞추려고 하면 편리하지 않습니다. 이와 같은 전처리기 작업을 수행할 수 있을 때 편리하고 정당합니다.

#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
   class CLASS ##NAME                                                                                           \
  {                                                                                                           \
   public :                                                                                                     \
     static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
       return ((Copy ##FUNC((Symb == NULL ) ? _Symbol : Symb, _Period , iShift, 1 , tValue) > 0 ) ? tValue[ 0 ] : - 1 ); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                      \
    {                                                                                                         \
       return (CLASS ##NAME::Get(_Symbol, _Period , iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS ##NAME NAME;                                                                                           \
                                                                                                              \
  T i ##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
     return (CLASS ##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE( Volume , TickVolume, long )
DEFINE_TIMESERIE( Time , Time , datetime )
DEFINE_TIMESERIE( Open , Open , double )
DEFINE_TIMESERIE( High , High , double )
DEFINE_TIMESERIE( Low , Low , double )
DEFINE_TIMESERIE( Close , Close , double )
그리고 CopyTicks의 경우 이 작업을 수행할 수 없습니다. 두 개의 서로 다른 물리적 스트림(TRADE 및 INFO)과 하나의 합성(ALL) 플래그가 있습니다.

당신이 포럼에 등장하기 전에 나는 그러한 글을 접하지 못했습니다. 물론 당신 덕분에 그렇습니다. 그러나 이런 종류의 글이 많은 프로그래머에게 반향을 일으킬지 확신하지 못합니다.

 
fxsaber :

데모에서는 실제로 그렇습니다. BCS에서 - 아니요

Network 'xxx' : authorized on BCS-MetaTrader5 through Access Server # 2 (ping: 46.66 ms)


2016.10 . 18 15 : 12 : 32.949 Test14 (Si- 12.16 ,M1)    Time: 29089 msc for 1503 records
2016.10 . 18 15 : 12 : 32.822 Test14 (Si- 12.16 ,M1)    Time: 33207 msc for 1501 records
2016.10 . 18 15 : 12 : 32.639 Test14 (Si- 12.16 ,M1)    Time: 21389 msc for 1500 records
2016.10 . 18 15 : 12 : 31.959 Test14 (Si- 12.16 ,M1)    Time: 21926 msc for 1500 records

와 알파리는 진짜 별로다

Network 'xxx' : authorized on Alpari-MT5 through mt5.nl. 3 (ping: 61.87 ms)

2016.10 . 18 15 : 14 : 47.159 Test14 (GBPUSD,M1)      Time: 31086 msc for 1836 records
2016.10 . 18 15 : 14 : 46.999 Test14 (GBPUSD,M1)      Time: 30698 msc for 1836 records
2016.10 . 18 15 : 14 : 46.779 Test14 (GBPUSD,M1)      Time: 46306 msc for 1836 records
2016.10 . 18 15 : 14 : 46.612 Test14 (GBPUSD,M1)      Time: 30440 msc for 1836 records
2016.10 . 18 15 : 14 : 46.532 Test14 (GBPUSD,M1)      Time: 36227 msc for 1836 records

그는 Kopitiks의 불편에 대해 위에서 말했습니다. 표시된 표시기는 CopyTix를 여러 번 호출해야 하기 때문에 느려집니다. 그리고 모든 브레이크는 그 때문이다. 그리고 여기 일이 있습니다

솔루션이 제안되었습니다

이제 날짜 사이의 틱을 다운로드하려면 초기 날짜부터 시작하여 UNKNOWN의 틱 수를 요청해야 합니다. 그런 다음 종료 날짜에 도달했는지 매번 확인하십시오. 그리고 각 복사 요청이 매우 비싸고 이러한 브레이크가 획득된다는 사실을 고려합니다.

실제 오프닝의 데이터, 신선한 틱만 로드:

2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получено 4 тиков за 46 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получено 3 тиков за 20 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получено 3 тиков за 19 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.499 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получено 8 тиков за 107 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получено 5 тиков за 18 мкс (пинг = 62214 мкс)
2016.10 . 20 18 : 47 : 06.540 GetTickHistory: Получены все доступные тики. Время [ 0 ]: 2016.10 . 20 16 : 47
COPY_TICKS_TRADE!
 
CopyTicks()가 비동기 함수인 것 같습니까? Tiki는 종종 아직 열지 않은 양초를 위해 도착합니다...
 
Alexey Kozitsyn :
CopyTicks()가 비동기 함수인 것 같습니까?
네.
 
테스터에서 CopyTicks()가 어떻게 진행되고 있는지 개발자들에게 듣고 싶습니다... 나는 이것에 대해 약간의 의심이 있습니다. 다시 COPY_TICKS_TRADE와 협력하는 데 관심이 있습니다!
 

터미널을 고문했습니다. 스크립트

void OnStart ()
{
   MqlTick Ticks[];
  
   Print ( CopyTicks ( _Symbol , Ticks));
   Print ( GetLastError ());
}

멈춘다. 수동 삭제 로그

2016.10 . 28 16 : 48 : 57.737 Test (GBPUSD,M1)         4401
2016.10 . 28 16 : 48 : 57.737 Test (GBPUSD,M1)        - 1

TF 및 기호 변경 - 유사합니다. 재부팅 후 작동했습니다.