Errores, fallos, preguntas - página 249

 


alexluek:

No hubo pérdida de conectividad, ni sobrecarga de ticks, y cuanto más grande es el TF, más raro es.

Y el método de cálculo desde la fecha de inicio hasta la fecha de finalización (he descubierto que hay 3) sin

Probablemente ocurre (recalcula todas las barras), pero aún no es preciso y no sé cómo comprobarlo.

pero es sólo una idea - vamos a comprobarlo...

Tal vez haya otro enfoque para evitarlo...


Yedelkin:

Por supuesto que hay un enfoque. Si(prev_calculado==0), realizamos el cálculo inicial para todas las barras. Posteriormente, para cada nuevo tick (si 0 < prev_calculado < rates_total) realizamos cálculos como for(int i=prev_calculado-1;i< rates_total;i++) sólo para las últimas barras aparecidas.


Aún así, se re-dibuja. Implementado de esta manera:


int calculated1=BarsCalculated(StdDev1Handle);

...................

if(CopyBuffer(StdDev1Handle,0,0,to_copy,ExtStdDev1Buffer)<to_copy)return(0);

......................

int data1=CopyOpen(Symbol1,0,0,rates_total,Open1Buffer);

.....................

for(int i=rates_total-2; i>=0; i--)
{
if(time[i]>=DateStart)

{


Se redibuja entonces no, pero tal vez se trata de la corrección del trabajo del código

pero no en el terminal (pero al menos ahora no es tan distintivo...)

Las garrapatas o no garrapatas pueden volver a dibujarse.

La impresión es que no hay coherencia (relación causa-efecto).

Lo único que se me ocurre es que el procesador sea débil o que se cuelgue

Lo único que se me ocurre es un procesador débil o la congelación del terminal (MT5).

 

alexluek:

...................

Se redibuja y luego no, pero se trata de la corrección del código

y no en el terminal (pero al menos ahora no es tan distintivo...)

Por favor, envíe una solicitud a Desk con el código fuente y lo resolveremos.
 

¿Alguien ha trabajado con la segunda versión de la función ChartGetInteger?

2. Возвращает true или false в зависимости от успешности выполнения функции.
В случае успеха значение свойства помещается в приемную переменную, 
передаваемую по ссылке последним параметром.

bool  ChartGetInteger(
   long    chart_id,        // идентификатор графика
   int     prop_id,         // идентификатор свойства
   int     sub_window,      // номер подокна
   long&   long_var         // сюда примем значение свойства
   );

? Parece que el valor de la propiedad no se pasa a la variable receptora. Al menos, este comportamiento se observa cuando se utiliza la construcción

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))
La función devuelve true, pero la variable windows contiene el valor obtenido durante la inicialización de esta variable. En este caso, la primera versión de la función produce un valor correcto. (Y una cosa más trivial: si la variable de obtención se declara del tipo long, el compilador genera una advertencia).
 
Yedelkin:

¿Alguien ha trabajado con la segunda versión de la función ChartGetInteger?

? Parece que el valor de la propiedad no se pasa a la variable receptora. Al menos, este comportamiento se observa cuando se utiliza la construcción

La función devuelve true, pero la variable windows contiene el valor obtenido durante la inicialización de esta variable. En este caso, la primera versión de la función produce un valor correcto. (Y una cosa más trivial: si la variable de obtención se declara del tipo long, el compilador genera una advertencia).
Sí, existe. Sólo que estaba tratando de solicitar el color de fondo. Quería escribir a Servicedesk, pero lo olvidé.
 
Lizar:
Sí, existe. Sólo he intentado pedir el color de fondo. Iba a escribir a Servicedesk, pero se me olvidó.
De acuerdo, lo haré.
 
Yedelkin:

¿Alguien ha trabajado con la segunda versión de la función ChartGetInteger?

? Parece que el valor de la propiedad no se pasa a la variable receptora. Al menos este comportamiento se observa cuando se utiliza la construcción

La función devuelve true, pero la variable de la ventana receptora contiene el valor obtenido durante la inicialización de esta variable. En este caso, la primera versión de la función produce el valor correcto. (Y una pequeña cosa más: si la variable receptora se declara con el tipo long, el compilador generará una advertencia).

Parece que está utilizando una función incorrecta. Esta es la primera variante de la función (con tres parámetros). No devuelve true (como crees), sino el valor del parámetro

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))

No veo tu código, pero parece que es correcto:

long Chart=0,windows;
if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,0,windows))
  {
   //--- всё плохо
  }
 
uncleVic:

Parece que estás usando la función equivocada. Esta es la primera versión de la función (con tres parámetros). No devuelve true (como crees), sino el valor del parámetro

No veo tu código, pero parece que es correcto:

Hmmm..., sí, tenía este error exacto - miré mi antiguo código donde intentaba usar esta función.
 
uncleVic:

Parece que estás usando la función equivocada. Esta es la primera versión de la función (con tres parámetros). No devuelve true (como crees), sino el valor del parámetro

DE ACUERDO. Vamos a investigarlo.

1. La función se utiliza "que", porque usted cita una función con el mismo nombre que su ejemplo. Sólo puede ser una cuestión de qué versión de esa función (la primera o la segunda) se está utilizando.

2. De hecho, formalmente la primera variante de la función tiene tres parámetros, mientras que la segunda tiene cuatro. Sin embargo, en la descripción del parámetro sub_window, que está presente en ambas variantes de la llamada, se indica claramente que "La mayoría de las propiedades no requieren el número de subventana". La pregunta que surge es: ¿es necesario o no indicar el número de ventana para una propiedad como CHART_WINDOWS_TOTAL (Número total de ventanas del gráfico incluyendo las subventanas del indicador)?

3 Es lógico suponer que no es necesario especificar el número de ventanas/subventanas del gráfico por separado para obtener el número total de ventanas/subventanas. Esta conclusión se ve respaldada por el ejemplo extraído directamente del propio Manual ( sección Propiedades de los gráficos):

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);

Un enfoque similar se describe en la sección Operaciones del Gráfico / ChartWindowOnDropped.

A partir de estos ejemplos, se puede ver que la posición de los autores del Manual es que no es necesario especificar un número de subventana separado para obtener el número total de ventanas/subventanas de un gráfico. Por supuesto, los ejemplos utilizan la primera variante de la función, pero como estamos hablando de la misma propiedad (es decir, CHART_WINDOWS_TOTAL), sería lógico suponer que la misma conclusión es válida para la segunda variante de la función. Sobre todo si se tiene en cuenta que el Manual no contiene ninguna reserva sobre la necesidad de especificar un número de subventana cero para la segunda variante de la función.

4. Su ejemplo sugiere que el tercer parámetro(sub_window) debe especificarse siempre para la segunda variante de la función, aunque la propia propiedad no requiera especificar un número de subventana. Es decir, a diferencia de la primera variante de la función (que puede utilizarse tanto con dos como con tres parámetros), la segunda variante de la función requiere siempre los cuatro parámetros. ¿Verdad?

5. Si es correcto, hemos establecido dos cosas. En primer lugar, mi versión original del problema resultó ser errónea. En segundo lugar, la razón de esta versión errónea es que la información del Manual es incompleta. Por lo tanto, propongo que se aclare en el Manual que "No hay ningún valor por defecto para la segunda opción, por lo que siempre debe especificarse el número de subventana. Para la mayoría de las propiedades que no requieren un número de subventana, es necesario especificar 0 (ventana del gráfico principal)". O algo así.

Gracias por el ejemplo. Es corto y va al grano.

 
Yedelkin:
En la primera variante de la función intsub_window=0 tiene un valor por defecto, por lo que puede omitirse; en la segunda variante no existe tal valor por defecto, por lo que debe especificarse.

 
Yedelkin:

DE ACUERDO. Vamos a resolverlo.

1. La función utilizada es "esa", porque usted cita una función con el mismo nombre que su ejemplo. Sólo puede ser una cuestión de qué versión de esa función (la primera o la segunda) se está utilizando.

2. De hecho, formalmente la primera variante de la función tiene tres parámetros, mientras que la segunda tiene cuatro. Sin embargo, en la descripción del parámetro sub_window, que está presente en ambas variantes de la llamada, se indica claramente que "La mayoría de las propiedades no requieren el número de subventana". La pregunta que surge es: ¿es necesario o no indicar el número de ventana para una propiedad como CHART_WINDOWS_TOTAL (Número total de ventanas del gráfico incluyendo las subventanas del indicador)?

3 Es lógico suponer que no es necesario especificar el número de ventanas/subventanas del gráfico por separado para obtener el número total de ventanas/subventanas. Esta conclusión se ve apoyada por el ejemplo extraído directamente del propio manual de referencia (sección Propiedades de los gráficos):


1. Teniendo en cuenta que la función está realmente sobrecargada, podemos argumentar que no lo está (aunque, como puedes imaginar, es discutible);

2. esa es la cuestión. Si entiendo correctamente la lógica de la sobrecarga de funciones en MQL5, la primera opción se puede utilizar con 2 o 3 parámetros, mientras que la segunda sólo se puede utilizar con 4 parámetros.

Es decir, si una función recibe dos o tres parámetros, MQL5 utilizará la primera opción, mientras que siempre utilizará la segunda si recibe 4.

La cuestión es que el compilador se confunde en sus llamadas si utilizamos la segunda variante con un número de parámetro no igual a 4.

3. Hay una pequeña inexactitud en la Referencia (o más bien una redacción ligeramente errónea). El sentido general es el siguiente - la mayoría de las propiedades no requieren un número de ventana, y en la primera opción para tales propiedades, el número de ventana puede ser omitido(en la segunda opción debe ser especificado, pero será ignorado).

4. De lo anterior se deduce que para este ejemplo el compilador elegirá la primera variante de la función.

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);
¡¡¡El compilador llegará a esa conclusión basándose en que el tercer parámetro en la primera variante puede omitirse, mientras que en la segunda variante debe estar necesariamente presente!!!