Línea vertical. - página 4

 

Todavía estoy aprendiendo los entresijos de los indicadores y tengo preguntas. Restablezco el búfer del indicador en OnInit(), pero por alguna razón los búferes no se restablecen durante la compilación del indicador. Por lógica, tras la compilación debería haber una celda completa por cada buffer , pero en la imagen se ve que hay muchas (creo que son las celdas del buffer anterior). ¿Dónde me equivoco?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
Archivos adjuntos:
 
Nauris Zukas:

Todavía estoy aprendiendo los entresijos de los indicadores y tengo preguntas. Reinicio el buffer del indicador en OnInit(), pero por alguna razón los buffers no se reinician durante la compilación del indicador. Por lógica, tras la compilación debería haber una celda completa por cada buffer , pero en la imagen se ve que hay muchas (creo que son las celdas del buffer anterior). ¿Dónde me equivoco?

En OnInit los buffers de los indicadores tienen longitud cero.


Por eso pueden hacer lo que quieras, todo les parece un trabajo de hombre muerto.

Y cuando la ejecución del código pasa a OnCalculate, el tamaño se hace inmediatamente igual a rates_total.

y hay "basura" en todas las celdas de la matriz. También puede haber restos del antiguo cálculo de indicadores.

 
Alexey Viktorov:

En OnInit, los búferes de los indicadores tienen longitud cero.


Por eso puedes hacer lo que quieras con ellos, son un regalo de muerte.

Y cuando la ejecución del código pasa a OnCalculate, el tamaño se hace inmediatamente igual a rates_total.

y todas las celdas de la matriz tienen "basura" en ellas. Es posible que queden restos del antiguo cálculo del indicador.

¡Muchas gracias, lo tengo todo y ha funcionado! Lo hizo así:

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Muchas gracias, ¡todo salió bien! Lo hice así:

¿Por qué asignar un valor a una variable dos veces?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

Y una pregunta: ¿Por qué lo necesito todo? Después de todo, al pasar por todas las barras del bucle, todas las celdas del array deben estar llenas de algo de todos modos. A menos que el indicador sólo deba mostrar la posición actual, pero entonces el array debe ser inicializado en cada barra, no sólo al principio...

 
Alexey Viktorov:

¿Por qué asignar un valor a una variable dos veces?

No estaba seguro de si todas las acciones con el gráfico son imitadas por OnInit(), por ejemplo el cambio de taimfreims. Cambiando el restablecimiento de taimfreim (lo acabo de comprobar), pero tal vez haya algo más, así que puse la segunda en OnInit() para estar seguro. Pero si no, entonces no lo pondré.
 
Alexey Viktorov:

Y la pregunta es: ¿Por qué necesitamos todo esto? Después de todo, al pasar por todas las barras del bucle, todas las celdas de la matriz deben estar llenas de algo, de todos modos. A menos que el indicador sólo deba mostrar la posición actual, pero entonces el array debería inicializarse en cada barra, no sólo al principio...

En este ejemplo, sólo quería entender cómo restablecer el búfer. Pero en el futuro (en el indicador en el que estoy trabajando ahora), necesitaré tanto dejar las celdas anteriores como añadir otras nuevas. Y justo en esto empecé a trabajar. Por así decirlo, las primeras pruebas.

 
Nauris Zukas:
No estaba seguro de que todas las acciones con el gráfico sean imitadas por OnInit(), por ejemplo, el cambio de taimfreims. Cambiando el reinicio de taimfreim (lo he comprobado ahora), pero quizás haya algo más, así que he puesto el segundo en OnInit() para estar seguro. Pero si no, entonces no lo pondré.

Ahh. Pues sí, las variables de nivel global no se inicializan cuando cambia el periodo del gráfico. Creo que... no puedo recordar exactamente.

Y en general se puede prescindir de esa variable bool extra.

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[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

Y en general, se puede prescindir de esta variable bool adicional.

Sí, exactamente, incluso mejor, gracias.

 

¿Puedes decirme por qué, si el periodo es superior a 30 minutos, devuelve un número tan extraño?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) PERIOD: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIOD: 16388
 
Nauris Zukas:

¿Puedes decirme por qué si el periodo es superior a 30 minutos, devuelve un número tan extraño?

En MT5, los valores del período no son iguales al número de minutos, como en MT4