Por favor, explique o que poderia estar errado com esta função. - página 4

 
Alexey Viktorov:

Vladimir, o problema não ocorre no testador. Como é que existe tal problema? Ou porque há apenas um Expert Advisor no testador?

Também sugeri no SD que a única mudança era colocar a segunda EA em um par diferente.

Todo o ambiente comercial no testador é preparado com antecedência. Tudo está em um prato. Não se preocupe. O verdadeiro ambiente comercial é diferente, em caso de comportamento não padrão (trabalhando no cronograma de outra pessoa e/ou no símbolo de outra pessoa) temos que nos preocupar com a relevância do ambiente comercial.
 
Karputov Vladimir:
Em um terminal (no cronograma M15 havia EAs) não funcionava em um símbolo - tenho 99% de certeza de que o problema é que ao usar o cronograma de outra pessoa você precisa "sacudir" a história o tempo todo. Penso que é melhor fazê-lo através de CopyTime().
E o CopyRates() imita a história. Há tempo na estrutura...
 
Karputov Vladimir:

Isto não é um erro. Você está trabalhando no cronograma de outra pessoa. Nesse caso, você mesmo tem que cuidar dos dados sobre o cronograma de outra pessoa para garantir que eles estejam atualizados.

Pessoalmente, não vejo nenhuma alternativa.

Não é um fato que não sabemos como funcionaSERIES_LASTBAR_DATE. Pode ser que não haja necessidade de atualizar nada porque o tempo da última barra pode ser calculado usando o TimeCurrent() do símbolo especificado. Precisamos perguntar aos desenvolvedores.

Mas até agora um fato indiscutível é que se duas variáveis são definidas como verdadeiras, então juntas (ao verificar &&) estas variáveis também se tornarão verdadeiras.

 

O problema com as outras ferramentas/cache TF que caem existe.

A verificação de erros e a espera em loop para carregar nem sempre ajuda. Temos conversado com o Service Desk, mas a MQ não fez nenhum progresso, apenas uma dica:

Support Team 2016.02.29 11:45

A suspeita é de que os dados históricos estão sendo descarregados por tempo limite.

Existem 2 soluções:

1. acessar os dados com mais freqüência do que uma vez a cada 3 minutos

2. colocar um indicador muito simples nos dados. Volume, por exemplo. Não há cálculo, apenas um buffer está ocupado. A disponibilidade do indicador manterá o cache histórico na memória, independentemente da freqüência de acesso

A segunda dica não funciona, os indicadores são chamados o tempo todo, mas em algum momento o cache falha e torna-se impossível obter dados.

Andrey Khatimlianskii2016.03.18 13:41

Eu resolvi o problema com esta muleta - chamo este código a cada 150 segundos para todos os instrumentos/FTs envolvidos:

bool CheckTimeSeries( string symbol, ENUM_TIMEFRAMES period )
{
   double array[];
   if ( CopyClose( symbol, period, 1, 1, array ) <= 0 )
   {
                int err = GetLastError();
                Print( " * Can't refresh timeseries (", symbol, ", ", period, ")! ERROR #", err, "!!!" );
                return(false);
   }
   return(true);
}

Funciona rápido o suficiente, o erro 4806 parece desaparecer após esta atualização.

 

Por favor, comente outro mal-entendido.

Bars

Retorna o número de barras no histórico pelo símbolo do período correspondente. Existem 2 variantes da função.


Apenas a segunda opção é de interesse.

Solicitar o número de barras em um determinado intervalo
int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

Texto do consultor especializado

/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
  datetime dtarr[], date = D'2016.06.22';
  ArraySetAsSeries(dtarr, true);
  CopyTime(_Symbol, PERIOD_D1, 0, 5, dtarr);
  Print(dtarr[0]);
  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]));
   
}/*******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
}/*******************************************************************/

Entendo que a hora 00:00:00 pertence ao dia, assim como a hora 00:00:01

Mas ... as impressões propostas não estão de acordo com isso.

2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    2
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    3
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)   2016.06.24 00:00:00

Acontece que entre 2016.06.22 00:00:00 e 2016.06.24 00:00:00 há três bares diários e entre 2016.06.22 00:01 e 2016.06.24 00:00 há apenas dois...

Ou estou entendendo algo errado???

Arquivos anexados:
TestTime.mq5  2 kb
 

E se você acrescentar um segundo ao tempo da barra atual

  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]+1));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]+1));

você recebe o seguinte

2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    3
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    4
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)   2016.06.24 00:00:00

A hora 2016.06.24 00:00:01 parece pertencer ao próximo bar ou o quê?

 
O limite superior de tempo não está incluído no intervalo no qual o número de barras é determinado.
 
Dmitry Fedoseev:
O limite superior de tempo não está incluído no intervalo no qual o número de barras é determinado.

Dimitri, isso não é estranho? Uma nova barra apareceu, mas ainda não a contaremos.

Ouça, não é a razão de tal comportamento da SeriesInfoInteger(_Symbol, PERIOD_D1, SERIES_LASTBAR_DATE); ? Apareceu uma nova barra, o código disponível é executado, mas o tempo ainda não é levado em conta???

 

Bem, o baterista está deflacionado... E ele foi completamente ignorado...?

Vladimir, você pode ao menos responder a esta pergunta????

Alexey Viktorov:
A CopyRates() puxa a história? Há tempo na estrutura...?
 
Alexey Viktorov:

Bem, o bicho-papão deflacionou... E ele foi totalmente ignorado...

Vladimir, você pode ao menos responder a esta pergunta????

É melhor você nos dizer o que foi aconselhado a fazer no Service Desk - você continuou a falar com eles, não foi?