Para que sirve la funcion int IndicatorCounted( )

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Responder
zayqan
Mensajes: 2
Registrado: 13 Jul 2010 03:33

Para que sirve la funcion int IndicatorCounted( )

Mensaje por zayqan »

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?
Avatar de Usuario
cu6yu4
Mensajes: 632
Registrado: 10 Oct 2009 15:31
Ubicación: Barcelona

Re: Para que sirve la funcion int IndicatorCounted( )

Mensaje por cu6yu4 »

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:

Código: Seleccionar todo

//---- variables
int ExtCountedBars,Shift;

//---- shift
ExtCountedBars=IndicatorCounted();
if (ExtCountedBars>0) { ExtCountedBars--; }
Shift=Bars-ExtCountedBars-1;
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.
Uno es esclavo de sus palabras y dueño de sus silencios (José María García).
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: Para que sirve la funcion int IndicatorCounted( )

Mensaje por Fer137 »

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?
En la ayuda del metaeditor dice algo mas:

"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.
CJS
Mensajes: 174
Registrado: 01 May 2008 16:54
Ubicación: Barcelona

Re: Para que sirve la funcion int IndicatorCounted( )

Mensaje por CJS »

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.
___________________________

El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: Para que sirve la funcion int IndicatorCounted( )

Mensaje por Fer137 »

CJS 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
1000-(999-1)=2 :)

CJS
Mensajes: 174
Registrado: 01 May 2008 16:54
Ubicación: Barcelona

Re: Para que sirve la funcion int IndicatorCounted( )

Mensaje por CJS »

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.
___________________________

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!


Responder

Volver a “Metatrader 4”