Símbolos personalizados. Erros, bugs, perguntas, sugestões. - página 27

 
Stanislav Korotky:

A adição de carrapatos um-para-um (em particular do EURUSD na MQ Demo) a um novo símbolo personalizado vazio dá erro 5310 (não imediatamente, mas em um loop a partir de uma data arbitrária).

O que está errado? Como posso saber quais carrapatos específicos estão sendo repreendidos? Colocar arrays em log - nenhuma violação cronológica ali.

Tente inserir o cheque para cópia de carrapatos.
Tenho um indicador sobre os dados em tempo real no processamento de tick, quando copio CopyClose, às vezes ele aciona o erro de cópia.
Não entendo qual pode ser a razão. Talvez, no seu caso, haja um erro de cópia.

Além disso, no CopyTicks, você copia um monte de carrapatos Limit, e depois no loop while, ou seja, cada iteração você copia uma grande variedade de carrapatos.
E em CustomTicksAdd you pass the same large number of ticks to the array.
Tente copiar um carrapato e passe um carrapato.
Você está correndo em um loop de tempo.

input int Limit = 10000;
input datetime Start = D'2020.06.01';

int fillArray(ulong &_start)
{
  MqlTick array[];
  int size = CopyTicks(_Symbol, array, COPY_TICKS_ALL, _start, Limit);

  if(size <= 0) 
  {
     Print("Ошибка копирования ценовых данных "+_Symbol+" "+(string)size+" ",GetLastError());
     return(size);
  }

  if(size > 0)
  {
    _start = array[size - 1].time_msc + 1;
    if(CustomTicksAdd(symbolName, array) == -1)
    {
      Print("Error:", GetLastError());
      return(-1);
    }
  }
  return(size);
}

...
{
  ulong startMsc = (ulong)Start * 1000;
  while(fillArray(startMsc) > 0);
}
Adicionado. Não relacionado a símbolos personalizados.
Acabei de pegar no indicador, em tempo real a causa do erro de cópia com o período M5 pela função CopyClose.
A conexão à Internet foi cortada por alguns segundos e após a conexão apareceu o erro de cópia 4401O histórico solicitado não foi encontrado
É estranho, o período M5 ainda não mudou para uma nova barra, mas o erro apareceu.
 
Roman:

Tente inserir verificação para cópia de carrapatos.
Em meu indicador sobre dados em tempo real no processamento de tick, ao copiar CopyClose, às vezes ocorre um erro de cópia.
Não entendo qual pode ser a razão. Talvez, no seu caso, haja um erro de cópia.

Além disso, no CopyTicks, você copia um monte de carrapatos Limit, e depois no loop while, ou seja, cada iteração você copia uma grande variedade de carrapatos.
E em CustomTicksAdd you pass the same large number of ticks to the array.
Tente copiar um carrapato e passar um carrapato.

Não há erros de cópia, o código recebe um valor normal do número de ticks copiados (tamanho), a matriz é preenchida com dados normais o tempo todo. O limite pode ser alterado, mas um erro ocorre a qualquer valor significativo de um a vários milhares. Copiar todos os ticks de uma vez (como em alguns códigos) é obviamente errado porque pode causar um erro de alocação de memória e bloquear a linha por um longo tempo sem poder mostrar o progresso do usuário. E copiar carrapatos em pequenos lotes de 10 (quanto mais 1) desacelera todo o processo - isto é inaceitável.

A variante sugerida é a ideal. E mesmo que seja discutível para alguém, formalmente o código é correto (ou cite onde estou errado) e o comportamento atual é erro, ou seja, carrapatos devem ser adicionados sem o código 5310.

Além disso, ainda existe um problema de longa data com a limpeza do banco de dados de carrapatos. Chame CustomTicksDelete(symbolName, 0, LONG_MAX); não quer apagar todos os carrapatos e deixa alguns (é observado não constantemente, mas de vez em quando). Se você reiniciar o Expert Advisor, o símbolo personalizado é apagado completamente. Como no caso de CopyTicks - sem erros.

 
Se você quiser escrever carrapatos sem gerar mais eventos OnTick, talvez seja melhor usar uma função diferente.
 
Stanislav Korotky:

Talvez haja carrapatos com os mesmos ms na junção dos pacotes e isso conta como um erro?

Apenas um palpite

 
Andrey Khatimlianskii:

Talvez haja carrapatos com os mesmos ms na junção dos pacotes e isso conta como um erro?

Apenas um palpite.

Você pode ver pelo código que existem carrapatos duplicados. Neste caso, as bandeiras de carrapatos podem não corresponder umas às outras.

 
fxsaber:
Se você precisar escrever carrapatos sem gerar mais eventos OnTick, talvez esteja melhor usando uma função diferente.

Eu concordo. Vou tentar. Mas não vejo razão para que o método atual não funcione.

 
Stanislav Korotky:

Não há erros de cópia, o código recebe um valor normal do número de ticks copiados (tamanho), a matriz é preenchida com dados normais o tempo todo. O limite pode ser alterado, mas um erro ocorre a qualquer valor significativo de um a vários milhares. Copiar todos os ticks de uma vez (como em alguns códigos) é obviamente errado porque pode causar um erro de alocação de memória e bloquear a linha por um longo tempo sem poder mostrar o progresso do usuário. E copiar carrapatos em pequenos lotes de 10 (quanto mais 1) desacelera todo o processo.

A variante sugerida é a ideal. E mesmo que seja questionável para alguém, formalmente o código está correto (ou cite onde estou errado) e o comportamento atual é erro, ou seja, carrapatos devem ser adicionados sem o código 5310.

Além disso, ainda existe um problema de longa data com a limpeza do banco de dados de carrapatos. Chame CustomTicksDelete(symbolName, 0, LONG_MAX); não quer apagar todos os carrapatos e deixa alguns (é observado não constantemente, mas de vez em quando). Se você reiniciar o Expert Advisor, o símbolo personalizado é apagado completamente. Como no caso de CopyTicks - sem erros.

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Carraçasnão ordenadas pelo tempo


É possível que você não tenha tempo de apagar carrapatos em grandes lotes, porque está substituindo os já existentes na próxima iteração.
Ou seja, eles se sobrepõem uns aos outros como uma matriz, enquanto voa sem demora, de modo que a memória não tem tempo para ser apagada quando outra embalagem chega.
É por isso que sugeri acrescentar um tique de cada vez, copiei um tique de cada vez, sem problemas.

Quanto à limpeza do banco de dados de carrapatos, eu não gosto da constante LONG_MAX neste caso.
A ajuda da função CustomTicksDelete diz: Hora do último tick no histórico de preços da faixa especificada a ser apagada. O tempo em milissegundos desde 01.01.1970.
E LONG_MAX é muito maior do que este valor. Ou seja, um valor maior é passado, para o qual este parâmetro não é projetado.
Tente usar o número correspondente ao dígito milissegundo, ou seja, 13 valores.

 
fxsaber:

Você pode ver pelo código que existem carrapatos duplicados. Neste caso, as bandeiras elementares de carrapatos podem não corresponder.

Os tiquetaques duplicados estão recebendo a matriz CopyTicks? Como é claro que são carrapatos duplicados e não os mesmos carrapatos (os carrapatos não têm identificadores únicos, afinal de contas)? Mesmo se houver duplicatas, em teoria, os carrapatos com cortes iguais não quebram a seqüência. Finalmente, surge a questão - como são formadas as duplicatas?

 
Roman:

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

A matrizde carrapatosnão é ordenada pelo tempo


É possível que os grandes pacotes de carrapatos não tenham tempo para serem apagados, já que você está substituindo os que já tem na próxima iteração.
Ou seja, eles se sobrepõem uns aos outros como uma matriz, enquanto voa sem atrasos, de modo que a memória não tem tempo para ser apagada quando outra embalagem chega.
Foi por isso que sugeri acrescentar um tique de cada vez, copiei um tique de cada vez, não houve problemas.

Nem uma palavra sobre exclusão, nada é sobregravado. As Iterações são cronometradas sem sobreposição. Sempre em um caráter personalizado vazio - seja um novo, ou após a eliminação bem sucedida de todos os carrapatos.

 
Stanislav Korotky:

Duplicação de ticks na matriz receptora CopyTicks? Como é claro que são carrapatos duplicados e não carrapatos idênticos (os carrapatos não têm identificadores únicos, afinal de contas)? Mesmo se houver duplicatas, em teoria, os carrapatos com cortes iguais não quebram a seqüência. Finalmente, surge uma pergunta - como são formadas as duplicatas?

Olhou para o código mais de perto. Faltam carrapatos quando você os recebe em lotes. Pode haver uma situação em que Ticks[Limit - 1].time_msc == Ticks[Limit + k], k >= 0.

Assim, quando você adiciona com um pulo, as bandeiras podem não coincidir.


Certifique-se de que todos os carrapatos históricos com o mesmo tempo estejam no final da porção. Ou seja, o início do próximo trecho deve ter um tempo diferente. Caso contrário, haverá perdas, mesmo quando se escreve por encomenda.

Se você quiser usar o CopyTicks, a maneira mais fácil é descartar os carrapatos mais extremos com o maior tempo do pacote recebido. E fazer _start igual a este tempo.
Razão: