Expert Advisors • Indicators • Scripts • Libraries

MQL.RobotFX.org is the biggest collection of MetaTrader expert advisors (MT5 & MT4), indicators, scripts and libraries that can be used to improve trading results, minimize risks or simply automate trading tasks

MetaTrader 5 Libraries | MultiSort - sorting algorithm

MetaTrader Experts, Indicators, Scripts and Libraries

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  */  
32665