A sorter class to sort an array based on other arrays.
//+------------------------------------------------------------------+ //| class MultiSort<TItem,TKey1,TKey2,TKey3>.                        | //| Usage: Sorter class to sort an array based on other arrays.      | //+------------------------------------------------------------------+ template<typename TItem,typename TKey1,typename TKey2,typename TKey3> class MultiSort   { public:   //--- method to sort items by keys   void              SortBy(TItem& items[],                             TKey1& keys1[],                             TKey2& keys2[],                             TKey3& keys3[],                             bool  ascending_order1=true,                             bool  ascending_order2=true,                             bool  ascending_order3=true);   };
Note:
Empty keys arrays are ignored by the sorter.
For example to sort position tickets by position open time (as the only sort key):
  //--- sort tickets by position open time only   MultiSort<long,datetime,int,int> sorter;   int empty[];   sorter.SortBy(tickets,times,empty,empty);
Here is a complete example
//+------------------------------------------------------------------+ //|                                              MultiSort_demo.mq5 | //|                                        Copyright © 2018, Amr Ali | //|                            https://www.mql5.com/en/users/amrali | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Amr Ali" #property description "Multi sort example - Sort position tickets by symbol then by open time then by open price in accending or descending order." #property version  "1.000" #property script_show_inputs #include <MultiSort.mqh> //--- input variables input bool mode_asc_symbols = true;  // ascending order for symbols input bool mode_asc_times  = true;  // ascending order for time input bool mode_asc_prices  = true;  // ascending order for price //--- global variables long  tickets[]= {88806796,90462225,91039722,91200504,90389608,88429143,89452623,91487721,89323610,90439077,89355691,88943822}; string symbols[]= {"USDCAD","EURCHF","GBPCHF","EURUSD","EURUSD","EURCHF","AUDUSD","EURUSD","EURUSD","GBPCHF","EURCHF","AUDUSD"}; datetime times[]= {D'2020.12.07 09:31:40',D'2020.12.10 09:55:30',D'2020.12.07 03:16:05',D'2020.12.07 03:45:39',D'2020.12.09 14:34:42',                   D'2020.12.08 14:00:13',D'2020.12.07 12:34:42',D'2020.12.08 17:37:28',D'2020.12.10 02:34:55',D'2020.12.09 12:00:09',                   D'2020.12.10 17:56:09',D'2020.12.07 08:30:14'}; double  prices[]= {1.24428,1.35444,1.37244,1.28973,1.39795,1.39960,1.15292,1.19290,1.11015,1.17936,1.37226,1.34722}; //+------------------------------------------------------------------+ //| Script program start function                                    | //+------------------------------------------------------------------+ void OnStart()   {   Print("-------before sort-------");   for(int i=0; i<ArraySize(tickets); i++)       PrintFormat("%8i | %8s | %8s | %8.5f",tickets[i],symbols[i],(string)times[i],prices[i]); //--- sort position tickets by symbol, open time and open price.   MultiSort<long, string, datetime, double> multi_sorter;   multi_sorter.SortBy(tickets,                       symbols,                       times,                       prices,                       mode_asc_symbols,                       mode_asc_times,                       mode_asc_prices);   Print("-------MultiSort.SortBy(tickets,symbols,times,prices)-------");   for(int i=0; i<ArraySize(tickets); i++)       PrintFormat("%8i | %8s | %8s | %8.5f",tickets[i],symbols[i],(string)times[i],prices[i]);   } //+------------------------------------------------------------------+ /* Sample output   -------before sort-------   88806796 |  USDCAD | 2020.12.07 09:31:40 |  1.24428   90462225 |  EURCHF | 2020.12.10 09:55:30 |  1.35444   91039722 |  GBPCHF | 2020.12.07 03:16:05 |  1.37244   91200504 |  EURUSD | 2020.12.07 03:45:39 |  1.28973   90389608 |  EURUSD | 2020.12.09 14:34:42 |  1.39795   88429143 |  EURCHF | 2020.12.08 14:00:13 |  1.39960   89452623 |  AUDUSD | 2020.12.07 12:34:42 |  1.15292   91487721 |  EURUSD | 2020.12.08 17:37:28 |  1.19290   89323610 |  EURUSD | 2020.12.10 02:34:55 |  1.11015   90439077 |  GBPCHF | 2020.12.09 12:00:09 |  1.17936   89355691 |  EURCHF | 2020.12.10 17:56:09 |  1.37226   88943822 |  AUDUSD | 2020.12.07 08:30:14 |  1.34722   -------MultiSort.SortBy(tickets,symbols,times,prices)-------   88943822 |  AUDUSD | 2020.12.07 08:30:14 |  1.34722   89452623 |  AUDUSD | 2020.12.07 12:34:42 |  1.15292   88429143 |  EURCHF | 2020.12.08 14:00:13 |  1.39960   90462225 |  EURCHF | 2020.12.10 09:55:30 |  1.35444   89355691 |  EURCHF | 2020.12.10 17:56:09 |  1.37226   91200504 |  EURUSD | 2020.12.07 03:45:39 |  1.28973   91487721 |  EURUSD | 2020.12.08 17:37:28 |  1.19290   90389608 |  EURUSD | 2020.12.09 14:34:42 |  1.39795   89323610 |  EURUSD | 2020.12.10 02:34:55 |  1.11015   91039722 |  GBPCHF | 2020.12.07 03:16:05 |  1.37244   90439077 |  GBPCHF | 2020.12.09 12:00:09 |  1.17936   88806796 |  USDCAD | 2020.12.07 09:31:40 |  1.24428 */