ChartNavigate durante a inicialização - página 6

 
Alexey Viktorov:

Tenho neste post:https://www.mql5.com/ru/forum/260815/page4#comment_7890492 detalhado as condições sob as quais o problema pode ser reproduzido. Isto foi capaz de se reproduzir com base em suas afirmações. Sobre o que escrevi aqui

Ou seja, uma pequena modificação das condições levou a uma reprodução constante do problema.

Você de alguma forma não percebeu isso

 
Alexey Viktorov:

P./S.: Imprimir em vez de Comentar em seu código não seria apenas um procedimento mais gentil. Os resultados impressos no OnInit() são mais fáceis de comparar, copiar e anexar aqui

 
Alexey Viktorov:

Sugeri a atualização não na esperança de que tudo se encaixasse, mas para que as construções fossem as mesmas.

Igor, você está fazendo experiências com a versão completa do indicador ou com a versão experimental?

Tanto lá como lá. Mas ainda não posso dizer com certeza qual é o problema: se é um bug ou não. Preciso encontrar condições suficientemente reprodutíveis.

 
Alexey Viktorov:

Como fazer isso?

De acordo com a descrição no primeiro borne do fio, é um indicador, está pendurado em um gráfico aberto - isso significa que o histórico já está carregado. Certo? Pendurar o indicador, fechar o terminal, iniciar o terminal, --- para onde pode ir o histórico? Se já lá estivesse...

Em segundo lugar, eu abri o símbolo EURMXN. Sem olhar no terminal, você pode dizer o que é? )))

É fácil:

  1. Um modelo com o indicador é salvo como padrão.tpl.
  2. O símbolo do gráfico é aberto, o qual nunca foi aberto antes.
Como resultado, o indicador começa primeiro, e depois os dados são carregados. Tenho todo o conjunto de eventos em um pacote.

 
Ihor Herasko:

Tanto lá como lá. Mas ainda não posso dizer com certeza se se trata ou não de um bug. Precisamos encontrar condições suficientemente reprodutíveis.

Sua redação é um pouco infeliz. O que citei é de condições reprodutíveis.

Outra coisa é que sim, provavelmente o que estou descrevendo nos blocos I e II não é um bug, mas peculiaridades de carregamento de dados quando o terminal reinicia .

E, em 1870, houve diferenças de repetição em relação ao que eu recebi em 1861º.

As combinações de mensagens (sucesso e erro 4111) mudaram um pouco. Por exemplo, se antes houvesse uma reprodução tão estável:

test 2018 06 26 (GBPUSD,M5)     Alert: Успешно
test 2018 06 26 (GBPUSD,H1)     Alert: Ошибка №4111

Agora, com o mesmo código, as mensagens de erro parecem ser mais pronunciadas:

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Успешно
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111


E o bloco IIIdesse meu posto não é mais reproduzível no ano de 1870.

Nem poderia reproduzir na década de 1870 o que é descrito aqui:https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Por último - talvez dependa de alguma forma do sistema operacional (como um palpite). Ou seja, este código de Vladimir funciona bem para mim, sem problemas.

 
Ihor Herasko:

Encontrei um problema com a função ChartNavigate. Fazendo algo errado ou há realmente um problema com a função. Escreva de volta se você já o usou com freqüência suficiente.

Portanto, o cerne do problema: ChartNavigate não desloca o gráfico Ao iniciar o terminal Se você chamar esta função no OnInit(). Especialmente várias vezes eu li a documentação. Em nenhum lugar se diz que a função não pode ser chamada na inicialização.

Código indicador para reprodução:

Passos a serem dados:

  1. Desligar o autoplay do gráfico.
  2. Anexar indicador ao gráfico. ChartNavigate acionará movendo a carta para a posição desejada.
  3. Descarregue o terminal.
  4. Carregue o terminal. O ChartNavigate não funcionará exibindo o gráfico sem uma compensação.
OK, se a função der um erro. Mas não. Todas as chamadas são bem sucedidas, mas é quando o terminal é recarregado que a carta não é deslocada.

Experimente as três variantes do indicador e veja o resultado de cada

1. ChartNavigate no final dos outros comandos gráficos

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

2. ChartNavigate one - nenhum outro comando para o gráfico

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
/*
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
*/
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


3. ChartNavigate antes de outros comandos gráficos

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 

//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

E tente três variantes do indicador, veja o resultado de cada

1. ChartNavigate no final dos outros comandos do gráfico

  1. Anexado ao gráfico M1 com a rolagem automática habilitada. O Autoscroll está desligado, o gráfico moveu 1000 barras para a esquerda.
  2. Recarregou o terminal sem desconectar o indicador da tabela. O gráfico mostra a vela atual, sem deslocamento de 1000 barras para a esquerda. O autoscroll continua indisponível.
  3. Eu repeti o passo 2 7 vezes seguidas. 3 vezes fora delas a transição para a esquerda de 1000 velas está completa, 4 vezes - a transição não está completa.
Quando eu não aperfeiçoei o comando "Aguardando atualização" aparece. Assim, pode-se concluir que o terminal rola à força o gráfico para as últimas citações ao carregar a história. E como isso acontece depois do OnInit(), obtemos um resultado inesperado.

2. ChartNavigate sozinho - nenhum outro comando para o gráfico

  1. Como a rolagem automática não está automaticamente desabilitada nesta versão, eu a desabilitei manualmente e conectei o indicador. O gráfico moveu 1000 barras para a esquerda.
  2. Reinicializou o terminal sem desconectar o indicador do gráfico.
  3. Em 2 de 7 casos foi feita a rolagem. E em uma delas aconteceu em três etapas: exibir a história esperada, exibir a vela atual e exibir a história esperada. Parece que o OnInit() foi executado duas vezes: uma antes do histórico ter sido carregado e a segunda vez - depois.

3. ChartNavigate antes de outros comandos gráficos.

  1. Eu habilitei a rolagem automática e anexei o indicador. A carta sacudiu e voltou para a vela atual. É de se esperar que a rolagem automática seja desativada após o comando de movimento de 1000 barras.
  2. Reinicializou o terminal sem desconectar o indicador da carta (a carta exibe a vela atual).
  3. Em todos os 7 casos, o gráfico exibiu a vela atual, a rolagem nem sequer piscou.
Se reiniciamos o terminal sem nenhum indicador na tabela com a rolagem automática desligada e exibindo em algum lugar na profundidade da história, então a cada reinício obtemos a exibição do lugar onde o terminal foi desligado. Acontece que em algum lugar durante a execução dos comandos de navegação há um movimento para a vela atual.
 
Ihor Herasko:

  1. Anexado ao gráfico M1 com o autoscroll ligado. A rolagem automática foi desligada, o gráfico moveu 1000 barras para a esquerda.
  2. Recarregou o terminal sem desconectar o indicador da tabela. O gráfico mostra a vela atual, sem deslocamento de 1000 barras para a esquerda. A rolagem automática continua indisponível.
  3. Eu repeti o passo 2 7 vezes seguidas. 3 vezes fora delas a transição para a esquerda de 1000 velas está completa, 4 vezes - a transição não está completa.
Quando eu não aperfeiçoei o comando "Aguardando atualização" aparece. Assim, pode-se concluir que o terminal rola à força o gráfico para as últimas citações ao carregar a história. E como isso acontece depois do OnInit(), obtemos um resultado inesperado.

Sempre esqueço que sua mensagem/sugestão é lida de trás para frente. É como em uma velha brincadeira:

1917, outubro. Uma senhora, a neta de
, a Decembrista, está sentada em sua própria casa em Nevsky. Ao ouvir um barulho na rua, ela pede a seu zelador que descubra o que está acontecendo em
.
- Menina, a revolução está aí! - O zelador retorna.
-Oh, que maravilha! - Meu avô sonhava com uma revolução!
Vá e descubra o que os revolucionários querem, meu caro amigo!
- Eles não querem homens ricos, senhora", diz o zelador em seu retorno.
- Estranho", diz a senhora pensativamente, "mas meu avô não queria que houvesse gente pobre!

Pensei que você fosse mudar as propriedades do horário antes de reinicializar o terminal.
 
Rashid Umarov:

Sempre esqueço que sua mensagem/sugestão será lida de trás para frente.

O que você quer dizer? Você escreveu que precisa testar o funcionamento dos três indicadores. Uma vez que o tópico é sobre recarregar o terminal e depois usar ChartNavigate, estes são os testes que foram feitos.

Pensei que você fosse mudar as propriedades do gráfico antes de reiniciar o terminal.

Por que, se o problema é que o ChartNavigate nem sempre funciona quando o terminal começa? A questão é exatamente essa.

 
Ihor Herasko:

o problema é exatamente que o ChartNavigate nem sempre aciona quando o terminal inicia? Esta é a questão.

E também quando eu mudo meu perfil. Além disso, se o ChartNavigate( chart_id, CHART_BEGIN, shift ) conseguir por exemplo CHART_FIRST_VISIBLE_BAR, então o resultado será como se o ChartNavigate tivesse funcionado. Se o Expert Advisor for removido, na próxima vez que você iniciar o Expert Advisor (o mesmo ou diferente), o resultado da obtenção do CHART_FIRST_VISIBLE_BAR neste gráfico parecerá CHARTNavigate falhou.

Conclusão: operação de ChartNavigate extremamente inconsistente já em combinação com CHART_FIRST_VISIBLE_BAR

Razão: