Para que sirve la funcion int IndicatorCounted( )
Para que sirve la funcion int IndicatorCounted( )
en la pagina dice: "The function returns the amount of bars not changed after the indicator had been launched last." osea "la funcion devuelve la cantidad de barras que no cambiaron despues de que la ultima vez que el indicador fue llamado"... Wow ¡¡¡que descriptivo!!!, ¿alguien podria explicarme detalladamente para que sirve esta funcion?
Re: Para que sirve la funcion int IndicatorCounted( )
Vamos a ver; aunque espero no ser yo el que necesite ayuda con esto.
Lanzas tu mql4 cuando tienes 1000 barras en pantalla...la función Bars devolverá 1000. Justo al lanzarse este mql4 dicha función IndicatorCounted() te dará 0...aquí viene lo de contar:
Un mql4 que vaya a graficar en pantalla incorpora "búferes", los cuales siempre deben estar referidos a una barra en particular (su número dentro de corchetes) buffer[número de la barra]. Recordemos que la última barra aparecida es la número 0, la penúltima 1,etc.
Para que el búfer "recorra" todas las barras que nos interesen el número de barra lo representará un valor o índice (shift) cambiante...buffer[shift] el cual debe mudar por alguna función operador circular tipo while o for. Supongamos que nuestro shift irá de 1000 a 0.
Nuestro búfer empezará trabajando en buffer[shift] cuando shift=1000 i acabará cuando shift=0. Al principio IndicatorCounted() dará 0 y al final dará 1000; pues la función se refiere al número de barras que el bufer a tenido en consideración; por lo menos así lo entiendo yo...aunque no case semánticamente con la definición que nos dan.
No tengo claro que ocurre cuando el buffer pega saltos; por ejemplo si solo lo haces pasar por las barras 1000, 900, 300 y 100...no se si te daría 4 (visitadas por el búfer) o 900=1000-100(contando todo el intervalo). Ahora no me viene en gana comprobarlo, pero apuesto por lo primero.
Los indicadores se vuelven a calcular con cada nuevo tik del precio. Usando IndicatorCounted() puedes evitar el gasto de que se reescriba toda la pantalla, limitándo el cálculo del búfer a una nueva barra aparecida; para ello se requiere que trabaje solo con shift=0...Básicamente se consigue con Bars-IndicatorCounted()-1.
Si al final tenemos Bars=1000 e IndicatorCounted()=1000, al sugir una nueva barra Bars=1001 y IndicatorCounted()=1000...Si queremos calcular únicamente el búfer para una nueva barra que acaba de completarse Bars-IndicatorCounted()=1 no nos vale, pues la última barra es la 0: debemos utilizar Bars-IndicatorCounted()-1=0.
Emplo:
Lo de if (ExtCountedBars>0) { ExtCountedBars--; } creo que tiene que ver con el modo de contabilización...no lo sé...y son las 5:00, por el amor de Dios.
Lanzas tu mql4 cuando tienes 1000 barras en pantalla...la función Bars devolverá 1000. Justo al lanzarse este mql4 dicha función IndicatorCounted() te dará 0...aquí viene lo de contar:
Un mql4 que vaya a graficar en pantalla incorpora "búferes", los cuales siempre deben estar referidos a una barra en particular (su número dentro de corchetes) buffer[número de la barra]. Recordemos que la última barra aparecida es la número 0, la penúltima 1,etc.
Para que el búfer "recorra" todas las barras que nos interesen el número de barra lo representará un valor o índice (shift) cambiante...buffer[shift] el cual debe mudar por alguna función operador circular tipo while o for. Supongamos que nuestro shift irá de 1000 a 0.
Nuestro búfer empezará trabajando en buffer[shift] cuando shift=1000 i acabará cuando shift=0. Al principio IndicatorCounted() dará 0 y al final dará 1000; pues la función se refiere al número de barras que el bufer a tenido en consideración; por lo menos así lo entiendo yo...aunque no case semánticamente con la definición que nos dan.
No tengo claro que ocurre cuando el buffer pega saltos; por ejemplo si solo lo haces pasar por las barras 1000, 900, 300 y 100...no se si te daría 4 (visitadas por el búfer) o 900=1000-100(contando todo el intervalo). Ahora no me viene en gana comprobarlo, pero apuesto por lo primero.
Los indicadores se vuelven a calcular con cada nuevo tik del precio. Usando IndicatorCounted() puedes evitar el gasto de que se reescriba toda la pantalla, limitándo el cálculo del búfer a una nueva barra aparecida; para ello se requiere que trabaje solo con shift=0...Básicamente se consigue con Bars-IndicatorCounted()-1.
Si al final tenemos Bars=1000 e IndicatorCounted()=1000, al sugir una nueva barra Bars=1001 y IndicatorCounted()=1000...Si queremos calcular únicamente el búfer para una nueva barra que acaba de completarse Bars-IndicatorCounted()=1 no nos vale, pues la última barra es la 0: debemos utilizar Bars-IndicatorCounted()-1=0.
Emplo:
Código: Seleccionar todo
//---- variables
int ExtCountedBars,Shift;
//---- shift
ExtCountedBars=IndicatorCounted();
if (ExtCountedBars>0) { ExtCountedBars--; }
Shift=Bars-ExtCountedBars-1;
Uno es esclavo de sus palabras y dueño de sus silencios (José María García).
Re: Para que sirve la funcion int IndicatorCounted( )
En la ayuda del metaeditor dice algo mas:zayqan escribió:en la pagina dice: "The function returns the amount of bars not changed after the indicator had been launched last." osea "la funcion devuelve la cantidad de barras que no cambiaron despues de que la ultima vez que el indicador fue llamado"... Wow ¡¡¡que descriptivo!!!, ¿alguien podria explicarme detalladamente para que sirve esta funcion?
"int IndicatorCounted( )
The function returns the amount of bars not changed after the indicator had been launched last. The most calculated bars do not need any recalculation. In most cases, same count of index values do not need for recalculation. The function is used to optimize calculating.
Note: The latest bar is not considered to be calculated and, in the most cases, it is necessary to recalculate only this bar. However, there occur some boundary cases where custom indicator is called from the expert at the first tick of the new bar. It is possible that the last tick of the previous bar had not been processed (because the last-but-one tick was being processed when this last tick came), the custom indicator was not called and it was not calculated because of this. To avoid indicator calculation errors in such situations, the IndicatorCounted() function returns the count of bars minus one.
Sample: ... ...."
O edita algún indicador y verás donde y como se utiliza.
Re: Para que sirve la funcion int IndicatorCounted( )
Hola,
Rescato este post porqué es justo el concepto que estoy intentado de entender.
Veo en el gráfico, que el indicador recalcula el valor de la barra en formación shift[0] tras cada nuevo tick. Según mis cálculos, debido al tipo de bucle que aparece por defecto en la programación del indicador, la última barra cero no debería dibujarse, pues la última ejecución del bucle se realiza para i<limit, y según mis recuentos:
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars; // según mis recuentos aquí limit es cero (p.e.para Bars=1000: 1000-999-1=0
La fórmula del indicador MACD por defecto es:
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=0; i<limit; i++)
MacdBuffer=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
SignalBuffer=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
return(0);
}
Entiendo que si limit vale 0, el bucle no debería ejecutarse, ya que i<limit no se cumple, y por lo tanto el indicador no debería devolver ningún valor sobre la barra en formación. Sin embargo, en el gráfico se está recalculando la barra 0 tras cada nuevo tick.
Alguien puede decirme donde estoy equivocándome? Tengo claro que algo estoy haciendo mal.
saludos y gracias.
Rescato este post porqué es justo el concepto que estoy intentado de entender.
Veo en el gráfico, que el indicador recalcula el valor de la barra en formación shift[0] tras cada nuevo tick. Según mis cálculos, debido al tipo de bucle que aparece por defecto en la programación del indicador, la última barra cero no debería dibujarse, pues la última ejecución del bucle se realiza para i<limit, y según mis recuentos:
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars; // según mis recuentos aquí limit es cero (p.e.para Bars=1000: 1000-999-1=0
La fórmula del indicador MACD por defecto es:
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=0; i<limit; i++)
MacdBuffer=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
SignalBuffer=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
return(0);
}
Entiendo que si limit vale 0, el bucle no debería ejecutarse, ya que i<limit no se cumple, y por lo tanto el indicador no debería devolver ningún valor sobre la barra en formación. Sin embargo, en el gráfico se está recalculando la barra 0 tras cada nuevo tick.
Alguien puede decirme donde estoy equivocándome? Tengo claro que algo estoy haciendo mal.
saludos y gracias.
___________________________
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
Re: Para que sirve la funcion int IndicatorCounted( )
1000-(999-1)=2CJS escribió: if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars; // según mis recuentos aquí limit es cero (p.e.para Bars=1000: 1000-999-1=0

Re: Para que sirve la funcion int IndicatorCounted( )
Hola Fer. Muchas gracias por tu rápida respuesta.
Mi fallo, más que un error de cálculo, era un error de lo que "--" conceptualmente significa al aplicarlo.
Entonces, entiendo que el bucle, en cada nuevo tick o llamada al método start(), hará 2 iteracciones y calculará la última barra recién completada [1] y la actual en formación [0].
Gracias de nuevo y saludos.
Mi fallo, más que un error de cálculo, era un error de lo que "--" conceptualmente significa al aplicarlo.
Entonces, entiendo que el bucle, en cada nuevo tick o llamada al método start(), hará 2 iteracciones y calculará la última barra recién completada [1] y la actual en formación [0].
Gracias de nuevo y saludos.
___________________________
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
Si te ha gustado este hilo del Foro, ¡compártelo en redes!