forked from rosh/MQL5Book
160 lines
4.9 KiB
MQL5
160 lines
4.9 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| Tuples.mqh |
| |
//| Copyright 2022, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//| A set of templated structures to hold various data fields |
| |
//| while using MonitorInterface (Orders, Deals, Positions) and |
| |
//| TradeFilter<MonitorInterface<>,ENUM_INT,ENUM_DOUBLE,ENUM_STRING> |
| |
//| T1,T2,T3+: long, double, string in any combination |
| |
//| M is expected to be a MonitorInterface<> |
| |
//+------------------------------------------------------------------+
| |
| |
/*
| |
// EXAMPLE: request profit, symbol, ticket for positions
| |
// by specific magic-number, sorted by profit
| |
| |
#include "Tuples.mqh"
| |
#include "PositionFilter.mqh"
| |
#property script_show_inputs
| |
| |
input ulong Magic;
| |
| |
void OnStart()
| |
{
| |
int props[] = {POSITION_PROFIT, POSITION_SYMBOL, POSITION_TICKET};
| |
Tuple3<double,string,ulong> tuples[];
| |
PositionFilter filter;
| |
filter.let(POSITION_MAGIC, Magic).select(props, tuples, true);
| |
ArrayPrint(tuples);
| |
}
| |
| |
*/
| |
| |
//+------------------------------------------------------------------+
| |
//| 2-Tuple with fields of arbitrary types |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2>
| |
struct Tuple2
| |
{
| |
T1 _1;
| |
T2 _2;
| |
| |
static int size() { return 2; };
| |
| |
template<typename M>
| |
void assign(const int &properties[], M &m)
| |
{
| |
if(ArraySize(properties) != size()) return;
| |
_1 = m.get(properties[0], _1);
| |
_2 = m.get(properties[1], _2);
| |
}
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| 3-Tuple with fields of arbitrary types |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2,typename T3>
| |
struct Tuple3
| |
{
| |
T1 _1;
| |
T2 _2;
| |
T3 _3;
| |
| |
static int size() { return 3; };
| |
| |
template<typename M>
| |
void assign(const int &properties[], M &m)
| |
{
| |
if(ArraySize(properties) != size()) return;
| |
_1 = m.get(properties[0], _1);
| |
_2 = m.get(properties[1], _2);
| |
_3 = m.get(properties[2], _3);
| |
}
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| 4-Tuple with fields of arbitrary types |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2,typename T3,typename T4>
| |
struct Tuple4
| |
{
| |
T1 _1;
| |
T2 _2;
| |
T3 _3;
| |
T4 _4;
| |
| |
static int size() { return 4; };
| |
| |
template<typename M>
| |
void assign(const int &properties[], M &m)
| |
{
| |
if(ArraySize(properties) != size()) return;
| |
_1 = m.get(properties[0], _1);
| |
_2 = m.get(properties[1], _2);
| |
_3 = m.get(properties[2], _3);
| |
_4 = m.get(properties[3], _4);
| |
}
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| 5-Tuple with fields of arbitrary types |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2,typename T3,typename T4,typename T5>
| |
struct Tuple5
| |
{
| |
T1 _1;
| |
T2 _2;
| |
T3 _3;
| |
T4 _4;
| |
T5 _5;
| |
| |
static int size() { return 5; };
| |
| |
template<typename M>
| |
void assign(const int &properties[], M &m)
| |
{
| |
if(ArraySize(properties) != size()) return;
| |
_1 = m.get(properties[0], _1);
| |
_2 = m.get(properties[1], _2);
| |
_3 = m.get(properties[2], _3);
| |
_4 = m.get(properties[3], _4);
| |
_5 = m.get(properties[4], _5);
| |
}
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| N-Tuples: up to 8 fields supported |
| |
//+------------------------------------------------------------------+
| |
| |
//+------------------------------------------------------------------+
| |
//| 8-Tuple with fields of arbitrary types |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8>
| |
struct Tuple8
| |
{
| |
T1 _1;
| |
T2 _2;
| |
T3 _3;
| |
T4 _4;
| |
T5 _5;
| |
T6 _6;
| |
T7 _7;
| |
T8 _8;
| |
| |
static int size() { return 8; };
| |
| |
template<typename M>
| |
void assign(const int &properties[], M &m)
| |
{
| |
if(ArraySize(properties) != size()) return;
| |
_1 = m.get(properties[0], _1);
| |
_2 = m.get(properties[1], _2);
| |
_3 = m.get(properties[2], _3);
| |
_4 = m.get(properties[3], _4);
| |
_5 = m.get(properties[4], _5);
| |
_6 = m.get(properties[5], _6);
| |
_7 = m.get(properties[6], _7);
| |
_8 = m.get(properties[7], _8);
| |
}
| |
};
| |
//+------------------------------------------------------------------+
|