Mi indicador desaparece cada vez que cambio a un nuevo cuadro de tiempo - página 3

 

Hola COSUDE,

Lo tengo. Muchas gracias.

si hay 100 bar, las tasas totales comienzan de 0 a 99.

Al principio, pre_cal =0 --> limit=100 bar - 0 =100.

for(int=1 hasta limit=100; I++)

al final, I=100(valor del índice) y no hay tal barra 100.

Por lo tanto para hacer el máximo I=99, pongo límite -1;

Me pregunto si hay alguna forma mejor.

Además, lo que me confunde es que en muchos otros indicadores, utilizo el mismo enfoque y no hay tal problema de fuera de rango.

Además, gracias por la pestaña Expert.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

Además, lo que me confunde es que en muchos otros indicadores, uso el mismo enfoque y no hay tal problema de fuera de rango.



antes B600 fuera de rango no era un error crítico
 
scfx:.

Por lo tanto para hacer el máximo I=99, pongo el límite -1;

Me pregunto si hay alguna forma mejor.

Tu código dibujará ahora el historial del gráfico desde la barra 1 hacia arriba sin error, pero no dibujará ninguna barra nueva. Hay muchas maneras de codificar dependiendo de lo que quieras hacer. Mire los indicadores incluidos en el metaeditor para ver cómo lo hacen los codificadores de MQ. Cuando puedas leer su código y entender la razón de cada línea no tendrás problemas para crear indicadores.

 

Ya lo tengo, COSUDE.

Personalmente, es difícil de imaginar cuando leo el documento. Todavía no estoy seguro de por qué prev_calculated= Total_rates -1.

Así que hago un ejemplo numérico aquí. Espero que pueda ayudar a alguien nuevo como yo.

Normalmente vemos:

Limit= rates_total- prev_calculated; //(no-1)

O

for(i=1;i<limit;i++) o for(i=1;i<=limit;i++)

Lo importante es asegurarse de que LIMIT >=1. En mi situación, LIMIT=0 y por lo tanto, el indicador no es REFESHED cuando la nueva garrapata que viene en.

Por qué, vamos a ver. (Creo que la causa es el prev_calculado al menos en mi caso)

Suponiendo que yo adjunte el indicador cuando hay 100 barras en el gráfico. Aquí están los valores de las variables:

Primera tabla de valores
Variable
Total_rates 100
Indice de barra 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

Todo está bien. El valor aparecerá por primera vez desde la barra 1 hasta el principio del gráfico.¿Cuántas barras se han calculado ya? Es punto crítico a mi error y no estoy 100% claro.

Cuando se inicia una nueva barra, en el gráfico ahora hay 101 barras. El indicador no se actualiza en la barra ya cerrada, que es ahora la barra 1.

Segunda tabla de valor
Variable
Total_rates 101
Índice de barra 0-100
prev_calculated 99 O 100 (ver abajo)
Límite2 OR 1
Bucle i valor 1 a 1 OR 1 a 0

Basado en la tabla 1, el indicador calcula 99 bar (ya que el bucle de 1 a 99).
Sin embargo, desde el documento dice: "PERO si no es la primera llamada de start(), el valor igual a Bars-1 será devuelto). Así que devolverá 101-1=100.
Esta barra diferente causa problemas. Si el sistema devuelve 100 como prev_calculado.
Verá que, si prev_calculated=99, el bucle funcionará.
Sin embargo, parece que prev_calculated = 100 y por lo tanto el bucle no funcionará como límite =0 o -1 depende.
¿Puede alguien ayudarme a ver la lógica detrás de prev_calculated= Bars-1 en este caso?

Así que la solución es bastante clara: Hacer for(i=1; ___ este aquí debe ser mayor que 1 for (<) o mayor o igual a 1 for (<=)___; i++). En mi último código, es igual a 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Espero que te sirva de ayuda.

SCFX

 

prev_calculado == rates_total

scfx:

Ya lo tengo SDC.

Personalmente es difícil de imaginar cuando leo el documento. Todavía no estoy seguro de por qué prev_calculated= Total_rates -1.

SCFX

Crea un nuevo indicador pon este código en la función de inicio, adjúntalo a un gráfico de 1 minuto y observa las alertas cuando lleguen los ticks.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Verá que rates_total es la cantidad actual de barras.

prev_calculado es la cantidad de barras que había en el tick anterior.

 
SDC:

prev_calculado == tasas_total

Cree un nuevo indicador poniendo este código en la función de inicio, adjúntelo a un gráfico de 1 minuto y observe las alertas a medida que llegan los ticks.

Verá que rates_total es la cantidad actual de barras.

prev_calculated es la cantidad de barras que había en el tick anterior.


Vaya, qué raro.

En el enlace publicado antes, decían que si :PERO si no es la primera llamada a start(), se devolverá el valor igual a Bars-1.

Como es que devuelve Bars (Rate_totals).

 

Sí, ya sé que lo dicen, pero no es del todo exacto.

lo que realmente sucede es esto.

rates_total == cantidad total de barras cuando llegó el tick actual. prev_calculated == cantidad total de barras cuando llegó el tick anterior.

Barras en el gráfico Estado del indicador rates-total prev-calculated rates_total-prev_calculated
1000 primera ejecución cuando se carga 1000 0 1000
1000 siguiente tic 1000 1000 0
1000 siguiente tick 1000 1000 0
1001 1er tick de la nueva barra 1001 1000 1
1001 siguiente tick 1001 1001 0
1001 siguiente tick 1001 1001 0

Por lo tanto, tiene 3 estados principales de prev_calculated vs rates_total. Indicador cargado, ticks de la barra media, primer tick de la nueva barra.

prev_calculated == 0 en la primera ejecución porque no hubo ningún tick anterior desde que se cargó el indicador.

Además, si se cambia el gráfico o se añade el historial, prev_calculated vuelve a cero.

El valor de retorno de OnCalculate no se utiliza, pero es mejor utilizar el retorno por defecto (rates_total) en caso de que alguna vez lo arreglen.

 
Barras en el gráfico Indicador Estado tasas-total prev-calculado rates_total-prev_calculated
1000 primera ejecución cuando se carga 1000 0 1000
Y la barra 1000 no existe.

Sé lo que dicen los nuevos documentos. Si lo haces a su manera tienes que comprobar que prev_calculado es distinto de cero y ajustar rates_total - prev_calculado a uno menos. Eso es volver a decrementar la confusión de indicator_counted.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Ver Mostrar el progreso del indicador - foro MQL4
 

No tiene sentido hacer return( rates_total - 1) el valor de prev_calculated es ese como si fuera return(rates_total) independientemente de lo que le hayas dicho que devuelva.

 
SDC: No tiene sentido hacer return( rates_total - 1 ) el valor de prev_calculated es ese como si fuera return(rates_total) independientemente de lo que le hayas dicho que devuelva.
¿has publicado el problema en el servicio técnico?
Razón de la queja: