forked from rosh/MQL5Book
218 lines
7 KiB
MQL5
218 lines
7 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| 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>();
| |||
}
| |||
*/
| |||
//+------------------------------------------------------------------+
|