Logica di apprendimento - pagina 15

 
hrenfx:

A volte è necessario ordinare i dati in MQL4 senza toccare i dati stessi. Non ci sono puntatori in MQL4, non ci sono nemmeno strutture.

La variante alternativa è quella di creare l'array Positions[][2], copiare il parametro da ordinare per l'indice zero e dare il primo indice alle posizioni. Poi ordinate l'array con la funzione standard AgraSort.

Il vantaggio è che AgraSort utilizza un algoritmo di ordinamento efficiente, inoltre, funziona in codice nativo.

 
Candid:

In alternativa, potete creare un array Positions[][2], copiare il parametro da ordinare per l'indice zero e dare il primo indice alle posizioni. Dopo di che, ordinate l'array con la funzione standard AgraSort.

Potresti convertire il mio script, nella pagina precedente, usando il tuo metodo? Non capisco la descrizione.
 
hrenfx:
Potresti convertire il mio script, nella pagina precedente, usando il tuo metodo? Non capisco la descrizione.

Mi è piaciuto il modo suggerito da https://www.mql5.com/ru/users/candid. Usato per renderlo un po' più complicato. Ne userò uno più semplice. È possibile ordinare per qualsiasi attributo. Molto conveniente.
 
hrenfx:
Potresti convertire il mio script, nella pagina precedente, usando il tuo metodo? Non capisco la descrizione.

Non vi darò l'intero script, ma vi darò uno schizzo della funzione, dovrebbe essere sufficiente per capire l'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;
}


Ora, Positions[0][1] contiene l'indice dell'elemento più piccolo della matrice, Positions[1][1] contiene l'indice del prossimo elemento più grande della matrice e Positions[i][1] contiene l'indice dell'i-esimo elemento.

 
Candid:

Non scriverò tutto lo script, ma vi darò uno schizzo della funzione, dovrebbe essere sufficiente per capire l'idea.

Non conoscevo le peculiarità del lavoro con gli array multidimensionali in MQL4. Grazie, il metodo funziona:

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;
}