Article-15346-MQL5-Trade-Mo.../Account.mqh
2026-03-23 13:19:06 +07:00

211 lines
35 KiB
MQL5

//+------------------------------------------------------------------+
//| 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.Login() ? -1 :
this.Server()>obj.Server() ? 1 : this.Server()<obj.Server() ? -1 : 0);
}
//+------------------------------------------------------------------+
//| Возвращает описание типа торгового счёта |
//+------------------------------------------------------------------+
string CAccount::TradeModeDescription(void) const
{
string mode=::StringSubstr(::EnumToString(this.TradeMode()), 19);
if(mode.Lower())
mode.SetChar(0, ushort(mode.GetChar(0)-32));
return mode;
}
//+------------------------------------------------------------------+
//| Возвращает описание режима расчёта маржи |
//+------------------------------------------------------------------+
string CAccount::MarginModeDescription(void) const
{
string mode=::StringSubstr(::EnumToString(this.MarginMode()), 20);
::StringReplace(mode, "RETAIL_", "");
if(mode.Lower())
mode.SetChar(0, ushort(mode.GetChar(0)-32));
return mode;
}
//+------------------------------------------------------------------+
//| Возвращает описание аккаунта |
//+------------------------------------------------------------------+
string CAccount::Description(void) const
{
return(::StringFormat("%I64d: %s (%s, %s, %.2f %s, %s)",
this.Login(), this.Name(), this.Company(), this.TradeModeDescription(),
this.Balance(), this.Currency(), this.MarginModeDescription()));
}
//+------------------------------------------------------------------+