211 lines
35 KiB
MQL5
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()));
|
|
}
|
|
//+------------------------------------------------------------------+
|