Bug MQL5 quando se trabalha com acesso iClose/iOpen timeseries, etc. - página 5

 
Renat Fatkhullin:

Favor me mostrar o código de referência do indicador, que sempre guarda os últimos 2000 ticks de cada símbolo do Market Watch.

Caso contrário, você fica adivinhando de um lado e apenas recomendações na forma de palavras do outro lado.

 
Renat Fatkhullin:

Tenho que olhar para o código.

O código acima tem claramente um monte de problemas lógicos e de recursos.

Estou fazendo algo como isto, por favor, aconselhe como e o que ajustar se necessário:

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
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      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Tenho que olhar para o código.

O código acima tem claramente um monte de problemas lógicos e de recursos.

Há algum problema lógico neste código, ou estou perdendo alguma coisa?

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bug MQL5 em acesso iClose/iOpen time series, etc.

Stanislav Dray, 2018.11.14 16:28

Sua atitude em relação aos relatos de insetos é estranha. Não é como se eu fosse pago para provar nada. Eu expus a situação o melhor que pude.

Não sou o único com o problema, o problema surgiu após sua 30ª atualização, mas ainda assim você insinua que eu sou um tolo e culpa alguns indicadores retardados.

Eles não foram lentos por um ano antes disso?

Aqui está um exemplo de código que fica pendurado 25 minutos após o início na M30:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Você deve escrever o indicador com um claro entendimento de que não receberá tudo de uma só vez.

No OnInit você deve estimular o carregamento do histórico dos instrumentos necessários através de chamadas individuais do CopyXXX, mas você tem que esperar pela inicialização completa no OnCalculate.

Sua fase de inicialização parece ter um erro - você está aguardando os dados incorretamente e bloqueando-os.

Vou tentar fazer isso,

Agora eu faço pedidos à OnCalculate e espero lá (não a cada carrapato, é claro, mas apenas a primeira vez do cálculo).

 
fxsaber:

Por favor, mostre-me o código de referência do indicador, que sempre guarda os últimos 2000 ticks de cada símbolo do Market Watch.

Não tenho certeza de como usá-lo, mas tenho certeza de que tenho o direito de usá-lo.

Concordo! É melhor nem mesmo para carrapatos, mas para barras.

Você precisa de um exemplo de um Código Verdadeiro Multimoedas Aprovado.

Caso contrário, ficaremos no escuro.

 

Tentarei localizar o erro e relatarei à medida que o encontrar.

 
transcendreamer:

Concordo! Melhor nem mesmo carrapatos, mas barras.

Precisamos de um exemplo de um Código Verdadeiro Multimoedas Aprovado.

Caso contrário, ainda estaremos no escuro...

As barras e carrapatos são epistasias diferentes vivendo na MT5 independentemente.
 
Vladimir Karputov:

Também sempre foi recomendado que, se você estiver trabalhando com o cronograma de outra pessoa - você deve obter OHLC desse cronograma uma vez por minuto (qualquer função CopyXXXX). Este tem sido sempre o caso.

Eu já queria cuspir em tudo o que está acontecendo aqui, mas infelizmente passei cerca de 10 anos com o produto MQ.

Agora é tudo negócio. Vladimir seu conselho sobre o uso das funções CopyXXXX foi usado por mim, porque não foi nenhuma dificuldade do ponto de vista de meu código não-profissional escrito.

Honestamente, eu queria que o problema estivesse apenas em minhas mãos tortas, mas não é só nelas que o problema está. Tenho uma captura de tela abaixo, antecipando explicações estranhas do suporte técnico dizendo que codifiquei incorretamente e 100500 outros indicadores, então o que você quer, haverá problemas. Não tenho outros 100500 indicadores, não há nenhum especialista, tenho apenas duas ferramentas abertas no terminal, o teste do indicador está rodando em EURUSD 1M, o indicador chama os dados do cronograma M15 da mesma ferramenta, não estou tentando carregar outros dados de símbolos, há apenas alguns deles na revisão do mercado.

É uma situação ideal para o terminal em termos de carregamento, o que naturalmente não será o caso em condições de trabalho, mas mesmo neste caso há um problema e, em minha opinião, este problema se chama "BAG".

No indicador as funções iClose e iBars são chamadas apenas para refletir o estado em Commet(). Na revisão do mercado no momento da criação da captura de tela, o estado atual das funções iClose e iBars está na janela do terminal, além disso, a parte de cálculo do indicador usa a função CopyXXXX.

BAG

Como você pode ver, o indicador foi recarregado às 16:31 e funcionou com sucesso (eu até estava ficando feliz), mas iClose a atualização de dados parou após 00:15, respectivamente, a função CopyXXXX também não retorna nenhum dado atualizado, ou seja, o erro ocorre em algum lugar nas profundezas da MT.

Na minha opinião, há uma falha ao ler os dados do servidor, os motivos podem ser em massa (sem internet, o servidor estava ocupado, etc.), mas por que o reinício do trabalho após a eliminação das causas de comunicação não acontece, então concluo que você pode testar o código fonte dos usuários tanto quanto quiser, mas se você tiver um servidor ao lado, este problema nunca será identificado, e ele existe e não ocorre apenas por causa do codificador de mão ruim.

 

Também decidiu testar o código de Stanislav ontem. Após algumas horas, a atualização de tempo parou. Não alterei os prazos, apenas os atualizei através do menu de contexto do gráfico e o tempo continuou.

Hoje modifiquei um pouco o código, para observar também a hora do tempo atual.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

Em 15 minutos parou de se atualizar em um prazo "não nativo", mas com o prazo atual estava se atualizando normalmente. Depois de refrescar o gráfico, o tempo começou novamente.

O terminal está funcionando no modo portátil. O sistema e o próprio terminal estão localizados em um disco SSD.


 

Não sei o que aconteceu, mas quando escrevi o bot para o último campeonato MQ em MQL5, era multimoeda e não notei nenhum problema com o carregamento de dados de outros instrumentos.

Pode ter consumido muitos recursos, mas deu o resultado esperado, e não um jogo de roleta como agora.

Este problema, por exemplo, como desenvolvedor de produtos comerciais para a MQL5, não me caracteriza de forma muito boa e será duplamente desagradável se uma pessoa pagar por um produto comprado no Mercado e parece apenas com defeito por causa de tal "BOGS".