Bugs e sugestões para melhorar CopyTicks() e CopyTicksRange() após a construção de 1485.

 

Continuando a lutar para melhorar: carrapatos, acesso a carrapatos e sincronização de carrapatos. @Slawa, @Renat Fatkhullin e pessoas responsáveis por carrapatos, por favor, juntem-se à discussão. Acho que vamos encontrar mais de um erro. Além disso, acho que será interessante para @fxsaber, @coderex e outros usuários de carrapatos.

Vamos começar:

1. Não há uma palavra sobre a nova função CopyTicksRange() na documentação ME construiu 1486. Não é muito útil a partir do site. Acrescente-o à documentação do editor, por favor;

2. Ao tentar solicitar carrapatos via CopyTicksRange():

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

Constantemente obtemos -1 e erro #4401 "pedido de histórico não encontrado". E deveria ser assim:

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

O código está completamente abaixo:

//+------------------------------------------------------------------+
//|                                          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() retorna o resultado correto.

Arquivos anexados:
 

Não há como obter a história de forma alguma. Eu tentei isso:

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

Eu tentei isso:

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

Tentei isto:

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

Tentei isto:

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

A resposta é sempre a mesma:

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

Experimentei-o em VTBR-12.16, BR-12.16, RTS-12.16 futuros. Experimentei-o em COPY_TICKS_ALL ticks - o mesmo resultado. Prezados desenvolvedores, vocês estão correndo com os usuários? Ou você está simplesmente entediado com os testes de seus desenvolvimentos antes do lançamento?

 
Se você executar o indicador em cada tick - o mesmo resultado. Nenhum histórico é recebido.
 
O histórico do tiquetaque no símbolo - não ajudou.
 
Alexey Kozitsyn:

Não há como obter a história de forma alguma. Eu tentei isso:

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

Eu tentei isso:

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

Tentei isto:

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

Tentei isto:

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

A resposta é sempre a mesma:

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

Experimentei-o em VTBR-12.16, BR-12.16, RTS-12.16 futuros. Experimentei-o em COPY_TICKS_ALL ticks - o mesmo resultado. Prezados desenvolvedores, vocês estão correndo com os usuários? Ou você está simplesmente entediado com os testes de seus desenvolvimentos antes do lançamento?

 

Demotivador É a 100ª modificação e ainda não funciona...

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

Não há como obter a história de forma alguma. Eu tentei isso:

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

Eu tentei isso:

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

Tentei isto:

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

Tentei isto:

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

A resposta é sempre a mesma:

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

Experimentei-o em VTBR-12.16, BR-12.16, RTS-12.16 futuros. Experimentei-o em COPY_TICKS_ALL ticks - o mesmo resultado. Prezados desenvolvedores, vocês estão correndo com os usuários? Ou você está simplesmente entediado com os testes de seus desenvolvimentos antes do lançamento?

 

Aquele que não trabalha, come estudante

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

 

Acho que é apenas um bug na documentação da Web, ainda está realmente em branco em ME. Ou a função ainda está em desenvolvimento. Segundo, você está solicitando dados de algum lugar de 1970 e se pergunta por que os carrapatos do século passado não estão dando de volta )!!!! O que você está fumando lá?

É assim que 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:

Acho que é apenas um bug na documentação da Web, na verdade ainda não está em ME. Ou a função ainda está em desenvolvimento. Segundo, você está solicitando dados de algum lugar de 1970 e se pergunta por que os carrapatos do século passado não estão dando de volta )!!!! O que você está fumando lá?

É assim que 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, obrigado por se envolver nos testes. Como você pode ver, eu tentei tanto de uma data específica como para uma data específica e sem data. Mas a questão é: 1. eu usei __DATE__ e parece haver problemas com substituições de macros; 2. eu testei em futuros; Sim, se você olhar a documentação - deveria pelo menos ter começado a carregar carrapatos. No entanto - nada acontece.

Você tentou executar meu indicador em seu ambiente?