Errores y sugerencias para mejorar CopyTicks() y CopyTicksRange() después de la compilación 1485.

 

Seguir luchando para mejorar: las garrapatas, el acceso a ellas y la sincronización de las mismas. @Slawa, @Renat Fatkhullin y los responsables de las garrapatas, por favor, únanse al debate. Creo que encontraremos más de un error. Además, creo que será interesante para @fxsaber, @coderex y otros usuarios de garrapatas.

Comencemos:

1. No hay ni una palabra sobre la nueva función CopyTicksRange() en la documentación de ME build 1486. No es muy útil desde la página web. Añádelo a la documentación del editor, por favor;

2. Al intentar solicitar ticks mediante CopyTicksRange():

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

Constantemente obtenemos -1 y el error #4401 "historial solicitado no encontrado". Y debería ser así:

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

El código está completamente abajo:

//+------------------------------------------------------------------+
//|                                          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() devuelve el resultado correcto.

Archivos adjuntos:
 

No hay manera de conseguir la historia en absoluto. He probado esto:

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

He probado esto:

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

Probé esto:

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

Probé esto:

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

La respuesta es siempre la misma:

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 мкс

Probado en futuros VTBR-12.16, BR-12.16, RTS-12.16. Probado en ticks COPY_TICKS_ALL - mismo resultado. Estimados desarrolladores, ¿están tropezando con los usuarios? ¿O simplemente se aburre de probar sus desarrollos antes de lanzarlos?

 
Si se ejecuta el indicador en cada tic - el mismo resultado. No se recibe ningún historial.
 
El hecho de que la historia de la garrapata esté en el símbolo no ayudó.
 
Alexey Kozitsyn:

No hay manera de conseguir la historia en absoluto. He probado esto:

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

He probado esto:

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

Probé esto:

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

Probé esto:

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

La respuesta es siempre la misma:

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 мкс

Probado en futuros VTBR-12.16, BR-12.16, RTS-12.16. Probado en ticks COPY_TICKS_ALL - mismo resultado. Estimados desarrolladores, ¿están tropezando con los usuarios? ¿O simplemente se aburre de probar sus desarrollos antes de lanzarlos?

 

Demotivator Es la 100ª modificación y sigue sin funcionar...

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

No hay manera de conseguir la historia en absoluto. He probado esto:

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

He probado esto:

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

Probé esto:

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

Probé esto:

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

La respuesta es siempre la misma:

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 мкс

Probado en futuros VTBR-12.16, BR-12.16, RTS-12.16. Probado en ticks COPY_TICKS_ALL - mismo resultado. Estimados desarrolladores, ¿están tropezando con los usuarios? ¿O simplemente se aburre de probar sus desarrollos antes de lanzarlos?

 

El que no trabaja, come estudiante

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

 

Creo que es sólo un error en la documentación de la web, realmente sigue en blanco en ME. O la función está todavía en desarrollo. ¡¡¡En segundo lugar, solicitas datos de algún lugar a partir de 1970 y te preguntas por qué las garrapatas del siglo pasado no te devuelven )!!! ¿Qué estás fumando ahí?

Así es como funciona.

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:

Creo que es un error en la documentación de la web, realmente no está en ME todavía. O la función está todavía en desarrollo. ¡¡¡En segundo lugar, solicitas datos de algún lugar a partir de 1970 y te preguntas por qué las garrapatas del siglo pasado no te devuelven )!!! ¿Qué estás fumando ahí?

Así es como funciona.

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, gracias por participar en las pruebas. Como puedes ver, he probado tanto desde una fecha concreta como hasta una fecha concreta y sin fecha. Pero la cuestión es: 1. Utilicé __DATE__ y parece que hay problemas con las sustituciones de macros; 2. Probé en futuros; Sí, si miras la documentación - al menos debería haber empezado a cargar ticks. Sin embargo, no pasa nada.

¿Intentó ejecutar mi indicador en su entorno?

Razón de la queja: