[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 82

 
wolf05632:

Gracias, pero no me funciona. No necesito una compensación. Más arriba escribí. Supongamos que para la primera vela buffer[1]=Altura[1], para la tercera buffer[3]=Altura[3] y para la segunda hay que calcular: buffer[2]=MathAbs(Higth[1]-Hight[3])/2 y obtener lo que quiero en la imagen.
¿Y qué no te gusta de mi variante? :)) Es mucho más sencillo y menos complicado. ¿O necesita, que en un buffer permanezcan los valores en cada barra?
 

wolf05632:

SZY: ¿Cómo puedo hacer que un indicador funcione, es decir, que haga cálculos (que FUNCIONE, no que sea visible) sólo en un determinado marco temporal (H1)?

Debe vincular el cálculo no al marco temporal actual, sino al H1. :)) Es decir, no utilizar matrices Open[], Close[], High[], Low[], Time[], sino funciones iOpen(), iClose(), iHigh(), iLow(), iTime() con los parámetros correspondientes...
 
MaxZ:
¿Por qué no te ha gustado mi versión? :)) Mucho más sencillo y menos cálculos. ¿O quiere mantener los valores en el buffer en cada barra?

Lo he intentado, gracias, pero no ha funcionado. No he conseguido que aparezca en el gráfico. Puede que haya entendido algo mal. ¡Lo único que entendí lo principal: los elementos del buffer deben ir secuencialmente (1,2,3...), es decir, sin huecos (1,3,5...) y ¡CADA! elemento del buffer debe tener un valor asignado! :-)
 

Roman, gracias por la respuesta..... Por desgracia, sigo sin entender una cosa. En el libro de texto, https://book.mql4.com/ru/basics/expressions, en el apartado "Type Approach. Opción 4.1. Calcular el resultado de un tipo entero

y la variante 4.2. Una situación similar ocurre si buscamos un resultado como valor de tipo real", se da la misma fórmula, pero en un caso, el tipo de la variable F se designa como int

   double A = 2.0;                      // Количество карандашей у Васи
   int    Y = 3;                        // Количество ответов Пети
   int    F = A + Y;                    // Общее количество

y en el segundo ejemplo, la variable es doble

   double A = 2.0;                   // Количество карандашей у Васи
   int    Y = 3;                     // Количество ответов Пети
   double F = A + Y;                 // Общее количество

Por desgracia, sigo sin entender la lógica de la conversión. Si en la primera variante está claro por qué se asigna int a la variable F (es decir, según la regla de conversión de tipos implícita), entonces por qué se asigna double.... en la segunda variante me confunde totalmente.

Por favor, aclare lo que pueda haber pasado por alto en mis explicaciones aquí.

Gracias de antemano.

 
wolf05632:

Lo he intentado, gracias, pero no ha funcionado. No se veía nada en el gráfico. ¿Quizá he entendido algo mal?

¿Copiaste todo el código o sólo lo que había en la función start()? Es importante.

wolf05632:

Lo único que entendí lo más importante: los elementos del buffer deben ir uno detrás de otro (1,2,3...), es decir, sin huecos (1,3,5...) y ¡CADA elemento del buffer debe tener un valor asignado! :-)
Te equivocas. :)) Por ejemplo, el zig-zag no tiene todos los elementos del buffer llenos. Además, no es necesario llenar todos los elementos del buffer para los iconos.
 
Geowind64:

Roman, gracias por la respuesta..... Por desgracia, sigo sin entender una cosa. En el libro de texto, https://book.mql4.com/ru/basics/expressions, en el apartado "Type Adduction". Opción 4.1. Calcular el resultado de un tipo entero

y la variante 4.2. Una situación similar se produce cuando se busca en el resultado un valor de tipo real", se da la misma fórmula, pero en un caso, el tipo de la variable F se designa como int

y en el segundo ejemplo, la variable ya es un doble

Por desgracia, sigo sin entender la lógica de la conversión. Si en la primera variante está claro por qué se asigna int a la variable F (es decir, según la regla de conversión de tipos implícita), entonces por qué en la segunda variante se asigna double.... me confunde completamente.

Por favor, explique lo que pueda haber pasado por alto en mi explicación.

Gracias de antemano.



n


El tipo interanger es un tipo duble, el tipo de variable duble tiene un rango más amplio, por lo que no es posible que las variables en una expresión "tengan la posibilidad" de ser de diferentes tipos, y el resultado es una variable que tiene un rango más estrecho de valores aceptados, en este caso, el tipo interanger. Es decir, si al menos una variable de una expresión es de tipo duble, el resultado debe y puede estar también en el rango de duble, de lo contrario se producirá un error de compilación - mismatch de tipo.

Para más detalles, consulte aquí.

 
Roman.:


El entero es un tipo dudoso, y las variables dudosas tienen un ámbito más amplio, por lo que no es posible que las variables de una expresión "tengan la posibilidad" de ser de diferentes tipos, y el resultado es una variable que tiene un rango de valores más estrecho, en este caso, el tipo entero. Es decir, si al menos una variable de una expresión es de tipo duble, el resultado debe y puede estar también en el rango de duble, de lo contrario se producirá un error de compilación - mismatch de tipo.

Para más detalles, consulte aquí.


A menudo utilizo la conversión implícita de tipos. Pero tengo que usar paréntesis innecesarios.
 

Chicos, ¿qué significa #INF - está fuera del rango permitido del doble? ver la segunda línea desde arriba (cuenta el producto del doble TWR, es decir, su valor anterior se multiplica por el siguiente). ¿Cuál es la forma correcta de contar esos valores tomados por la variable TWR?

 
Geowind64:

Si lees con atención esta sección del libro de texto, verás que primero debes fijarte en la expresión a la izquierda de la asignación "=":

   A + Y

Según la norma:

  • si el tipo de la expresión a la derecha del signo de asignación no es el mismo que el tipo de la variable a la izquierda del signo de asignación, entonces el valor de la expresión se convierte al tipo de la variable a la izquierda del signo de asignación; esto se denomina conversión de tipo objetivo;

A es una variable de tipo double a la izquierda, por lo que el valor de A+Y es un número de tipo double.

A continuación, preste atención al tipo de variable al que se asigna la expresión.

En el primer caso: "primero el tipo de expresión A+Y se convertirá en tipo int (según la regla de cálculo de enteros), y luego este resultado se convertirá en el valor de la variable entera F".

En el segundo caso: "el tipo de destino de la variable F (a la izquierda del signo de la operación de asignación), en este caso el tipo double, es el mismo que el tipo double de la expresión A+Y, por lo que no se produce ninguna conversión de tipo de destino".

¿Verstehen? :)))

 
Roman.:

Chicos, ¿qué significa #INF - está fuera del rango permitido del doble? ver la segunda línea desde arriba (cuenta el producto del doble TWR, es decir, su valor anterior se multiplica por el siguiente). ¿Cómo contar correctamente los valores tomados por la variable TWR?

En general, INFINITY (INF para abreviar ) es el infinito. :)) Sí, resulta que el doble carece de potencia (memoria) para almacenar un número tan grande.

Y cómo calcular correctamente, sólo puedo adivinar... Crear Tipo propio, condicionalmente: almacenar en la variable adicional capacidad de dígitos, y doble multiplicar por 10^n, donde n es la capacidad de dígitos. Pero en este caso, la precisión se pierde, y veo que tu precisión es cada vez peor...

¿Pero puede ser más sencillo cambiar la lógica de los cálculos? :))) O tal vez haya un error en alguna parte.