Lógica de aprendizaje - página 15

 
hrenfx:

A veces es necesario ordenar los datos en MQL4 sin tocar los datos mismos. No hay punteros en MQL4, tampoco hay estructuras.

La variante alternativa es crear el array Posiciones[][2], copiar el parámetro a ordenar por el índice cero y dar el primer índice a las posiciones. A continuación, ordenar la matriz con la función estándar AgraSort.

La ventaja es que AgraSort utiliza un algoritmo de ordenación eficiente, además, funciona en código nativo.

 
Candid:

Alternativamente, puedes crear un array Posiciones[][2], copiar el parámetro a ordenar por el índice cero y dar el primer índice a las posiciones. A continuación, ordenar la matriz con la función estándar AgraSort.

¿Podría convertir mi script, en la página anterior, utilizando su método? No entiendo la descripción.
 
hrenfx:
¿Podría convertir mi script, en la página anterior, utilizando su método? No entiendo la descripción.

Me gustó el método sugerido por https://www.mql5.com/ru/users/candid. Se utiliza para hacer un poco más complicado. Utilizaré uno más sencillo. Puede ordenar por cualquier atributo. Muy conveniente.
 
hrenfx:
¿Podría convertir mi script, en la página anterior, utilizando su método? No entiendo la descripción.

No te daré todo el script, pero te daré un boceto de la función, debería ser suficiente para entender la idea

void SortArrayINT( int& Array[], int& Positions[][]) {
  int i, Size = ArraySize(Array);
    
  ArrayResize(Positions, Size);
  
  for (i = 0; i < Size; i++) {
    Positions[i][0] = Array[i];
    Positions[i][1] = i;
  }
  ArraySort(Positions);
  return;
}


Ahora, Positions[0][1] contiene el índice del elemento más pequeño de la matriz, Positions[1][1] contiene el índice del siguiente elemento más grande de la matriz y Positions[i][1] contiene el índice del elemento i-ésimo.

 
Candid:

No voy a escribir todo el script, pero te daré un boceto de la función, debería ser suficiente para entender la idea.

No conocía las peculiaridades de trabajar con arrays multidimensionales en MQL4. Gracias, el método funciona:

void SortArrayINTCandid( int Array[], int& Positions[][] )
{
  int Size = ArraySize(Array);
    
  ArrayResize(Positions, Size);
  
  for (int i = 0; i < Size; i++)
  {
    Positions[i][0] = Array[i];
    Positions[i][1] = i;
  }

  ArraySort(Positions);

  return;
}

void PrintInfo( string SortName, int Array[] )
{
  int PositionsCandid[][2];
  
  SortArrayINTCandid(Array, PositionsCandid);
  
  Print("Sort by " + SortName);
  Print("SYMBOL   PROFIT   POS   SL");

  for (int i = 0; i < AMOUNT; i++)
    Print(Symbols[PositionsCandid[i][1]] + "   " + Profit[PositionsCandid[i][1]] + "   " +
          Pos[PositionsCandid[i][1]] + "   " + SL[PositionsCandid[i][1]]);
          
  Print("");
          
  return;
}