Lógica de aprendizagem - página 15

 
hrenfx:

Às vezes é necessário classificar os dados na MQL4 sem tocar nos próprios dados. Não há indicadores na MQL4, também não há estruturas.

A variante alternativa é criar posições de matriz[][2], copiar o parâmetro a ser classificado pelo índice zero e dar o primeiro índice para as posições. Em seguida, classifique a matriz com a função padrão AgraSort.

A vantagem é que o AgraSort utiliza um algoritmo de classificação eficiente, além disso, ele funciona em código nativo.

 
Candid:

Alternativamente, você pode criar um array Posições[][2], copiar o parâmetro a ser classificado pelo índice zero e dar o primeiro índice para as posições. Em seguida, classifique a matriz com a função padrão AgraSort.

Você poderia converter meu roteiro, na página anterior, usando seu método? Eu não entendo a descrição.
 
hrenfx:
Você poderia converter meu roteiro, na página anterior, usando seu método? Eu não entendo a descrição.

Gostei do caminho sugerido por https://www.mql5.com/ru/users/candid. Usado para torná-lo um pouco mais complicado. Vou usar um mais simples. Você pode classificar por qualquer atributo. Muito conveniente.
 
hrenfx:
Você poderia converter meu roteiro, na página anterior, usando seu método? Eu não entendo a descrição.

Não vou lhe dar o roteiro completo, mas vou lhe dar um esboço da função, deve ser o suficiente para entender a idéia

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


Agora, Posições[0][1] contém o índice do menor elemento Array, Posições[1][1] contém o índice do próximo elemento Array maior e Posições[i][1] contém o índice do i-ésimo elemento.

 
Candid:

Não vou escrever o roteiro inteiro, mas vou lhe dar um esboço da função, deve ser o suficiente para entender a idéia.

Eu não conhecia as peculiaridades de trabalhar com arrays multidimensionais na MQL4. Obrigado, o 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;
}