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

 
Taras Slobodyanik:

el formato de los comentarios puede variar de un corredor a otro.

No he visto la ausencia de "Para" y "De"
 
Artyom Trishkin:
No vi la ausencia de "Para" y "De"
Artem, busca mi pregunta arriba....
 

¡Buenos días a todos!

Pueden decirme si hay una función en MQL4 (o en MQL5, pero que funcione en MQL4) que convierta el array LoY[2][7] en array LoY[7][2] y viceversa. Algo así como una transposición. A continuación, una muestra de la transformación que necesito. Quiero tener exactamente la función. Ya sé cómo convertir un array en un bucle.

Gracias por su ayuda.

 
ANDREY:

¡Buenos días a todos!

Pueden decirme si hay una función en MQL4 (o en MQL5, pero que funcione en MQL4) que convierta el array LoY[2][7] en array LoY[7][2] y viceversa. Algo así como una transposición. A continuación, una muestra de la transformación que necesito.

Gracias por su ayuda.

Sólo como referencia: en los algoritmos clásicos (de la informática en general) esa operación se llama zip,

No encuentro esa función en la biblioteca. Es terriblemente derrochador e ineficiente. Es más fácil y rápido cambiar los índices en el algoritmo/programa o utilizar accesos indirectos que reordenar TODOS los datos en las matrices.

 
Maxim Kuznetsov:

Es más fácil y rápido cambiar los índices en el algoritmo/programa o utilizar referencias indirectas que reordenar TODOS los datos de las matrices.

Muchas gracias por su respuesta. Por desgracia, no estoy tan avanzado en programación como tú. Te agradecería mucho que escribieras algún código mql4 que cambie los índices de los arrays para solucionar mi problema. Y si das un ejemplo de referencia indirecta, te lo agradeceré doblemente.

Entenderé mejor su proceso de pensamiento y aprenderé algo nuevo y útil para mí gracias a usted.

 
ANDREY:

Muchas gracias por su respuesta. Por desgracia, no estoy tan avanzado en programación como tú. Te agradecería mucho que escribieras algún código en mql4 para cambiar los índices de los arrays y solucionar mi problema. Y si das un ejemplo de referencia indirecta, te lo agradeceré doblemente.

Comprenderé con más precisión su proceso de pensamiento y aprenderé algo nuevo y útil para mí gracias a usted.

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

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

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

Es corto, pero es lo peor que puedes hacer :-) dos bucles anidados y copia elemento a elemento de los arrays.

Cuando dentro de su algoritmo se puede simplemente cambiar el nombre de los índices. Sólo tienes que cambiar i por j en tu código y viceversa...

 
Maxim Kuznetsov:

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

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

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

corto, pero es lo peor que puedes hacer :-)

Muchas gracias. ¿Y un ejemplo de lo mejor? :-).... para que lo entienda bien.

Copiar elemento por elemento es largo y consume energía... especialmente para arrays grandes...... si no me equivoco.

 
Andrei, ¿por qué querrías hacer eso? Si los datos ya están recogidos en un array, puedes encontrar la manera de utilizarlos tal cual sin mover nada. O preensamblarlos en una matriz en el orden correcto. ¿Qué quieres conseguir?
 
Aleksei Stepanenko:
Andrei, ¿por qué lo necesitas? Si los datos ya están recogidos en un array, puedes encontrar la manera de utilizarlos tal cual sin mover nada. O puedes reunirlos en una matriz en el orden correcto de antemano. ¿Qué quieres conseguir?

Aquí está mi código simple para ilustrar lo que necesito.

double LoY[2][31],LoU,LoU1;
int S,S1,S2;

void OnTick()
{
//*************************************************** БЛОК 1
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,10,0.5555);

S1=Minute();
}
//*************************************************** БЛОК 2
if (Minute()!=S)
{
LoY[0][S2]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Г ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [30] ",   LoY[0][30],"  [60] ",   LoY[0][60]);
Print("----LoY[1][0]-- В ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [30] ",   LoY[30][0],"  [60] ",   LoY[60][0]);
S2++;
if (S2==62)
{
S2=0;
}
S=Minute();
}
}

En el bloque 1, se ejecuta ArrayFill(LoY,0,10,0.5555) y asigna a los 10 primeros elementos del array el valor 0.5555. Después, necesito ordenar toda la fila nula desde la columna 0 hasta la columna 31.

Quiero ordenarlo en el bloque 2, utilizando ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); pero no puedo ordenarlo porque esta función ordena un array bidimensional por su primera dimensión, es decir, por filas. Y tengo una cadena para ordenar sólo 1. ArraySort() en la segunda dimensión, es decir, las columnas no ordenar matriz de dos dimensiones (sólo unidimensional).

Así que pensé que quizás debería convertir LoY[2][31] después del primer bloque en LoY[31][2], para que ArraySort() pudiera ordenar los valores que necesito en el bloque 2. Y necesito ordenar todos los valores de la fila cero después de que ArrayFil() haya cambiado los 10 primeros.

¿Puedo ordenar matrices bidimensionales por la segunda dimensión, es decir, por columnas, utilizando alguna otra función, o algo más?
Lo siento... No sé cómo borrar el código. Así que sólo diré que hay un error en la línea 180 en lugar de LoY[S2][0]=Bid; necesitamos LoY[0][52]=Bid;

Gracias por su ayuda.

 
¿Quiere ordenar los valores de ambas filas o sólo los de la primera?