CopyTicksRange () não funciona corretamente na MQL5. a - página 3

 
fxsaber #:

Unidades.

Provavelmente sim, mas ainda é uma função básica e se o próprio terminal o utiliza, pelo menos para exportar dados, mina a credibilidade do terminal também

 

Exemplos de erros prometidos no arquivo anexo. Surpreendentemente, Err_SymbolInfoTick2() funcionou corretamente por um tempo, mas depois começou a retornar a data nula também. Há comentários explicativos no código.

Diário de bordo:

2021.09.19 06:01:24.674 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicksRange()------------
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 109425 ticks
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:56:43:863 - last tick
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.01.29 10:00:12:292 - last tick
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 1000000 ticks
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    2021.01.29 00:02:14:782 - first tick, 2021.02.08 14:17:58:484 - last tick
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 189530 ticks
2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1)    2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 189530  );  replaced 189530 ticks
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1)    CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 189530 ticks
2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1)    2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    CustomTicksAdd('CustomBR',Ticks, 189530  );  added 189530 ticks
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1)    ---------------------


Diversão para um lanche: se você observar os carrapatos com as ferramentas do terminal, você pode obter mais carrapatos do que os registrados. (ver foto ). E se a data "antes" for reduzida para 2021.09.18, então há menos deles registrados.

Arquivos anexados:
untitled.jpg  605 kb
 
sim, se é uma matriz estática ou dinâmica é irrelevante
 
RusPro #:

Exemplos de erros prometidos

Infelizmente, não há acesso a esses caracteres para reproduzi-los.

 
fxsaber #:

Infelizmente, não há acesso a estes símbolos para reproduzi-los.

é o micex. ok, vou tentar o forex.

 
RusPro #:

é o MICEX. OK, vou tentar o forex.

1. Não há nenhum símbolo "@BR" no MICEX.

Você parece estar usando um símbolo personalizado.

E pode haver um erro na sua criação.

Uso muito as funções CopyTicks e CopyTicksRange nos símbolos originais MICEX - não notei nenhum erro.

2. O terminal não armazena todo o histórico de ticks e a primeira chamada de função pode retornar ticks não durante todo o período solicitado.

Adicionado

Aqui está um exemplo de um indicador, onde carrego carrapatos usando a função CopyTicksRange

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2021 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots   1
#property indicator_buffers 1

enum IND_STAGE
{
  LOAD_TICKS = 0,
  READ_TICKS = 1,
  FILL_DATA = 2
};
struct T_DATA
{
  datetime bar_time;
  int ticks_cnt;
  MqlTick pr_bar_ticks[];
};
struct MARKET_DATA
{
  int time_cnt;
  int cnt;
  IND_STAGE stage;
  T_DATA t_data[];
  MqlTick ticks[];
  int live_cnt;
  int a_cnt;
  datetime time_array[];
};
MARKET_DATA m_data;
datetime start_time, end_time;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   end_time = datetime(SymbolInfoInteger(Symbol(), SYMBOL_EXPIRATION_TIME));
   m_data.stage = LOAD_TICKS;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Load ticks function                             |
//+------------------------------------------------------------------+
bool LoadTicks(const datetime &a_times[])
{
  int bars = Bars(Symbol(),PERIOD_M1);
  datetime cur_time = TimeTradeServer();
  if(cur_time > end_time)
  {
    cur_time = end_time;
  }
  int result = CopyTime(Symbol(), PERIOD_M1, 0, bars, m_data.time_array);
  if(result > 0)
  {
    start_time = m_data.time_array[0];
    if(m_data.time_array[result - 1] == a_times[ArraySize(a_times) - 1])
    {
      m_data.time_cnt = result;
      result = CopyTicksRange(Symbol(), m_data.ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(cur_time) * 1000);
      if(result > 0)
      {
        if(m_data.ticks[result-1].time >= m_data.time_array[m_data.time_cnt - 1]) 
        {
          m_data.cnt = result;
          return(true); 
        } else Print(__FUNCTION__, ": Не хватает тиков ", Symbol(), "!"); 
      } else Print(__FUNCTION__, ": Не получены тики по символу ", Symbol(), "!");
    } else Print(__FUNCTION__, ": Не хватает баров по символу ", Symbol(), "!");
  } else Print(__FUNCTION__, ": Не скопировано время баров по символу ", Symbol(), "!");
  return(false);
}  
//+------------------------------------------------------------------+
//| 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[] )
  {
  switch (m_data.stage)
  {
    case LOAD_TICKS:
      if(LoadTicks(time) == true)
      {
        Print("All ticks loaded.");
        m_data.stage = READ_TICKS;
        return(rates_total);
      }
      return(0);
    break;
    case READ_TICKS:
    break;
  }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
E tudo carrega bem, mas nem sempre é a primeira vez.
 
prostotrader #:

1. Não há nenhum símbolo "@BR" no MICEX

Aqui está um exemplo de indicador, onde carrego carrapatos usando a função CopyTicksRange

E tudo carrega bem, mas nem sempre é a primeira vez.

Isto é uma cola de futuros de petróleo. Corretor BCS. Pode ser chamado de forma diferente em diferentes corretores. Mas exatamente os mesmos problemas estarão em outros símbolos.

 
prostotrader #:

Em seu exemplo funciona, porque as condições de chamada são diferentes - a hora de início é sempre igual ao início da barra existente (ou seja, sabe-se que existem carrapatos) e você lê todo o histórico de carrapatos da última barra de uma só vez.

A propósito, uma das minhas muletas funciona de forma semelhante à sua. No início, eu também recebo os tempos das barras existentes, e depois as quebro em segmentos contínuos máximos e recebo os carrapatos. Mas outro problema ocorre - se não houver quantidade suficiente de recepção de dados, o resto é uma dança de pandeiro (sobre a qual eu falei acima).

E trabalhar com matrizes dinâmicas é muito mais lento e você tem que considerar uma possível fragmentação da memória.

 
prostotrader #:

2. O terminal não armazena todo o histórico de ticks e a primeira chamada para a função não pode retornar ticks durante todo o período solicitado.

Não há problema se não todo o período for devolvido, o problema é quando outro período é devolvido em vez do solicitado. Ou, pior ainda, quando devolve o solicitado e alguns outros carrapatos, não incluídos na faixa


Substituí o símbolo no meu exemplo por "SILV-12.21". Recebi o mesmo erro, e o que é interessante, SymbolInfoTick retornou a resposta certa no último teste :) mas como eu adivinho, quando está errado e quando está errado?


2021.09.19 15:27:55.089	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicksRange()------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 1758 ticks
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:49:01:540 - last tick
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 11:02:44:891 - last tick
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 763140 ticks
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.09.17 23:58:41:031 - last tick
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 42793  );  replaced 42793 ticks
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	CustomTicksAdd('CustomBR',Ticks, 42793  );  added 42793 ticks
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=2021.09.17 19:59:32:398
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	--------------------- 

 
fxsaber #:

К сожалению, нет доступа к этим символам, чтобы воспроизвести.


Em forex, os mesmos erros. Corretor Alpari, conta teste. Símbolo EURUSD


Símbolo personalizado feito com base em EURUSD, deixando o nome também


2021.09.19 15:36:52.417 tester (EURUSD,H1)      ---------Err_CopyTicksRange()------------
2021.09.19 15:36:52.432 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 102934 ticks
2021.09.19 15:36:52.432 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.01.29 23:54:59:930 - last tick
2021.09.19 15:36:52.432 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.432 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09.19 15:36:52.445 tester (EURUSD,H1)      CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 15:36:52.445 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.01.29 00:12:52:513 - last tick
2021.09.19 15:36:52.445 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.445 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09.19 15:36:52.577 tester (EURUSD,H1)      CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 1000000 ticks
2021.09.19 15:36:52.577 tester (EURUSD,H1)      2021.01.29 00:00:00:139 - first tick, 2021.02.15 18:31:34:723 - last tick
2021.09.19 15:36:52.577 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.577 tester (EURUSD,H1)      ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 15:36:52.579 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 78831 ticks
2021.09.19 15:36:52.579 tester (EURUSD,H1)      2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick
2021.09.19 15:36:52.645 tester (EURUSD,H1)      CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 78831  );  replaced 78831 ticks
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ---------------------
2021.09.19 15:36:52.645 tester (EURUSD,H1)      ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 15:36:52.658 tester (EURUSD,H1)      CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 78831 ticks
2021.09.19 15:36:52.658 tester (EURUSD,H1)      2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick
2021.09.19 15:36:52.686 tester (EURUSD,H1)      CustomTicksAdd('CustomBR',Ticks, 78831  );  added 78831 ticks
2021.09.19 15:36:52.686 tester (EURUSD,H1)      ret=1, mt.time_msc=2021.09.17 19:59:59:088
Razão: