Обзор функций получения свойств счета

Полный набор свойств счета логически поделен на 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 propertyconst
   {
      return AccountInfoInteger(property);
   }
   
   double get(const ENUM_ACCOUNT_INFO_DOUBLE propertyconst
   {
      return AccountInfoDouble(property);
   }
   
   string get(const ENUM_ACCOUNT_INFO_STRING propertyconst
   {
      return AccountInfoString(property);
   }
   
   long get(const int propertyconst longconst
   {
      return AccountInfoInteger((ENUM_ACCOUNT_INFO_INTEGER)property);
   }
   
   double get(const int propertyconst doubleconst
   {
      return AccountInfoDouble((ENUM_ACCOUNT_INFO_DOUBLE)property);
   }
   
   string get(const int propertyconst stringconst
   {
      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 vconst 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 propertyconst
   {
      return stringify(AccountInfoInteger(property), property);
   }
   
   string stringify(const ENUM_ACCOUNT_INFO_DOUBLE propertyconst string format = NULLconst
   {
      if(format == NULLreturn DoubleToString(AccountInfoDouble(property),
         (int)get(ACCOUNT_CURRENCY_DIGITS));
      return StringFormat(formatAccountInfoDouble(property));
   }
   
   string stringify(const ENUM_ACCOUNT_INFO_STRING propertyconst
   {
      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(earray0USHORT_MAX);
      Print(typename(E), " Count="n);
      for(int i = 0i < n; ++i)
      {
         e = (E)array[i];
         PrintFormat("% 3d %s=%s"iEnumToString(e), stringify(e));
      }
   }
};

Мы проверим новый класс в действии в следующем разделе.