Test des "CopyTicks". - page 24

 
Alexey Kozitsyn:

Pourquoi ?

int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Surligné en gras. Le tableau à la fin est un rejet des valeurs par défaut.
 
fxsaber:
int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Surligné en gras.
Non souligné, mais probablement répondu ci-dessus...
 
fxsaber:
int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Je l'ai mis en gras. Tableau à la fin - éviter les valeurs par défaut.

Oui, la taille des ticks dans le cache peut être allouée explicitement dans la documentation. Si vous voulez obtenir le cache entier - regardez la documentation et demandez le nombre requis avec la fonction, avec des paramètres comme ici :

intCopyBuffer(
intindicator_handle,// manche de l'indicateur
intbuffer_num,// numéro de tampon de l'indicateur
intstart_pos,//où commencer
intcount,// combien nous copions
doublebuffer[]// tableau où les données seront copiées
) ;

Tout a déjà été inventé, pourquoi inventer quelque chose de nouveau ?

 
Alexey Kozitsyn:

Je pense qu'il est bien plus important d'effectuer un téléchargement à jour que d'essayer de conserver les paramètres par défaut.

Donc, de date en date, ce sera. Les CopyTicks qui tentent de correspondre en syntaxe aux fonctions de copie uniquement en raison de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié lorsque vous pouvez faire des trucs de préprocesseur comme ceci

// Позволяет, как в 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)
Et vous ne pouvez pas le faire pour CopyTicks car il y a deux threads physiques différents (TRADE et INFO) et un thread synthétique (ALL) - drapeaux.
 
fxsaber:

Donc, de date en date, ce sera. Les CopyTicks qui essaient de faire correspondre la syntaxe des fonctions de copie juste à cause de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié quand on peut faire des trucs de préprocesseur comme ça.

#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)
Et pour CopyTicks ce genre de chose ne peut pas être fait, car il y a deux fils physiques différents (TRADE et INFO) et un synthétique (ALL) - drapeaux.

Avant que vous n'apparaissiez sur le forum, je n'avais jamais rencontré cette façon d'écrire, pour laquelle je vous remercie bien sûr, mais je ne suis pas sûr que beaucoup de programmeurs la trouveraient utile.

 
fxsaber:

Sur votre démo, c'est en effet le cas. Sur BCS, ce n'est pas le cas.

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

Et sur Alpari, ce n'est pas bon du tout.

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

J'ai parlé plus haut des inconvénients de Copytix. L'indicateur présenté est ralenti par le fait que je dois appeler copytix plusieurs fois. Et tous les décalages sont dus à ça. Le point est le suivant

La solution a été proposée.

Maintenant, pour télécharger des ticks entre deux dates, vous devez faire des demandes pour N'IMPORTE QUEL nombre de ticks, à partir de la date de départ. Et puis regarder à chaque fois, et si elle a atteint la date limite. Et étant donné que chaque demande de copytix est très coûteuse, et que vous obtenez de tels freins.

Données provenant d'une ouverture réelle, seuls les ticks frais sont chargés :

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() semble être une fonction asynchrone ? Souvent, les ticks arrivent pour des chandeliers qui ne se sont pas encore ouverts...
 
Alexey Kozitsyn:
CopyTicks() semble être une fonction asynchrone ?
Oui.
 
J'aimerais avoir l'avis des développeurs sur CopyTicks() dans le testeur... J'ai de mauvais soupçons à ce sujet. Je suis de nouveau intéressé à travailler avec COPY_TICKS_TRADE !
 

Fatigué du terminal. Le scénario

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

les hangars. En le supprimant manuellement, vous le déconnecterez.

2016.10.28 16:48:57.737 Test (GBPUSD,M1)        4401
2016.10.28 16:48:57.737 Test (GBPUSD,M1)        -1

Changement de TF et de symbole - similaire. Après le redémarrage, cela fonctionne.