Pregunta sobre el indicador - página 4

 
SDC:

¿O tal vez algo como esto?

pero deberías usar IndicatorCounted(), porque si lo haces así tu indicador está redibujando todos esos objetos en cada nuevo tick en lugar de dibujarlos todos una sola vez y añadir nuevos a medida que se forman nuevas barras

Esto y tu otro post sobre bools externos me da algunas otras ideas también, gracias

Mi enfoque tiene que ser más amplio pero como soy NooB tiendo a centrarme en una parte del código y descuidar otras como las externas.
Recién ahora me estoy metiendo en los arrays y me costó mucho entender los buffers, pero estoy empezando a superarlo.

Gracias esto me dará un montón de nuevas ideas ahora también.
 
SDC:


Tienes que tener en cuenta qué es lo que estás haciendo, cuando creas un indicador estás aplicando tu código a todas y cada una de las barras del gráfico, esto significa que necesitas obtener el valor del indicador macd tal y como era para cada una de esas barras históricas.

en tu código original lo hiciste:

el último parámetro 1 es el valor del macd tal y como estaba en la barra 1 del gráfico, la barra anterior a la actual que se indexa como barra 0

Obviamente no quieres usar ese único valor del macd en tu operador condicional sobre todo el gráfico histórico .

Necesitas indexar el macd al mismo índice de barra que cada barra, así que por ejemplo en la barra 500 necesitas esto

ese último parámetro debe cambiar para coincidir con el número de barra al que su indicador está aplicando sus algoritmos.

por eso lo necesitas dentro del bucle, para que puedas usar el iterador del ciclo del bucle para el último parámetro y así obtener tu valor de macd tal y como era para cada barra del gráfico histórico.

Espero que eso ayude a aclarar un poco las cosas.

Correcto, ya lo tenía resuelto.

Sin embargo, al añadir los códigos como if(val1 > 0 && faster > slower) esto no funcionaba al declarar faster y slower fuera del bucle.

AHHHHH ya veo porque el desplazamiento es (i) entonces lo necesito dentro del bucle OOOOPPPS LOL
 
Agent86:
¿Por qué for(int i = Bars-1 ? <----------------------- Las barras se indexan igual que las matrices, la primera barra=0, en lugar de 1. Así que la última barra es Bars-1;

¿Y por qué es esto mejor que for(int i = Bars ?? <----- ver arriba.

Por favor, aconsejar gracias


También:

Estoy asumiendo que esto es cierto para todos, y no sólo los indicadores / indicadores personalizados ?<--- lo que yo y WHRoeder: discutido sobre son cuestiones bastante generales. Nada específico. Sólo estábamos hablando con el otro sobre la declaración de variables y sus asignaciones, etc, w.r.t. bucles.

 
diostar:

También:


for(int i=Barras; i>=0; i--) es el código que he utilizado

for(int i=Barras-1; i>=0: i--) es el sugerido

Pensé que Bares = número de barras en el gráfico actual ? al menos según el diccionario.

Así que --i supuse que estaba contando hacia abajo desde el número de barra más alto como 1002 o algo así y contando --i hacia abajo hasta realmente -1
Porque mientras i>=0 debería contar hacia abajo hasta -1 antes de volverse falso. Si fuera 0 o mayor sería verdadero y haría un bucle por última vez hasta llegar a -1

Al menos eso es lo que yo creía que funcionaba. ¿Me equivoco?

Si i=0 y ++i y se cuenta hacia arriba entonces pensé que contaría hasta el final hasta la última barra.

Pero en este caso Bars-1 que dices no serían realmente todas las Barras cerradas sino que incluye la Barra[0] que aún no está cerrada o algo así?

No estoy seguro de entender la diferencia entre Bars-1 y Bars. ¿Tiene algo que ver con la barra 0 actual que no se cuenta cuando simplemente se refiere a Bares?

Por favor, aconséjeme, gracias.


 

Sí, es porque tienes una barra 0, así que Bares te da la cuenta de barras en el gráfico incluyendo la barra 0

así que considere un gráfico pequeño, sólo hay 2 barras en el gráfico, bar[0] y bar[1]

Bares le da el conteo así que Bares == 2

si quiere aplicar su indicador para comenzar en la última barra del gráfico

Puede probar con i=Barras.

Como sabemos, Bars = 2 pero no hay ninguna barra indexada como bar[2] la última barra es Bar[1]

por lo que tiene que hacer i=Bars-1

 
Agent86:
for(int i=Barras; i>=0; i--) es el código que he utilizado<--- digamos que, por ejemplo, Close[i], esto cuenta desde close[Bars] hasta close[0]. Cuando i=Bars, ¿existe close[i]?

for(int i=Barras-1; i>=0: i--) se sugiere<--- por ejemplo, para Close[i], esto cuenta desde close[Bars-1] hasta close[ 0]. Cuando i=Bars-1, ¿existe close[i]?

Pensé que Bars = número de barras en el gráfico actual... al menos según el diccionario. <---ok

Así que --i supuse que estaba contando hacia abajo desde el número de barra más alto como 1002 o algo así y contando --i hacia abajo hasta realmente -1 ¿Existe close[1002], close[-1]?
Porque mientras i>=0 por lo que debe contar hasta realmente -1 antes de que se convierta en falso. Si fuera 0 o mayor sería true y haría un último bucle hasta llegar a -1 <---- en close[-1], devuelve 0. No false

Al menos eso es lo que yo pensaba que funcionaba. ¿Estoy equivocado? <--- ver más abajo ref.

Si i=0 y ++i y se cuenta hacia arriba, entonces pensé que contaría hasta el final hasta la última barra <--- Obedientemente, hará eso.

Pero en este caso Bars-1 que dices no serían realmente todas las Barras cerradas sino que en realidad incluye la Barra[0] que no está cerrada todavía o algo así <--- en este caso, el precio de cierre devolverá el precio actual de Bid tick

No estoy seguro de entender la diferencia entre Bars-1 y Bars. ¿Tiene algo que ver con la barra actual 0 que no se cuenta cuando simplemente se refiere a Bares? <--- ver la referencia de abajo

Por favor, aconsejar Gracias bienvenido





doble Close[]
Matriz de series que contiene los precios de cierre de cada barra del gráfico actual.

Los elementos del array de series se indexan en orden inverso, es decir, del último al primero. La barra actual, que es la última del array, se indexa como 0. La barra más antigua, la primera del gráfico, se indexa como Bars-1.
 
Ya veo, por alguna razón estaba pensando que el buffer manejaba este tema un poco diferente porque técnicamente ni siquiera declaré el número de elementos en el array así que pensé que el buffer ya resolvía esto.

De todos modos entiendo esto y tiene sentido, gracias

 
Agent86:
Ya veo, por alguna razón estaba pensando que el buffer manejaba este tema un poco diferente porque técnicamente ni siquiera declaré el número de elementos en el array así que pensé que el buffer ya trabajaba esto.

De todos modos, entiendo esto y tiene sentido, gracias



¿Qué? No me había dado cuenta de que todo esto se refería a los topes indicadores. Ahora que lo sé, lee estas referencias tomadas de: https://www.mql5.com/en/articles/1500

(1) buffers indicadores & arrays de usuario - son ambos iguales y DIFERENTES. & La razón por la que los buffers indicadores no son dimensionados por el usuario, no tiene nada que ver con que ya se haya trabajado en ello. ver la siguiente ref:

double ExtMapBuffer1[];

Se trata de un array habitual. Pero no se indica la dimensionalidad y no se realiza la inicialización. Este array se configurará posteriormente como un buffer de datos.

(2) los buffers indicadores en la salida & en la entrada (el buffer de datos de arriba) pueden parecer iguales, pero diferentes.

SetIndexBuffer(0,ExtMapBuffer1);

Esta función "vincula " un array a un número de buffer. Es decir, muestra que el buffer con el número indicado utilizará el array indicado para almacenar datos. Así, cambiando los elementos de este array se cambiará el valor del buffer. En realidad, un array es un buffer de datos.El primer argumento es el nombre del array que debe ser enlazado.


Como ves, todo funciona. Ahora veamos lo que hace el código:

for(int i=0;i<Bars;i++)

Usamos el ciclo for para recorrer todos los elementos del buffer de datos. Como a cada elemento del buffer le corresponde una barra determinada, usamos el ciclo, empezando por la barra cero (la última disponible) y terminando por la primera disponible, que es sucesivamente una menos que la variable Bars (porque contamos las barras desde cero).

{
   ExtMapBuffer1[i]=MathRand()%1001;
}

En cada iteración se incrementa el contador en uno, y pasamos de la última barra disponible a la primera al mismo tiempo asignando a cada elemento del buffer (que corresponde a una barra determinada) un número aleatorio de 0 a 1000. Si te resulta difícil entender cómo un determinado elemento del buffer corresponde a una determinada barra, intenta cambiar el ciclo de la siguiente manera y mira el resultado en el terminal:

for(int i=0;i<Bars;i++)
{
   ExtMapBuffer1[i]=i;
}



 
diostar:

doble Cierre[]
Matriz de series que contiene los precios de cierre de cada barra del gráfico actual.

Los elementos del array de series se indexan en orden inverso, es decir, del último al primero. La barra actual, que es la última del array, se indexa como 0. La barra más antigua, la primera del gráfico, se indexa como Bars-1.

Ok, creo que ahora lo veo, gracias
 
Gracias a todos

A medida que aprendo más sobre los indicadores parece que el diseño que estoy utilizando no sería muy útil para su uso en un EA, pero sólo tal vez bueno para el uso visual y / o manual.

Dado que el contador cuenta hacia abajo 1 - parecería que el uso de este método no sería bueno para referirse a los objetos de la matriz para su uso en el comercio a menos que tal vez sólo se refieren a un cambio en particular [i] en cuyo caso tendría que encontrar la manera de referirse específicamente a sólo los elementos de la matriz que me gustaría utilizar para una señal de comercio situado en sólo las barras particulares.

Si lo utilizo tal y como está, es probable que las operaciones se produzcan en todo el gráfico, al igual que el indicador

Así que ahora supongo que voy a aprender cómo hacer referencia a varios elementos de la matriz en cualquier indicador con el fin de hacer referencia a los valores / tiempos / barras, etc.

Gracias a todos por la ayuda, y esto me dará mucho que pensar sobre cómo podría crear indicadores iCustom y hacerlos útiles en un EA
Razón de la queja: