Bugs et suggestions pour améliorer CopyTicks() et CopyTicksRange() après la build 1485.

 

Continuer à se battre pour améliorer : les tiques, l'accès aux tiques et la synchronisation des tiques. @Slawa, @Renat Fatkhullin et les personnes responsables des tiques, veuillez rejoindre la discussion. Je pense que nous trouverons plus d'une erreur. Je pense également que ce sera intéressant pour @fxsaber, @coderex et d'autres utilisateurs de tics.

Commençons :

1. Il n'y a pas un mot sur la nouvelle fonction CopyTicksRange() dans la documentation de ME build 1486. Le site web n'est pas très utile. Ajoutez-le à la documentation des éditeurs, s'il vous plaît ;

2. Lorsque l'on essaie de demander des ticks via CopyTicksRange() :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

Nous obtenons constamment -1 et l'erreur #4401 "requested history not found". Et ça devrait être comme ça :

Если параметр to_msc не указан, то отдаются все тики до конца истории.

Le code est entièrement ci-dessous :

//+------------------------------------------------------------------+
//|                                          test_CopyTicksRange.mq5 |
//|                                                         Tapochun |
//|                           https://www.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link      "https://www.mql5.com/ru/users/tapochun"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//---
#include <errordescription.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input datetime inpStartTime=__DATE__;   // Время начала загрузки истории
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   if(prev_calculated<=0)
     {
      //---
      UseCopyTicksRange();
      //---
      UseCopyTicks();
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void UseCopyTicksRange()
  {
   MqlTick ticks[];
//--- Замеряем время старта перед получением тиков
   ulong start=GetMicrosecondCount();
//--- Запрашиваем тиковую историю
   int copied=CopyTicksRange(_Symbol,ticks,COPY_TICKS_TRADE,inpStartTime*1000);
//--- Рассчитаем, за сколько мс получена история
   ulong msc=GetMicrosecondCount()-start;
//--- Проверяем количество скопированных тиков
   if(copied>0) // Если история получена
     {
      //--- Выведем информацию о количестве тиков и затраченном времени
      Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс");
      //--- Проверка синхронизации тиковой истории
      if(GetLastError()==0) // Если история синхронизирована
        {
         //--- Выходим
         return;
        }
      else                                     // Если история рассинхронизирована - сообщение
        {
         Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс. Тики еще не синхронизированы!");
         return;
        }
     }
   else if(copied==0) // Если получено 0 тиков - сообщение
      Print(__FUNCTION__,": ВНИМАНИЕ! Получено 0 тиков. Возможно установлен некорректный параметр from ("+
            TimeToString(inpStartTime,TIME_DATE|TIME_SECONDS)+".",inpStartTime*1000%1000,"). Текущее время "+TimeToString(TimeCurrent()));
   else                                        // Если тики не получены - ошибка
   Print(__FUNCTION__,": ОШИБКА #",GetLastError()," ("+ErrorDescription(_LastError)+"). Тики не получены!");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void UseCopyTicks()
  {
   MqlTick ticks[];
//--- Замеряем время старта перед получением тиков
   ulong start=GetMicrosecondCount();
//--- Запрашиваем тиковую историю
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_TRADE,inpStartTime*1000,10000000);
//--- Рассчитаем, за сколько мс получена история
   ulong msc=GetMicrosecondCount()-start;
//--- Проверяем количество скопированных тиков
   if(copied>0) // Если история получена
     {
      //--- Выведем информацию о количестве тиков и затраченном времени
      Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс");
      //--- Проверка синхронизации тиковой истории
      if(GetLastError()==0) // Если история синхронизирована
        {
         //--- Выходим
         return;
        }
      else                                     // Если история рассинхронизирована - сообщение
        {
         Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс. Тики еще не синхронизированы!");
         return;
        }
     }
   else if(copied==0) // Если получено 0 тиков - сообщение
      Print(__FUNCTION__,": ВНИМАНИЕ! Получено 0 тиков. Возможно установлен некорректный параметр from ("+
            TimeToString(inpStartTime,TIME_DATE|TIME_SECONDS)+".",inpStartTime*1000%1000,"). Текущее время "+TimeToString(TimeCurrent()));
   else                                        // Если тики не получены - ошибка
   Print(__FUNCTION__,": ОШИБКА #",GetLastError()," ("+ErrorDescription(_LastError)+"). Тики не получены!");
  }
//+------------------------------------------------------------------+

CopyTicks() renvoie un résultat correct.

Dossiers :
 

Il n'y a aucun moyen d'obtenir l'histoire du tout. J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

La réponse est toujours la même :

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Essayé sur les futures VTBR-12.16, BR-12.16, RTS-12.16. Essayé sur les ticks COPY_TICKS_ALL - même résultat. Chers développeurs, êtes-vous en train de troller les utilisateurs ? Ou bien vous vous ennuyez tout simplement à tester vos développements avant leur diffusion ?

 
Si vous exécutez l'indicateur sur chaque tick - même résultat. Aucun historique n'est reçu.
 
L'histoire de la tique sur le symbole n'a pas aidé.
 
Alexey Kozitsyn:

Il n'y a aucun moyen d'obtenir l'histoire du tout. J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

La réponse est toujours la même :

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Essayé sur les futures VTBR-12.16, BR-12.16, RTS-12.16. Essayé sur les ticks COPY_TICKS_ALL - même résultat. Chers développeurs, êtes-vous en train de troller les utilisateurs ? Ou bien vous vous ennuyez tout simplement à tester vos développements avant leur diffusion ?

 

Démotivateur C'est la 100e modification et ça ne fonctionne toujours pas...

http://demotivatorium.ru/sstorage/3/2012/03/2703120956251657.jpg
 
Alexey Kozitsyn:

Il n'y a aucun moyen d'obtenir l'histoire du tout. J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

J'ai essayé ça :

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

La réponse est toujours la même :

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Essayé sur les futures VTBR-12.16, BR-12.16, RTS-12.16. Essayé sur les ticks COPY_TICKS_ALL - même résultat. Chers développeurs, êtes-vous en train de troller les utilisateurs ? Ou bien vous vous ennuyez tout simplement à tester vos développements avant leur diffusion ?

 

Celui qui ne travaille pas, mange l'étudiant

https://www.youtube.com/watch?v=yMit_zQnqlo

 

Je pense que c'est juste un bug dans la documentation Web, c'est vraiment encore vierge dans ME. Ou la fonction est encore en cours de développement. Deuxièmement, vous demandez des données de quelque part à partir de 1970 et vous vous demandez pourquoi les tics du siècle dernier ne donnent pas de retour :) !!!) Qu'est-ce que vous fumez là ?

C'est comme ça que ça marche.

void OnStart()
{
    datetime dt1 = D'2016.11.28 00:00:00', dt2 = D'2016.11.30 00:00:00';
    MqlTick ticks[];
    ulong start, msc;
    //--- Замеряем время старта перед получением тиков
    start=GetMicrosecondCount();
    int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_ALL, dt1*1000, dt2*1000);
//--- Рассчитаем, за сколько мс получена история
    msc=GetMicrosecondCount()-start;
    Print("copied=", copied, "   msc=", msc);
    return;
}

// вывод
2016.12.01 04:52:08.134 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=1294871
2016.12.01 04:52:16.877 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=318596

***

 
Alexey Volchanskiy:

Je pense que c'est juste un bug dans la documentation Web, ce n'est vraiment pas encore dans ME. Ou la fonction est encore en cours de développement. Deuxièmement, vous demandez des données de quelque part à partir de 1970 et vous vous demandez pourquoi les tics du siècle dernier ne donnent pas de retour :) !!!) Qu'est-ce que vous fumez là ?

C'est comme ça que ça marche.

void OnStart()
{
    datetime dt1 = D'2016.11.28 00:00:00', dt2 = D'2016.11.30 00:00:00';
    MqlTick ticks[];
    ulong start, msc;
    //--- Замеряем время старта перед получением тиков
    start=GetMicrosecondCount();
    int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_ALL, dt1*1000, dt2*1000);
//--- Рассчитаем, за сколько мс получена история
    msc=GetMicrosecondCount()-start;
    Print("copied=", copied, "   msc=", msc);
    return;
}

// вывод
2016.12.01 04:52:08.134 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=1294871
2016.12.01 04:52:16.877 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=318596

***

Alexey, merci de vous impliquer dans les tests. Comme vous pouvez le voir, j'ai essayé à la fois à partir d'une date spécifique, vers une date spécifique et sans date. Mais le fait est que : 1. j'ai utilisé __DATE__ et il semble y avoir des problèmes avec les substitutions de macro ; 2. j'ai testé sur des futures ; Oui, si vous regardez la documentation - il aurait dû au moins commencer à charger les ticks. Cependant, rien ne se passe.

Avez-vous essayé d'exécuter mon indicateur dans votre environnement ?