ChartNavigate durante la inicialización - página 2

 
Ihor Herasko:

¿Y si no hay garrapatas, los fines de semana? Entonces habrá que conectar un temporizador.

Y sólo queda una cuestión por resolver: ¿cómo determinar si ChartNavigate se ha ejecutado con éxito? El hecho de que devuelva true, es sólo "para los ticks", no ayuda en el trabajo real.

Tengo que comprobar el código que publiqué arriba en mi Asesor Experto...

 
Vladimir Karputov:

Tengo que comprobar el código que he puesto arriba en el EA...

¿Qué tiene que ver el EA con esto?

 
Ihor Herasko:

¿Qué tiene que ver esto con el consejero?

Deberíamos comprobar...

//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

Este es el indicador - específicamente puse un retraso de nueve ticks, dos tipos de movimiento del gráfico y una bandera de re-dibujo forzado (on/off)

No eres un principiante. ¿Por qué te engañas? ¿Por qué ignoras lo que dijo Renat Fatkhullin?

En su código (como aquí, así que aquí) se obliga a redibujar el gráfico en cada tick creando comentarios en cada tick.


Es decir, independientemente de si la bandera en los parámetros de entrada está activada o desactivada.


Y la inclusión de su bandera en los parámetros de entrada, en este caso, sólo provoca un redibujado adicional a través deChartRedraw().

Es decir, en lugar de ser útil, crea una carga adicional sobre las ya existentes al crear comentarios

P./S.:

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias de comercio

Errores, fallos, preguntas

Renat Fatkhullin, 2017.12.05 02:51

...

En MT5, la función Comentario hace que el gráfico se redibuje explícitamente...

La diferencia es sólo eso.


Si en MT4 después de llamar a Comment se pone ChartRedraw() a la fuerza, el comportamiento sigue sin ser el mismo que en MT5. ChartRedraw() en Metatrader 4 ignora el valor del comentario y decide por sí mismo si actualiza o no el gráfico desde el último frame. Por supuesto, en ausencia de cientos de cotizaciones por segundo, lo que provocaría una desactivación de los datos del gráfico, ChartRedraw decide "por qué dibujar un gráfico sin cambios" y se salta el dibujo del marco.

Metatrader 5 también tiene el mismo sistema, pero hay muchos más casos en los que se da prioridad al sorteo incondicional.

Los terminales son aplicaciones gráficas y pueden proporcionar cientos de imágenes por segundo y funcionar en modo de visualización magra en aras del rendimiento.


De ahí las conclusiones adicionales al ejecutar las pruebas de referencia:

  • no se debe considerar una llamada a ChartRedraw como un verdadero dibujo de gráfico

  • siempre hay que saber y probar las afirmaciones "por qué se va a redibujar un gráfico" y "estoy invalidando la imagen interna del mercado para que el terminal decida redibujar el gráfico".

  • no se deben sacar múltiples conclusiones en MT5 durante los benchmarks, siempre se debe pensar en cómo se está afectando el renderizado

  • MT5 tiene un sistema más correcto de cambio de objetos en el gráfico y es necesario entender claramente las consecuencias de los comandos de lectura/escritura de la mezcla.
    se recomienda no mezclar los comandos de lectura/escritura, y hacer la lectura y la escritura masiva por separado.

  • El redibujado frecuente de los gráficos en las pruebas de referencia hace que los resultados dependan en gran medida de la tarjeta gráfica.
    de hecho, algunas pruebas pueden acabar poniendo a prueba la tarjeta gráfica en lugar de los algoritmos o las funciones. la prueba en un ordenador portátil y en un ordenador de sobremesa puede mostrar resultados varias veces diferentes simplemente por una tarjeta gráfica 3-5 veces más lenta

Estos errores los comete todo el mundo.


 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

ChartNavigate durante la inicialización

Vladimir Karputov, 2018.06.25 18:52

Tengo que comprobarlo...

...
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.: Además de su segundo código: antes de actualizar la entrada de texto y la publicación a través del mismo comentario, compruebe si los datos han cambiado. Si no es así, es mejor posponer la actualización y publicación del texto.

Es decir, en este caso es si el número de la primera barra del gráfico ha cambiado

 
Vladimir Karputov:

Tendré que comprobar...

Mmm. No sé muy bien de qué se trata. Bien, entonces. Lo he instalado. Lo he comprobado en los modos CHART_BEGIN y CHART_END. Funciona como se anuncia. Después de reiniciar, está bien.

O estás llegando al punto en el que necesitas usar una muleta: comprueba el número de la primera barra del gráfico después de ChartNavigate y, si no es el correcto, ejecuta ChartNavigate de nuevo.

Sí, la salida, por supuesto, también lo pensé. Pero es cansino acordarse constantemente de esas fichas del terminal. Después de todo, es muy posible que se trate de un error.

 
Dina Paches:

P./S.: Además de su segundo código: antes de actualizar una entrada de texto y publicarla a través del mismo comentario, compruebe si los datos han cambiado. Si no es así, es mejor posponer la actualización y publicación del texto.

Es decir, en este caso es si el número de la primera barra del gráfico ha cambiado

Gracias por la información, por supuesto, pero aquí no estamos hablando de rendimiento. El problema que estamos discutiendo está en un plano ligeramente diferente, es sólo códigos de prueba para comprobar si el problema se ha manifestado ))

 
Ihor Herasko:

Gracias, por supuesto, por la información, pero aquí no estamos hablando de rendimiento. El problema que estamos discutiendo está en un plano ligeramente diferente, es sólo códigos de prueba para comprobar si el problema aparece ))

De nada. Pero vea también mi otro post al que el que ha citado es una posdata.

P./S.: No desvalorices, por favor. Yo no ejecutaré esos códigos en el mío, sabiendo lo que conlleva. Mi equipo no es de uso público

 
Ihor Herasko:

Mmm. No sé muy bien de qué se trata. Bien, entonces. Lo instalé. Comprobado en los modos CHART_BEGIN y CHART_END. Todo funciona como se anuncia. Después de reiniciar, está bien.

O estás llegando al punto en el que necesitas usar una muleta - comprueba el número de la primera barra en el gráfico después de ChartNavigate y, si no es el correcto, ejecuta ChartNavigate de nuevo.

Sí, la salida, por supuesto, también lo pensé. Pero es cansino acordarse constantemente de esas fichas del terminal. Después de todo, es muy posible que se trate de un error.

Solía tener una navegación que funcionaba. Ahora tengo que comprobarlo a propósito.


Añadido: no prestar atención a los comentarios :)

 
Vladimir Karputov:

Mi navegación solía funcionar. Ahora tengo que comprobarlo a propósito.


Añadido: Ignora el comentario :)

¿Por qué? ¿Escribí/reporté tonterías?

Razón de la queja: