ChartNavigate durante la inicialización - página 6

 
Alexey Viktorov:

En este post:https://www.mql5.com/ru/forum/260815/page4#comment_7890492 he detallado las condiciones en las que se puede reproducir el problema. Esto se pudo reproducir en base a sus afirmaciones. Lo que escribí aquí

Es decir, una ligera modificación de las condiciones conducía a una reproducción constante del problema.

De alguna manera no te diste cuenta de esto

 
Alexey Viktorov:

P./S.: Imprimir en lugar de Comentar en su código no sólo sería un procedimiento más suave. Los resultados de la impresión en OnInit() son más fáciles de comparar, copiar y adjuntar aquí

 
Alexey Viktorov:

Sugerí que se actualizara no con la esperanza de que todo encajara, sino para que las construcciones fueran las mismas.

Igor, ¿haces los experimentos con la versión completa del indicador o con la experimental?

Tanto allí como allí. Pero todavía no puedo decir con seguridad cuál es el problema: si es un error o no. Necesito encontrar condiciones suficientemente reproducibles.

 
Alexey Viktorov:

¿Cómo hacerlo?

Según la descripción en el primer post del hilo, es un indicador, se cuelga en un gráfico abierto - significa que el historial ya está cargado. ¿Verdad? Cuelgue el indicador, cierre el terminal, inicie el terminal, --- ¿dónde puede ir la historia? Si ya estaba allí...

En segundo lugar, abrí el símbolo EURMXN. Sin mirar en el terminal, ¿se puede saber qué es? )))

Es fácil:

  1. Una plantilla con el indicador se guarda como default.tpl.
  2. Se abre el símbolo del gráfico, que nunca se ha abierto antes.
Por ello, primero se inicia el indicador y luego se cargan los datos. Tengo todo el conjunto de eventos en un solo paquete.

 
Ihor Herasko:

Tanto allí como allí. Pero todavía no puedo decir con certeza si es un error o no. Tenemos que encontrar condiciones suficientemente reproducibles.

Su redacción es un poco desafortunada. Lo que he citado es de condiciones reproducibles.

Otra cosa es que sí, probablemente lo que he descrito en los bloques I y II no sea un bug, sino peculiaridades de la carga de datos cuando se reinicia el terminal .

Y en la build 1870 hubo diferencias de repetición con respecto a lo que obtuve en la 1861.

Las combinaciones de mensajes (éxito y error 4111) han cambiado un poco. Por ejemplo, si antes había una reproducción tan estable:

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

Ahora, con el mismo código, los mensajes de error parecen ser más pronunciados:

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


Y el bloque IIIde ese post mío ya no es reproducible en el 1870.

Tampoco podría reproducir en la década de 1870 lo que se describe aquí:https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Última - tal vez depende de alguna manera en el sistema operativo (como una conjetura). Por ejemplo, este código de Vladimir me funciona bien, sin problemas

 
Ihor Herasko:

He encontrado un problema con la función ChartNavigate. Estoy haciendo algo mal o realmente hay un problema con la función. Escribe si lo has utilizado con frecuencia.

Así pues, el quid del problema: ChartNavigate no desplaza el gráfico Al iniciar el terminal Si llamas a esta función en OnInit(). Especialmente varias veces que leí la documentación. En ninguna parte dice que la función no puede ser llamada en la inicialización.

Código indicador para la reproducción:

Pasos para jugar:

  1. Desactivar la reproducción automática de gráficos.
  2. Adjunte el indicador al gráfico. ChartNavigate se activará al mover el gráfico a la posición deseada.
  3. Descargue el terminal.
  4. Cargue el terminal. ChartNavigate no funcionará mostrando el gráfico sin un desplazamiento.
OK, si la función diera un error. Pero no es así. Todas las llamadas tienen éxito, pero es cuando se recarga el terminal cuando el gráfico no se desplaza.

Pruebe las tres variantes del indicador y vea el resultado de cada una

1. ChartNavigate al final de los otros 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 uno - ningún otro comando al 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 otros comandos del 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()
  {

//--- Прокрутим от правого края графика на 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:

Y probar tres variantes del indicador, ver el resultado de cada uno

1. ChartNavigate al final de los otros comandos del gráfico

  1. Se adjunta el gráfico M1 con el desplazamiento automático activado. El autodesplazamiento está desactivado, el gráfico se ha movido 1000 barras a la izquierda.
  2. Recargue el terminal sin desconectar el indicador del gráfico. El gráfico muestra la vela actual, sin desplazamiento de 1000 barras a la izquierda. El desplazamiento automático sigue sin estar disponible.
  3. Repetí el paso 2 7 veces seguidas. 3 veces de ellas la transición a la izquierda de 1000 velas es completa, 4 veces - la transición no es completa.
Cuando no he perfeccionado el comando aparece "Waiting for refresh". Por lo tanto, se puede concluir que el terminal desplaza forzosamente el gráfico hasta las últimas cotizaciones al cargar el historial. Y como ocurre después de OnInit(), obtenemos un resultado inesperado.

2. ChartNavigate solo - ningún otro comando al gráfico

  1. Como el desplazamiento automático no se desactiva automáticamente en esta versión, lo desactivé manualmente y conecté el indicador. El gráfico se ha desplazado 1000 barras hacia la izquierda.
  2. Se ha reiniciado el terminal sin desconectar el indicador de la carta.
  3. En 2 de los 7 casos se ha realizado el desplazamiento. Y en uno de ellos ocurrió en tres etapas: mostrar el historial esperado, mostrar la vela actual y mostrar el historial esperado. Parece que OnInit() se ha ejecutado dos veces: una antes de que se cargue el historial y la segunda vez - después.

3. ChartNavigate antes de otros comandos del gráfico.

  1. He activado el desplazamiento automático y he adjuntado el indicador. El gráfico se sacudió y volvió a la vela actual. Como era de esperar, el autodesplazamiento se desactiva después del comando de movimiento de 1000 barras.
  2. Se ha reiniciado el terminal sin desconectar el indicador del gráfico (el gráfico muestra la vela actual).
  3. En los 7 casos el gráfico ha mostrado la vela actual, el desplazamiento ni siquiera ha parpadeado.
Si reiniciamos el terminal sin ningún indicador en el gráfico con el auto-desplazamiento desactivado y mostrando algún lugar en las profundidades de la historia, entonces en cada reinicio obtenemos la visualización del lugar donde se apagó el terminal. Resulta que en algún momento de la ejecución de los comandos de navegación se produce un movimiento hacia la vela actual.
 
Ihor Herasko:

  1. Se adjunta el gráfico M1 con el autodesplazamiento activado. Al desactivar el desplazamiento automático, el gráfico se desplazó 1000 barras hacia la izquierda.
  2. Recargue el terminal sin desconectar el indicador del gráfico. El gráfico muestra la vela actual, sin desplazamiento de 1000 barras a la izquierda. El desplazamiento automático sigue sin estar disponible.
  3. Repetí el paso 2 7 veces seguidas. 3 veces de ellas la transición a la izquierda de 1000 velas es completa, 4 veces - la transición no es completa.
Cuando no he perfeccionado el comando aparece "Waiting for refresh". Por lo tanto, se puede concluir que el terminal desplaza forzosamente el gráfico hasta las últimas cotizaciones cuando se carga el historial. Y como ocurre después de OnInit(), obtenemos un resultado inesperado.

Siempre olvido que su mensaje/sugerencia se lee al revés. Es como en un viejo chiste:

1917, octubre. Una señora, la nieta de
el Decembrista, está sentada en su propia casa en Nevsky. Al oír un ruido en la calle, pide a su conserje que averigüe qué está pasando
.
- ¡Jovencita, la revolución está ahí! - El conserje vuelve.
-¡Oh, qué maravilla! - ¡Mi abuelo soñaba con una revolución!
¡Ve y averigua qué quieren los revolucionarios, mi querido amigo!
- No quieren hombres ricos, señora", dice el conserje a su regreso.
- Es extraño -dice la señora, pensativa-, pero mi abuelo quería que no hubiera pobres.

Pensé que ibas a cambiar las propiedades del horario antes de reiniciar el terminal.
 
Rashid Umarov:

Siempre olvido que tu mensaje/sugerencia se leerá al revés.

¿Qué quieres decir? Has escrito que necesitas probar el funcionamiento de los tres indicadores. Como el tema es recargar el terminal y luego usar ChartNavigate, estas son las pruebas que se hicieron.

Pensé que ibas a cambiar las propiedades del gráfico antes de reiniciar el terminal.

¿Por qué, si el problema es que ChartNavigate no siempre funciona cuando se inicia el terminal? Esa es exactamente la cuestión.

 
Ihor Herasko:

¿el problema es exactamente que ChartNavigate no siempre se activa cuando se inicia el terminal? Esta es exactamente la cuestión.

Y también cuando cambie mi perfil. Además, si el ChartNavigate( chart_id, CHART_BEGIN, shift ) obtiene por ejemplo CHART_FIRST_VISIBLE_BAR, entonces el resultado será como si ChartNavigate hubiera funcionado. Si se elimina el Asesor Experto, la próxima vez que se inicie el Asesor Experto (éste u otro), el resultado de la obtención de CHART_FIRST_VISIBLE_BAR en este gráfico se verá como CHARTNavigate falló.

El resultado: operación de ChartNavigate extremadamente inconsistente ya en combinación con CHART_FIRST_VISIBLE_BAR

Razón de la queja: