Учимся логике - страница 15

 
hrenfx:

Иногда возникает необходимость отсортировать данные на MQL4, не трогая их самих. Указателей в MQL4 нет, нет также и структур.

Альтернативный вариант - завести массив Positions[][2], по нулевому индексу скопировать параметр, по которому нужна сортировка, а первый отдать позициям. После чего отсортировать массив стандартной функцией АrraySort.

Преимущество - в АrraySort используется эффективный алгоритм сортировки, к тому же она работает в нативном коде.

 
Candid:

Альтернативный вариант - завести массив Positions[][2], по нулевому индексу скопировать параметр, по которому нужна сортировка, а первый отдать позициям. После чего отсортировать массив стандартной функцией АrraySort.

Могли бы вы преобразовать мой скрипт, на предыдущей странице, по вашему методу? Описание не понял.
 
hrenfx:
Могли бы вы преобразовать мой скрипт, на предыдущей странице, по вашему методу? Описание не понял.

Мне понравился способ предложенный https://www.mql5.com/ru/users/candid. Раньше немного усложнял. Буду использовать более простой. При этом можно сортировать по любому признаку. Очень удобно
 
hrenfx:
Могли бы вы преобразовать мой скрипт, на предыдущей странице, по вашему методу? Описание не понял.

Весь скрипт не буду, а набросок функции дам, этого должно быть достаточно для понимания идеи

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


Теперь в Positions[0][1] - индекс самого маленького элемента массива Array, в Positions[1][1] - индекс следующего по величине, в Positions[i][1] - индекс i-того.

 
Candid:

Весь скрипт не буду, а набросок функции дам, этого должно быть достаточно для понимания идеи

Про особенности работы с многомерными массивами в MQL4 не знал. Спасибо, метод рабочий: 

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