MQL5Book/Include/SymbolMonitor.mqh

219 lines
7 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:09:41 +02:00
//+------------------------------------------------------------------+
//| SymbolMonitor.mqh |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "EnumToArray.mqh"
//+------------------------------------------------------------------+
//| SYMBOL_EXPIRATION options (bits) |
//+------------------------------------------------------------------+
enum SYMBOL_EXPIRATION
{
_SYMBOL_EXPIRATION_GTC = 1,
_SYMBOL_EXPIRATION_DAY = 2,
_SYMBOL_EXPIRATION_SPECIFIED = 4,
_SYMBOL_EXPIRATION_SPECIFIED_DAY = 8,
};
//+------------------------------------------------------------------+
//| SYMBOL_FILLING options (bits) |
//+------------------------------------------------------------------+
enum SYMBOL_FILLING
{
_SYMBOL_FILLING_RETURN = 0,
_SYMBOL_FILLING_FOK = 1,
_SYMBOL_FILLING_IOC = 2,
};
//+------------------------------------------------------------------+
//| Allowed order types (bits) |
//+------------------------------------------------------------------+
enum SYMBOL_ORDER
{
_SYMBOL_ORDER_MARKET = 1,
_SYMBOL_ORDER_LIMIT = 2,
_SYMBOL_ORDER_STOP = 4,
_SYMBOL_ORDER_STOP_LIMIT = 8,
_SYMBOL_ORDER_SL = 16,
_SYMBOL_ORDER_TP = 32,
_SYMBOL_ORDER_CLOSEBY = 64,
};
//+------------------------------------------------------------------+
//| Main class for reading symbol properties |
//+------------------------------------------------------------------+
class SymbolMonitor
{
public:
const string name;
SymbolMonitor(): name(_Symbol) { }
SymbolMonitor(const string s): name(s) { }
long get(const ENUM_SYMBOL_INFO_INTEGER property) const
{
return SymbolInfoInteger(name, property);
}
double get(const ENUM_SYMBOL_INFO_DOUBLE property) const
{
return SymbolInfoDouble(name, property);
}
string get(const ENUM_SYMBOL_INFO_STRING property) const
{
return SymbolInfoString(name, property);
}
long get(const int property, const long) const
{
return SymbolInfoInteger(name, (ENUM_SYMBOL_INFO_INTEGER)property);
}
double get(const int property, const double) const
{
return SymbolInfoDouble(name, (ENUM_SYMBOL_INFO_DOUBLE)property);
}
string get(const int property, const string) const
{
return SymbolInfoString(name, (ENUM_SYMBOL_INFO_STRING)property);
}
static string boolean(const long v)
{
return v ? "true" : "false";
}
template<typename E>
static string enumstr(const long v)
{
return EnumToString((E)v);
}
template<typename E>
static string maskstr(const long v)
{
string text = "";
if(v == 0)
{
ResetLastError();
const string s = EnumToString((E)v);
if(_LastError == 0) return "[(" + s + ")]";
}
for(int i = 0; ; ++i)
{
ResetLastError();
const string s = EnumToString((E)(1 << i));
if(_LastError != 0)
{
break;
}
if((v & (1 << i)) != 0)
{
text += s + " ";
}
}
// square brackets used to distinguish single enum description
// from bitmask
return "[ " + text + "]";
}
// explain properties according to subtypes
static string stringify(const long v, const ENUM_SYMBOL_INFO_INTEGER property)
{
switch(property)
{
case SYMBOL_SELECT:
case SYMBOL_SPREAD_FLOAT:
case SYMBOL_VISIBLE:
case SYMBOL_CUSTOM:
case SYMBOL_MARGIN_HEDGED_USE_LEG:
case SYMBOL_EXIST:
return boolean(v);
case SYMBOL_TIME:
return TimeToString(v, TIME_DATE|TIME_SECONDS);
case SYMBOL_TRADE_CALC_MODE:
return enumstr<ENUM_SYMBOL_CALC_MODE>(v);
case SYMBOL_TRADE_MODE:
return enumstr<ENUM_SYMBOL_TRADE_MODE>(v);
case SYMBOL_TRADE_EXEMODE:
return enumstr<ENUM_SYMBOL_TRADE_EXECUTION>(v);
case SYMBOL_SWAP_MODE:
return enumstr<ENUM_SYMBOL_SWAP_MODE>(v);
case SYMBOL_SWAP_ROLLOVER3DAYS:
return enumstr<ENUM_DAY_OF_WEEK>(v);
case SYMBOL_EXPIRATION_MODE:
return maskstr<SYMBOL_EXPIRATION>(v);
case SYMBOL_FILLING_MODE:
return maskstr<SYMBOL_FILLING>(v);
case SYMBOL_START_TIME:
case SYMBOL_EXPIRATION_TIME:
return TimeToString(v);
case SYMBOL_ORDER_MODE:
return maskstr<SYMBOL_ORDER>(v);
case SYMBOL_OPTION_RIGHT:
return enumstr<ENUM_SYMBOL_OPTION_RIGHT>(v);
case SYMBOL_OPTION_MODE:
return enumstr<ENUM_SYMBOL_OPTION_MODE>(v);
case SYMBOL_CHART_MODE:
return enumstr<ENUM_SYMBOL_CHART_MODE>(v);
case SYMBOL_ORDER_GTC_MODE:
return enumstr<ENUM_SYMBOL_ORDER_GTC_MODE>(v);
case SYMBOL_SECTOR:
return enumstr<ENUM_SYMBOL_SECTOR>(v);
case SYMBOL_INDUSTRY:
return enumstr<ENUM_SYMBOL_INDUSTRY>(v);
case SYMBOL_BACKGROUND_COLOR: // Byte order: Transparency Blue Green Red
return StringFormat("TBGR(0x%08X)", v);
}
return (string)v;
}
string stringify(const ENUM_SYMBOL_INFO_INTEGER property) const
{
return stringify(SymbolInfoInteger(name, property), property);
}
string stringify(const ENUM_SYMBOL_INFO_DOUBLE property, const string format = NULL) const
{
if(format == NULL) return (string)SymbolInfoDouble(name, property);
return StringFormat(format, SymbolInfoDouble(name, property));
}
string stringify(const ENUM_SYMBOL_INFO_STRING property) const
{
return SymbolInfoString(name, property);
}
// all properties of type enum E
template<typename E>
void list2log() const
{
E e = (E)0; // disable warning 'possible use of uninitialized variable'
int array[];
const int n = EnumToArray(e, array, 0, USHORT_MAX);
Print(typename(E), " Count=", n);
for(int i = 0; i < n; ++i)
{
e = (E)array[i];
PrintFormat("% 3d %s=%s", i, EnumToString(e), stringify(e));
}
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
/* example
void OnStart()
{
SymbolMonitor m;
m.list2log<ENUM_SYMBOL_INFO_INTEGER>();
m.list2log<ENUM_SYMBOL_INFO_DOUBLE>();
m.list2log<ENUM_SYMBOL_INFO_STRING>();
}
*/
//+------------------------------------------------------------------+