prev_calculado

 
Los comentarios que no están relacionados con "Bugs, bugs, issues" se han movido a este hilo.
 

MT5 build 1455

Indicador de la prueba:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Poner el indicador en el gráfico

2. Cerrar el terminal

3. terminal abierto

Registro:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

¿Me estoy perdiendo algo o es imposible confiar en la variable prev_calculado, tengo que crujir la muleta?

 
Alexander Puzanov:

MT5 build 1455

Indicador de la prueba:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Poner el indicador en el gráfico

2. Cerrar el terminal

3. terminal abierto

Registro:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

¿Me estoy perdiendo algo o es imposible confiar en la variable prev_calculado, tengo que crujir la muleta?

La variable prev_calculated puede ponerse a 0 incluso sin la paginación del historial si la suma de comprobación ha cambiado (esta es una respuesta aproximada de servicedesk).
 
Alexey Kozitsyn:
La variable prev_calculated puede ponerse a 0 incluso sin la paginación de la historia si la suma de comprobación ha cambiado (esta es una respuesta aproximada de servicedesk).
Lo tengo. Gracias. Así que para el carpintero...
 
Alexander Puzanov:
Ya veo. Gracias. Así que para el carpintero...
No hay necesidad de exagerar - el retorno cero de prev_calculate es un evento ordinario. La tarea del programador es captar tal evento y rellenar correctamente los búferes de los indicadores en tal caso. Ni más ni menos.
 
Ilyas:

Se han añadido los operadores *(Dereferencia/Inderección) y &(Dirección-de), no se harán/planean cambios adicionales en el lenguaje

Por favor, aclare lo siguiente:

* Obtener una variable por referencia - sólo se aplica a:

1. objetos de clase

2. objetos de estructura

3. Tipos fundamentales

En este contexto, ¿es sólo rlvalue o también lvalue?

 
Karputov Vladimir:
La tarea del programador es atrapar tal evento

Así que no soy un programador: mis tareas son diferentes. Carpintero, supongo - "muleto la muleta" y creo que estoy "cogiendo el evento".

Y no exagero, porque el propósito declarado de esta variable:

prev_calculated  // обработано баров на предыдущем вызове

Además de ese propósito, también se supone que es una bandera de cambio en el historial, además de algunos otros cambios que hay que tener en cuenta. Todo esto es útil pero no podemos usarlo para su propósito directo - mostrar cuántas 'barras fueron procesadas durante la llamada anterior' - prev_calculated.

 
Alexander Puzanov:

Así que no soy un programador: mis tareas son diferentes. Carpintero, supongo - "muleto la muleta" y creo que estoy "cogiendo el evento".

Y no exagero, porque el propósito declarado de esta variable:

prev_calculated  // обработано баров на предыдущем вызове

Además de ese propósito, también se supone que es una bandera de cambio en el historial, además de algunos otros cambios que hay que tener en cuenta. Todo esto es útil, pero no se puede utilizar para su propósito directo - para mostrar cuántas "barras se procesaron en la llamada anterior" - prev_calculated

¿Y si simplemente recalculamos todo el indicador cuando 0? A mí me parece la mejor solución.
 
Alexander Puzanov:

Así que no soy un programador: mis tareas son diferentes. Carpintero, supongo - "muleto la muleta" y creo que estoy "cogiendo el evento".

Y no exagero, porque el propósito declarado de esta variable:

prev_calculated  // обработано баров на предыдущем вызове

Además de ese propósito, también se supone que es una bandera de cambio en el historial, además de que se supone que debe rastrear algunos otros cambios. Todo esto es útil, pero no podemos utilizarlo para su propósito directo - mostrar cuántas barras fueron "procesadas en la llamada anterior" - prev_calculated

Si prev_calculated=0, significa que se debe realizar un recálculo completo. Todos los indicadores estándar se recalculan completamente en este caso.

¿Qué no está claro?

Se dice que la suma de comprobación ha cambiado en la historia. Sería más barato volver a calcular el indicador que averiguar por qué ha cambiado la suma de comprobación.

La documentación menciona explícitamente que

Observe la conexión entre el valor de retorno de OnCalculate() y el segundo parámetro de entrada prev_calculado. El parámetro prev_calculado en la llamada a la función contiene un valor devuelto por OnCalculate() en lallamada anterior.Esto permite economizar los algoritmos de cálculo del indicador personalizado para evitar cálculos repetidos para aquellas barras que no han cambiado desde la anterior llamada a esta función.

Para ello, suele bastar con devolver el valor del parámetro rates_total, que contiene el número de barras de la llamada a la función actual. Si desde la última llamada de OnCalculate() los datos del precio han cambiado (se ha bombeado un historial más profundo o se han llenado los espacios en blanco del historial), entonces el valor del parámetro de entrada prev_calculado será puesto a cero por el terminal.

 
Alexey Kozitsyn:
¿Qué tal si simplemente se recalcula todo el indicador cuando es 0? En mi opinión, la mejor solución.
Esto es exactamente lo que debe hacer: cuando obtiene prev_calculate==0 debe recalcular todo el indicador. Ya que rev_calculate==0 suele ser un cambio de historia. Y si se intercambia el historial, significa que puede haber nuevas barras que se hayan perdido o que no se hayan calculado antes, es decir, que las lecturas del indicador ya serán erróneas.
 
Karputov Vladimir:
Esto es exactamente lo que debe hacer: cuando se recibe prev_calculate==0, debe recalcular todo el indicador. Ya que rev_calculate==0 suele ser un cambio de historia. Y si el historial se intercambia, significa que puede haber nuevas barras que se hayan perdido o que no se hayan calculado antes, es decir, las lecturas del indicador serán incorrectas.
:) Eso es lo que hago...