//+------------------------------------------------------------------+ //| Account.mqh | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #include "PositionsControl.mqh" //+------------------------------------------------------------------+ //| Класс аккаунта | //+------------------------------------------------------------------+ class CAccount : public CObject { private: protected: CPositionsControl m_positions; // Объект контроля исторических позиций //--- целочисленные свойства аккаунта long m_login; // Номер счета ENUM_ACCOUNT_TRADE_MODE m_trade_mode; // Тип торгового счета long m_leverage; // Размер предоставленного плеча int m_limit_orders; // Максимально допустимое количество действующих отложенных ордеров ENUM_ACCOUNT_STOPOUT_MODE m_margin_so_mode; // Режим задания минимально допустимого уровня залоговых средств bool m_trade_allowed; // Разрешенность торговли для текущего счета bool m_trade_expert; // Разрешенность торговли для эксперта ENUM_ACCOUNT_MARGIN_MODE m_margin_mode; // Режим расчета маржи int m_currency_digits; // Количество знаков после запятой для валюты счета, необходимых для точного отображения торговых результатов bool m_fifo_close; // Признак того, что позиции можно закрывать только по правилу FIFO bool m_hedge_allowed; // Признак того, что разрешены встречные позиции по одному символу //--- вещественные свойства аккаунта double m_balance; // Баланс счета в валюте депозита double m_credit; // Размер предоставленного кредита в валюте депозита double m_profit; // Размер текущей прибыли на счете в валюте депозита double m_equity; // Значение собственных средств на счете в валюте депозита double m_margin; // Размер зарезервированных залоговых средств на счете в валюте депозита double m_margin_free; // Размер свободных средств на счете в валюте депозита, доступных для открытия позиции double m_margin_level; // Уровень залоговых средств на счете в процентах double m_margin_so_call; // Уровень залоговых средств, при котором требуется пополнение счета (Margin Call) double m_margin_so_so; // Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out) double m_margin_initial; // Размер средств, зарезервированных на счёте, для обеспечения гарантийной суммы по всем отложенным ордерам double m_margin_maintenance; // Размер средств, зарезервированных на счёте, для обеспечения минимальной суммы по всем открытым позициям double m_assets; // Текущий размер активов на счёте double m_liabilities; // Текущий размер обязательств на счёте double m_commission_blocked; // Текущая сумма заблокированных комиссий по счёту //--- строковые свойства аккаунта string m_name; // Имя клиента string m_server; // Имя торгового сервера string m_currency; // Валюта депозита string m_company; // Имя компании, обслуживающей счет public: //--- Возвращает (1) объект контроля, (2) список исторических позиций, (3) количество позиций CPositionsControl*GetPositionsCtrlObj(void) { return &this.m_positions; } CArrayObj *GetPositionsList(void) { return this.m_positions.GetPositionsList();} int PositionsTotal(void) { return this.m_positions.PositionsTotal(); } //--- Возвращает список позиций по фильтру (1) целочисленного, (2) вещественного, (3) строкового свойства CArrayObj *GetPositionsList(ENUM_POSITION_PROPERTY_INT property, long value, ENUM_COMPARER_TYPE mode) { return CSelect::ByPositionProperty(this.GetPositionsList(), property, value, mode); } CArrayObj *GetPositionsList(ENUM_POSITION_PROPERTY_DBL property, double value, ENUM_COMPARER_TYPE mode) { return CSelect::ByPositionProperty(this.GetPositionsList(), property, value, mode); } CArrayObj *GetPositionsList(ENUM_POSITION_PROPERTY_STR property, string value, ENUM_COMPARER_TYPE mode) { return CSelect::ByPositionProperty(this.GetPositionsList(), property, value, mode); } //--- (1) Обновляет, (2) распечатывает в журнал список закрытых позиций bool PositionsRefresh(void) { return this.m_positions.Refresh();} void PositionsPrint(void) { this.m_positions.Print(); } //--- устанавливает (1) логин, (2) сервер void SetLogin(const long login) { this.m_login=login; } void SetServer(const string server) { this.m_server=server; } //--- возврат целочисленных свойств аккаунта long Login(void) const { return this.m_login; } // Номер счета ENUM_ACCOUNT_TRADE_MODE TradeMode(void) const { return this.m_trade_mode; } // Тип торгового счета long Leverage(void) const { return this.m_leverage; } // Размер предоставленного плеча int LimitOrders(void) const { return this.m_limit_orders; } // Максимально допустимое количество действующих отложенных ордеров ENUM_ACCOUNT_STOPOUT_MODE MarginSoMode(void) const { return this.m_margin_so_mode; } // Режим задания минимально допустимого уровня залоговых средств bool TradeAllowed(void) const { return this.m_trade_allowed; } // Разрешенность торговли для текущего счета bool TradeExpert(void) const { return this.m_trade_expert; } // Разрешенность торговли для эксперта ENUM_ACCOUNT_MARGIN_MODE MarginMode(void) const { return this.m_margin_mode; } // Режим расчета маржи int CurrencyDigits(void) const { return this.m_currency_digits; } // Количество знаков после запятой для валюты счета, необходимых для точного отображения торговых результатов bool FIFOClose(void) const { return this.m_fifo_close; } // Признак того, что позиции можно закрывать только по правилу FIFO bool HedgeAllowed(void) const { return this.m_hedge_allowed; } // Признак того, что разрешены встречные позиции по одному символу //--- возврат вещественных свойств аккаунта double Balance(void) const { return this.m_balance; } // Баланс счета в валюте депозита double Credit(void) const { return this.m_credit; } // Размер предоставленного кредита в валюте депозита double Profit(void) const { return this.m_profit; } // Размер текущей прибыли на счете в валюте депозита double Equity(void) const { return this.m_equity; } // Значение собственных средств на счете в валюте депозита double Margin(void) const { return this.m_margin; } // Размер зарезервированных залоговых средств на счете в валюте депозита double MarginFree(void) const { return this.m_margin_free; } // Размер свободных средств на счете в валюте депозита, доступных для открытия позиции double MarginLevel(void) const { return this.m_margin_level; } // Уровень залоговых средств на счете в процентах double MarginSoCall(void) const { return this.m_margin_so_call; } // Уровень залоговых средств, при котором требуется пополнение счета (Margin Call) double MarginSoSo(void) const { return this.m_margin_so_so; } // Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out) double MarginInitial(void) const { return this.m_margin_initial; } // Размер средств, зарезервированных на счёте, для обеспечения гарантийной суммы по всем отложенным ордерам double MarginMaintenance(void) const { return this.m_margin_maintenance; } // Размер средств, зарезервированных на счёте, для обеспечения минимальной суммы по всем открытым позициям double Assets(void) const { return this.m_assets; } // Текущий размер активов на счёте double Liabilities(void) const { return this.m_liabilities; } // Текущий размер обязательств на счёте double CommissionBlocked(void) const { return this.m_commission_blocked; } // Текущая сумма заблокированных комиссий по счёту //--- возврат строковых свойств аккаунта string Name(void) const { return this.m_name; } // Имя клиента string Server(void) const { return this.m_server; } // Имя торгового сервера string Currency(void) const { return this.m_currency; } // Валюта депозита string Company(void) const { return this.m_company; } // Имя компании, обслуживающей счет //--- возвращает описание (1) аккаунта, (2) типа торгового счёта, (3) режима расчёта маржи string Description(void) const; string TradeModeDescription(void) const; string MarginModeDescription(void)const; //--- виртуальный метод сравнения двух объектов virtual int Compare(const CObject *node,const int mode=0) const; //--- Выводит в журнал описание аккаунта void Print(void) { ::Print(this.Description()); } //--- конструкторы/деструктор CAccount(void){} CAccount(const long login, const string server_name); ~CAccount() {} }; //+------------------------------------------------------------------+ //| Конструктор | //+------------------------------------------------------------------+ CAccount::CAccount(const long login, const string server_name) { this.m_login=login; this.m_server=server_name; //--- устанавливаем целочисленные свойства аккаунта this.m_trade_mode = (ENUM_ACCOUNT_TRADE_MODE)::AccountInfoInteger(ACCOUNT_TRADE_MODE); // Тип торгового счета this.m_leverage = ::AccountInfoInteger(ACCOUNT_LEVERAGE); // Размер предоставленного плеча this.m_limit_orders = (int)::AccountInfoInteger(ACCOUNT_LIMIT_ORDERS); // Максимально допустимое количество действующих отложенных ордеров this.m_margin_so_mode = (ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);// Режим задания минимально допустимого уровня залоговых средств this.m_trade_allowed = ::AccountInfoInteger(ACCOUNT_TRADE_ALLOWED); // Разрешенность торговли для текущего счета this.m_trade_expert = ::AccountInfoInteger(ACCOUNT_TRADE_EXPERT); // Разрешенность торговли для эксперта this.m_margin_mode = (ENUM_ACCOUNT_MARGIN_MODE)::AccountInfoInteger(ACCOUNT_MARGIN_MODE); // Режим расчета маржи this.m_currency_digits = (int)::AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS); // Количество знаков после запятой для валюты счета, необходимых для точного отображения торговых результатов this.m_fifo_close = ::AccountInfoInteger(ACCOUNT_FIFO_CLOSE); // Признак того, что позиции можно закрывать только по правилу FIFO this.m_hedge_allowed = ::AccountInfoInteger(ACCOUNT_HEDGE_ALLOWED); // Признак того, что разрешены встречные позиции по одному символу //--- устанавливаем вещественные свойства аккаунта this.m_balance = ::AccountInfoDouble(ACCOUNT_BALANCE); // Баланс счета в валюте депозита this.m_credit = ::AccountInfoDouble(ACCOUNT_CREDIT); // Размер предоставленного кредита в валюте депозита this.m_profit = ::AccountInfoDouble(ACCOUNT_PROFIT); // Размер текущей прибыли на счете в валюте депозита this.m_equity = ::AccountInfoDouble(ACCOUNT_EQUITY); // Значение собственных средств на счете в валюте депозита this.m_margin = ::AccountInfoDouble(ACCOUNT_MARGIN); // Размер зарезервированных залоговых средств на счете в валюте депозита this.m_margin_free = ::AccountInfoDouble(ACCOUNT_MARGIN_FREE); // Размер свободных средств на счете в валюте депозита, доступных для открытия позиции this.m_margin_level = ::AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Уровень залоговых средств на счете в процентах this.m_margin_so_call = ::AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL); // Уровень залоговых средств, при котором требуется пополнение счета (Margin Call) this.m_margin_so_so = ::AccountInfoDouble(ACCOUNT_MARGIN_SO_SO); // Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out) this.m_margin_initial = ::AccountInfoDouble(ACCOUNT_MARGIN_INITIAL); // Размер средств, зарезервированных на счёте, для обеспечения гарантийной суммы по всем отложенным ордерам this.m_margin_maintenance = ::AccountInfoDouble(ACCOUNT_MARGIN_MAINTENANCE); // Размер средств, зарезервированных на счёте, для обеспечения минимальной суммы по всем открытым позициям this.m_assets = ::AccountInfoDouble(ACCOUNT_ASSETS); // Текущий размер активов на счёте this.m_liabilities = ::AccountInfoDouble(ACCOUNT_LIABILITIES); // Текущий размер обязательств на счёте this.m_commission_blocked = ::AccountInfoDouble(ACCOUNT_COMMISSION_BLOCKED); // Текущая сумма заблокированных комиссий по счёту //--- устанавливаем строковые свойства аккаунта this.m_name = ::AccountInfoString(ACCOUNT_NAME); // Имя клиента this.m_currency = ::AccountInfoString(ACCOUNT_CURRENCY); // Валюта депозита this.m_company = ::AccountInfoString(ACCOUNT_COMPANY); // Имя компании, обслуживающей счет } //+------------------------------------------------------------------+ //| Метод сравнения двух объектов | //+------------------------------------------------------------------+ int CAccount::Compare(const CObject *node,const int mode=0) const { const CAccount *obj=node; return(this.Login()>obj.Login() ? 1 : this.Login()obj.Server() ? 1 : this.Server()