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

 
Ihor Herasko:

E se não houver carrapatos, fins de semana? Então um temporizador terá que ser conectado.

E há apenas uma questão a resolver: como determinar se o ChartNavigate foi executado com sucesso? O fato de que ele retorna verdadeiro, é apenas "para carrapatos", não ajuda no trabalho real.

Preciso verificar o código que publiquei acima em meu Consultor Especialista.

 
Vladimir Karputov:

Preciso verificar o código que afixei acima no EA...

O que a EA tem a ver com isso?

 
Ihor Herasko:

O que isso tem a ver com o conselheiro?

Deveríamos verificar...

//+------------------------------------------------------------------+
//|                                                  Test EA.mq5.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"
//--- input parameters
input bool redraw=true;
input ENUM_CHART_POSITION position=CHART_BEGIN;
//---
long count=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   count=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

Este é o indicador - coloco especificamente um atraso de nove ticks, dois tipos de movimento de cartas e uma bandeira de re-desenho forçado (on/off)

Você não é um iniciante. Por que você está enganando? Por que você está ignorando o que Renat Fatkhullin disse?

Em seu código (como aqui, então aqui) é forçado a redesenhar a tabela em cada carrapato, criando comentários em cada carrapato.


Isto é, independentemente de a bandeira nos parâmetros de entrada estar ativada ou desativada.


E a inclusão de sua bandeira nos parâmetros de entrada, neste caso, só causa um redesenho adicional viaChartRedraw().

Ou seja, em vez de ser útil, cria uma carga adicional sobre os já existentes, criando comentários

P./S..:

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Erros, bugs, perguntas

Renat Fatkhullin, 2017.12.05 02:51

...

No MT5, a função Comentar faz com que o gráfico seja redesenhado explicitamente.

A diferença é exatamente isso.


Se no MT4 após a chamada Comentário você colocar à força ChartRedraw(), o comportamento ainda não é o mesmo que no MT5. ChartRedraw() no Metatrader 4 ignora o valor do comentário e decide por si mesmo se atualiza ou não o gráfico a partir do último quadro. Naturalmente, na ausência de centenas de citações por segundo que causariam uma desativação dos dados do gráfico, o ChartRedraw decide "por que desenhar um gráfico inalterado" e pula o desenho do quadro.

O Metatrader 5 também tem o mesmo sistema, mas há muito mais casos em que o desenho incondicional tem prioridade.

Os terminais são aplicações gráficas e podem fornecer centenas de quadros por segundo e funcionar em modo de exibição enxuta por razões de desempenho.


Daí conclusões adicionais ao executar os benchmarks:

  • não se deve considerar uma chamada de ChartRedraw para ser um verdadeiro desenho gráfico

  • você deve sempre saber e provar declarações "por que um gráfico será redesenhado" e "estou invalidando o quadro interno do mercado para que o terminal decida redesenhar o gráfico".

  • você não deve fazer múltiplas conclusões no MT5 durante os benchmarks, você deve sempre pensar em como você está afetando a renderização

  • O MT5 tem um sistema mais correto de troca de objetos no gráfico e é necessário entender claramente as conseqüências da mistura de comandos de leitura/escrita
    é recomendado não misturar comandos de leitura/escrita, e fazer leitura e escrita em massa separadamente.

  • O freqüente redesenho de gráficos em benchmarks leva a uma alta dependência dos resultados na placa gráfica.
    de fato, alguns testes podem acabar testando a placa gráfica em vez dos algoritmos ou funções. o teste em um laptop e em um computador desktop pode mostrar resultados várias vezes diferentes simplesmente por causa de uma placa gráfica 3-5 vezes mais lenta

Estes erros são cometidos o tempo todo por todos.


 

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

ChartNavigate durante a inicialização

Vladimir Karputov, 2018.06.25 18:52

Tenho que verificar...

...
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+

P./S.: Além de seu segundo código: antes de atualizar a entrada de texto e a publicação através do mesmo comentário, verifique se os dados foram alterados. Caso contrário, é melhor adiar a atualização e publicação do texto.

Isto é, neste caso é se o número da primeira barra no gráfico mudou

 
Vladimir Karputov:

Vou ter que verificar...

Mmm. Não tenho bem a certeza do que se trata. OK, então. Eu o instalei. Foi verificado nos modos CHART_BEGIN e CHART_END. Está funcionando conforme anunciado. Após o reinício, tudo bem.

Ou você está chegando ao ponto em que precisa usar uma muleta - verifique o número da primeira barra no gráfico após o ChartNavigate e, se não for a barra certa, execute novamente o ChartNavigate.

Sim, a saída, é claro, eu também pensei nisso. Mas é cansativo lembrar constantemente de tais fichas do terminal. Afinal de contas, é bem possível que seja um bug.

 
Dina Paches:

P./S.: Além de seu segundo código: antes de atualizar uma entrada de texto e publicação através do mesmo comentário, verifique se os dados foram alterados. Caso contrário, é melhor adiar a atualização e publicação do texto.

Ou seja, neste caso, é se o número da primeira barra no gráfico mudou

Obrigado pela informação, é claro, mas não estamos falando aqui de desempenho. O problema que estamos discutindo está em um plano ligeiramente diferente, são apenas códigos de teste para verificar se o problema se manifestou ))

 
Ihor Herasko:

Obrigado, é claro, pela informação, mas não estamos falando aqui de desempenho. O problema que estamos discutindo está em um plano ligeiramente diferente, são apenas códigos de teste para verificar se o problema aparece ))

Seja bem-vindo. Mas veja também meu outro post, para o qual o que você citou é um postcript.

P./S.: Não desvalorize, por favor. Não vou executar tais códigos no meu, sabendo o que isso implica. Meu equipamento não é emitido pelo governo

 
Ihor Herasko:

Mmm. Não tenho bem a certeza do que se trata. OK, então. Instalou-o. Checado nos modos CHART_BEGIN e CHART_END. Tudo funciona como anunciado. Após o reinício, tudo bem.

Ou você está chegando ao ponto em que precisa usar uma muleta - verifique o número da primeira barra no gráfico após o ChartNavigate e, se não for a barra certa, execute novamente o ChartNavigate.

Sim, a saída, é claro, eu também pensei nisso. Mas é cansativo lembrar constantemente de tais fichas do terminal. Afinal de contas, é bem possível que seja um bug.

Eu costumava ter uma navegação funcional. Agora eu tenho que verificar de propósito.


Adicionado: não preste atenção ao Comentário :)

 
Vladimir Karputov:

Minha navegação costumava funcionar. Agora eu tenho que verificar de propósito.


Acrescentado: Ignorar o Comentário :)

Por quê? Eu escrevi/descrevi disparates?