Обзор функций получения свойств счета
Полный набор свойств счета логически поделен на 3 группы в зависимости от их типа. Строковые свойства сведены в перечисление ENUM_ACCOUNT_INFO_STRING и запрашиваются функцией AccountInfoString. Свойства вещественного типа объединены в перечислении ENUM_ACCOUNT_INFO_DOUBLE, и для них работает функция AccountInfoDouble. Перечисление ENUM_ACCOUNT_INFO_INTEGER, используемое в функции AccountInfoInteger, содержит идентификаторы целочисленных и логических свойств (флагов), а также нескольких прикладных ENUM_ACCOUNT_INFO-перечислений.
double AccountInfoDouble(ENUM_ACCOUNT_INFO_DOUBLE property)
long AccountInfoInteger(ENUM_ACCOUNT_INFO_INTEGER property)
string AccountInfoString(ENUM_ACCOUNT_INFO_STRING property)
Для упрощения чтения свойств создан класс AccountMonitor (AccountMonitor.mqh). В нем за счет перегрузки методов get обеспечен автоматический вызов нужной функции API в зависимости от элемента конкретного перечисления, переданного в параметре.
class AccountMonitor
{
public:
long get(const ENUM_ACCOUNT_INFO_INTEGER property) const
{
return AccountInfoInteger(property);
}
double get(const ENUM_ACCOUNT_INFO_DOUBLE property) const
{
return AccountInfoDouble(property);
}
string get(const ENUM_ACCOUNT_INFO_STRING property) const
{
return AccountInfoString(property);
}
long get(const int property, const long) const
{
return AccountInfoInteger((ENUM_ACCOUNT_INFO_INTEGER)property);
}
double get(const int property, const double) const
{
return AccountInfoDouble((ENUM_ACCOUNT_INFO_DOUBLE)property);
}
string get(const int property, const string) const
{
return AccountInfoString((ENUM_ACCOUNT_INFO_STRING)property);
}
...
|
Кроме того реализовано несколько перегрузок метода stringify, формирующих понятное для пользователя строковое представление значений свойств (оно, в частности, пригодится для прикладных перечислений, которые в противном случае отображались бы в виде малоинформативных чисел). Особенности каждого свойства мы рассмотрим в следующих разделах.
static string boolean(const long v)
{
return v ? "true" : "false";
}
template<typename E>
static string enumstr(const long v)
{
return EnumToString((E)v);
}
// "расшифровываем" свойства согласно подтипу внутри целочисленных значений
static string stringify(const long v, const ENUM_ACCOUNT_INFO_INTEGER property)
{
switch(property)
{
case ACCOUNT_TRADE_ALLOWED:
case ACCOUNT_TRADE_EXPERT:
case ACCOUNT_FIFO_CLOSE:
return boolean(v);
case ACCOUNT_TRADE_MODE:
return enumstr<ENUM_ACCOUNT_TRADE_MODE>(v);
case ACCOUNT_MARGIN_MODE:
return enumstr<ENUM_ACCOUNT_MARGIN_MODE>(v);
case ACCOUNT_MARGIN_SO_MODE:
return enumstr<ENUM_ACCOUNT_STOPOUT_MODE>(v);
}
return (string)v;
}
string stringify(const ENUM_ACCOUNT_INFO_INTEGER property) const
{
return stringify(AccountInfoInteger(property), property);
}
string stringify(const ENUM_ACCOUNT_INFO_DOUBLE property, const string format = NULL) const
{
if(format == NULL) return DoubleToString(AccountInfoDouble(property),
(int)get(ACCOUNT_CURRENCY_DIGITS));
return StringFormat(format, AccountInfoDouble(property));
}
string stringify(const ENUM_ACCOUNT_INFO_STRING property) const
{
return AccountInfoString(property);
}
...
|
Наконец, для получения исчерпывающей информации о счете предназначен шаблонный метод list2log.
// список имен и значений всех свойств типа перечисления E
template<typename E>
void list2log()
{
E e = (E)0; // подавляем предупреждение '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));
}
}
};
|
Мы проверим новый класс в действии в следующем разделе.