MultiSort – sorting algorithm – library MetaTrader 5

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
*/
📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks