Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1413

 
Alexey Viktorov:

Las funciones IntegerToString() y DoubleToString() sólo representan el número como una cadena que se pasa a la función. En el ejemplo

es la conversión de r en una cadena y las cadenas se "suman". Pero antes, el valor de r cambia.

No entiendo muy bien la pregunta, pero si necesitas seleccionar sólo los elementos pares del array, el bucle debería construirse así


Gracias por la explicación.

 
Alexey Viktorov:

Las funciones IntegerToString() y DoubleToString() sólo representan el número como una cadena que se pasa a la función. En el ejemplo

es la conversión de r en una cadena y las cadenas se "suman". Pero antes de esto el valor de r cambia.



No puedo entender el proceso de "añadir" valores de las variables de cadena. Veo 2 variantes de "añadir" cadenas en mi código.

1. Suman el valor de la variable de cadena de la iteración actual con el valor de la misma variable de cadena de la iteración anterior.

2. En la iteración actual, se suman los valores de las dos variables de término, es decir, IntegerToString(r) + DoubleToString(LoY[r],4).

Me parece que se refiere a la primera variante.

Pero entonces .... El valor de IntegerToString(r) en la iteración anterior = "0" y en la iteración actual = "1" . El resultado de la suma debe ser "01".

Si en la iteración actual antes de sumar el valor IntegerToString(r) cambia del 0 anterior al 1 actual, seguimos obteniendo una representación de cadena de dos dígitos del número, es decir, "11".

Si utilizamos el mismo algoritmo para sumar los valores de la variable de cadena DoubleToString(LoY[r],4), el resultado de la suma de dos cadenas debería tener valores como 1,61041,6105

Pero Print() imprime los resultados de la suma como otros números por alguna razón (como debe ser)
No lo entiendo.
Este es su ejemplo de cómo se suman los valores de las variables de cadena "...... y si se suman las cadenasDoubleToString(2.3, 1)+DoubleToString(3.6, 1), será 2.33.6 como cadena". Es decir, antes de la adición, la representación de cadena del número de cada variable era de 2 caracteres, pero después de la adición de dos variables de cadena, el resultado de la adición es una representación de cadena del número de 4 caracteres. ¿Por qué la suma en tu código no da como resultado un número con el doble de caracteres?

 
Alexey Viktorov:


Noentiendo muy bien la pregunta, pero si quieres seleccionar sólo los elementos pares de un array, entonces el bucle debería construirse así


En realidad, esto es lo que quería decir con .... Aquí está el código original completado con BOX 2

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
Print("-------------------------------------LoY[r]--------------=",  LoY[r]);
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("---LoY[0]--",  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,  "---LoY[3]--" ,  X,  "---LoY[4]--" ,  X, ................  "---LoY[30]--" ,  X );
}
}
}

En el segundo bloque, los valores de los elementos del array ya no difieren en el mismo delta que en el primer bloque. El delta entre elementos adyacentes puede ser diferente y, por tanto, el algoritmo de conexión de cadenas del primer bloque no es adecuado para el segundo bloque.... me parece.

PREGUNTA Con qué construcción o función del lenguaje MQL4 en el segundo bloque del código anterior, la función Print(), al final del bucle, imprimirásólo una vez, con todos los valores de los elementos del array rellenados, dispuestos en una línea, es decir, tendrá la siguiente forma

Print("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

No me juzgues duramente, pero no estoy seguro de poder entender la explicación con palabras, porque el segundo bloque es mucho más complicado que el primero.... me parece.
Gracias por su ayuda.

 

Al programar, hay mucho trabajo rutinario, al menos al principio. Se piensa en la idea, se escribe el código y se depura. A veces el tiempo de depuración es más largo que todo lo demás.

A menudo ocurre que la idea inicial no funciona. Empieza a buscar de arriba a abajo en orden de lo que está mal.

Inserte printf() en todas partes, y vea si esto es lo que espera o no. Esto le permitirá comprender más rápidamente cómo funciona el código y dónde tiene un error. De lo contrario, la comprensión llevará mucho tiempo.


No es asunto mío, pero trata de escribir bien. Escoge un estilo para ti mismo y cíñete a él. Coloque los corchetes entre paréntesis para hacer visibles las fijaciones. Si utiliza espacios entre las frases, utilícelos en todas partes o, por el contrario, no los utilice en todas partes.

for(int x=0; x<31;x++)

if (Bid < LoY[x] )

Así te será más fácil leer tu propio código.

-----------------

En el segundo bloque:

En el segundo bloque, la x minúscula y la X mayúscula son variables diferentes, el código no funcionará como quieres.

Sería mejor ordenar el array fuera del bucle.

En Imprimir se utiliza X veces, se imprimirá el mismo número de veces.

-----------------

Sobre el código. Es difícil entender la pregunta, así que te diré lo que yo he entendido.

Si escribes Print en un bucle, obtendrás tantas impresiones como iteraciones tenga ese bucle. Si necesita imprimir la salida una vez, coloque Print después del bucle.

En este caso, utilice una variable, en la que escribirá el valor de cada iteración, para recoger la información. Nuestra variable es una cadena, por lo que todos los números deben ser convertidos a cadena.

Tenemos una variable de cadena porque la función Print acepta una cadena.

Lo que está pasando:

Primera pasada. Antes de la primera pasada antes del bucle, tenemos una variable vacía: string str="";
A continuación, asignamos un valor vacío a la variable más "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+",";
aquí r es 0 y realmente añadimos algunas cadenas:

"--LoY["+

IntegerToString(0)+

"]--, "+

DoubleToString(LoY[0],4)+

", ";

Segundo pase.

A todo esto añadimos la información del segundo elemento

"--LoY["+IntegerToString(1)+"]--, "+DoubleToString(LoY[1],4)+", ";

Esto no cambia la cadena del primer elemento.



Es mejor que expliques el propósito con palabras, lo que necesitas en lugar de cómo lo haces. De lo contrario, es posible que discutamos su código durante mucho tiempo y resulte que su objetivo puede resolverse de otra manera.

 
ANDREY:

No puedo entender el proceso de "añadir" valores de variables de cadena. Veo 2 opciones para "añadir" cadenas en mi código.

1. El valor de la variable de cadena de la iteración actual se suma al valor de la misma variable de cadena de la iteración anterior.

2. En la iteración actual, se suman los valores de las dos variables de término, es decir, IntegerToString(r) + DoubleToString(LoY[r],4).

Me parece que se refiere a la primera variante.

Pero entonces .... El valor de IntegerToString(r) en la iteración anterior = "0" y en la iteración actual = "1" . El resultado de la suma debe ser "01".

Si en la iteración actual antes de la adición, el valor IntegerToString(r) cambia del 0 anterior al 1 actual, seguimos obteniendo una representación de cadena de dos dígitos del número, es decir, "11".

Si sumamos los valores de la variable de cadena DoubleToString(LoY[r],4) por el mismo algoritmo , entonces el resultado de sumar dos cadenas debe ser valores como 1.61041.6105

Pero Print() por alguna razón imprime los resultados de la suma como otros números (como debe ser)
No lo entiendo.
Este es su ejemplo de añadir valores de variables de cadena "...... y si añade cadenasDoubleToString(2.3, 1)+DoubleToString(3.6, 1), será 2.33.6 como cadena". Es decir, antes de la adición, la representación de cadena del número de cada variable era de 2 caracteres, pero después de la adición de dos variables de cadena, el resultado de la adición es una representación de cadena del número de 4 caracteres. ¿Por qué la suma en tu código no da como resultado un número con el doble de caracteres?

De hecho, esto es como escribir cualquier texto. Empezamos con una hoja de papel en blanco, o mejor dicho, con una línea en blanco. Entonces escribimos la primera palabra, le añadimos la segunda y así sucesivamente.......... Y cuando vemos números en el texto, los escribimos como símbolo de línea. Es decir, si sumamos 2 + 5, se obtiene 7, y si simplemente escribimos estos mismos números, entonces primero escribimos 2 y luego 5... así obtenemos dos números 25, escritos uno al lado del otro. No sé de qué otra manera explicarlo.

En realidad, si ignoras las advertencias del compilador, la conversión de los valores r a una cadena en tu ejemplo no es necesaria. Aquí puede marcar estas dos opciones

Print("Test 1 " + (string)1 + (string)2);
Print("Test 2 " + 1 + 2);
 
Aleksei Stepanenko:


Gracias por su ayuda y sus consejos.

 
Alexey Viktorov:

De hecho, es exactamente lo mismo que escribir cualquier texto. En primer lugar tenemos una hoja de papel en blanco, o debería decir una línea en blanco. Entonces escribimos la primera palabra, le añadimos la segunda y así sucesivamente.......... Y cuando vemos números en el texto, los escribimos como símbolo de línea. Es decir, si sumamos 2 + 5, se obtiene 7, y si simplemente escribimos estos mismos números, entonces primero escribimos 2 y luego 5... así obtenemos dos números 25, escritos uno al lado del otro. No sé de qué otra manera explicarlo.

En realidad, si ignoras las advertencias del compilador, la conversión de los valores r a una cadena en tu ejemplo no es necesaria. Aquí tienes y comprueba dos de estas variantes

Gracias por todo

 
ANDREY:

Esto es lo que quise decir con .... Este es el código original, complementado con el BOX 2

En el segundo bloque, los valores de los elementos del array no difieren en el mismo delta que en el primer bloque. El delta entre elementos adyacentes puede ser diferente y, por tanto, el algoritmo de conexión de cadenas del primer bloque no es adecuado para el segundo bloque.... me parece.

PREGUNTA Con qué construcción o función del lenguaje MQL4 en el segundo bloque del código anterior, la función Print() imprimirásólo 1 vez después de terminar el bucle, con todos los valores de los elementos del array rellenados en una línea, es decir, tendrá la siguiente forma

Print("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

No me juzgues duramente, pero no estoy seguro de poder entender la explicación con palabras, porque el segundo bloque es mucho más complicado que el primero.... me parece.
Gracias por la ayuda.

¿Y por qué ordenar el array en cada iteración del bucle? Porque si sustituyó el valor del elemento 0 de la matriz y después de ordenar fue al final de la matriz, entonces el cero será el valor que fue el primero, y el primero será el valor que fue el segundo. Así, el valor del primer elemento del array se saltará y obtendrá "basura". En definitiva, todo su código es algo fuera de lugar.

¿Para qué necesitas el primer bloque en el que rellenas el array? Llena el array inmediatamente con los valores que necesitas y luego ordénalo. Verdadero, tendrá que ejecutar un bucle más para llenar la cadena e imprimir. Me gustaría que mql4 tuviera ArrayPrint()... Pero sólo son experimentos, y en realidad no necesitarás imprimir los valores del array.

 
Aleksei Stepanenko:

Mejor explica tu objetivo con palabras, lo que necesitas, no cómo lo haces. De lo contrario, podemos discutir su código durante mucho tiempo, y resultará que su objetivo se puede resolver de otra manera.

Mientras estudio mql4 (y un poco de mql5), estoy escribiendo varios códigos. Esto incluye los códigos que utilizan matrices. A menudo es necesario comprobar los elementos del array en algún lugar del código. He aprendido a hacerlo utilizando Print() en un bucle. Pero en este caso, Print() se imprime en cada iteración. Cuando hay muchas iteraciones, es inconveniente tanto para el programa como para la lectura. Usted ha dicho correctamente que Print( ) debe ser eliminado fuera del bucle para Print() con los valores de los elementos de la matriz para ser impreso sólo una vez. Lo había adivinado antes de sus palabras.

Aprendí rápidamente a poner Print() fuera del bucle. Y ahora estoy tratando de aprender cómo hacer que Print() imprima todos los valores de los elementos del array en una sola línea.

Me han explicado cómo hacerlo con respecto al primer bloque de mi código. Hasta ahora, en términos generales, he entendido esta tecnología. Seguiré devanándome los sesos para entender los detalles de este método.
Pero en el segundo bloque de mi código, según me parece, el método del primer bloque no es adecuado porque, a diferencia del primer bloque, el delta entre los valores de los elementos del array en el segundo bloque es diferente.
Si estoy en lo cierto y el método del primer bloque no se ajusta al segundo, te agradecería que me indicaras cómo hacer lo mismo que se hizo en el primer bloque, pero en relación con el segundo.

He corregido el segundo bloque. He puesto Print() y ArraySort() fuera del bucle. He eliminado la variable X de Print() para no inducir a error.

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("-LoY[0]-", (знач.эл.масс с инд.0), "---LoY[1]--" ,  (знач.эл.масс с инд.1),   "---LoY[2]--" ,  (знач.эл.масс с инд.2),  "---LoY[3]--" ,  (знач.эл.масс с инд.3),................  "---LoY[30]--" ,  (знач.эл.масс с инд.30) );
}
 
Print("-LoY[0]-", DoubleToString(LoY[0],4), "---LoY[1]--", DoubleToString(LoY[1],4), "---LoY[2]--" , DoubleToString(LoY[2],4), "---LoY[3]--" , DoubleToString(LoY[3],4),................  "---LoY[30]--" ,  DoubleToString(LoY[30],4) );

o hacer una función de impresión de matrices por separado:

void PrintArray(double &eArray)
   {
   string eStr="";
   int eSize=ArraySize(eArray);
   for(int i=0; i<eSize; i++)
      {
      eStr+=IntegerToString(i)+": "+DoubleToString(eArray[i],4)+", ";
      }
   Print(str);
   }

Y llamar desde cualquier lugar

PrintArray(LoY);
Razón de la queja: