UTE/Strategy/PositionMT5.mqh
super.admin bd7e405a90 convert
2025-05-30 16:34:43 +02:00

223 lines
No EOL
19 KiB
MQL5

//+------------------------------------------------------------------+
//| PositionMT5.mqh |
//| Copyright 2016, Vasiliy Sokolov, St-Petersburg, Russia |
//| https://www.mql5.com/ru/users/c-4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "https://www.mql5.com/ru/users/c-4"
#include <Object.mqh>
#include "Logs.mqh"
#include "Trailings\Trailing.mqh"
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Класс активной позиции, для классических стратегий |
//+------------------------------------------------------------------+
class CPosition : public CObject
{
private:
ulong m_id; // Уникальный идентификатор позиции
uint m_magic; // Уникальный идентификатор эксперта, к которому принадлежит данная позиция.
ENUM_POSITION_TYPE m_direction; // Направление позиции
double m_entry_price; // Цена входа в позицию
string m_symbol; // Инструмент, по которому открыта позиция
datetime m_time_open; // Время открытия
string m_entry_comment; // Входящий комментарий
bool m_is_closed; // Истина, если позиция была закрыта
CLog* Log; // Логирование
CTrade m_trade; // Торговый модуль
public:
CPosition(void);
~CPosition(void);
uint ExpertMagic(void);
ulong ID(void);
ENUM_POSITION_TYPE Direction(void);
double EntryPrice(void);
double CurrentPrice(void);
string EntryComment(void);
double Profit(void);
double Volume(void);
string Symbol(void);
datetime TimeOpen(void);
bool CloseAtMarket(string comment="");
double StopLossValue(void);
bool StopLossValue(double sl);
double TakeProfitValue(void);
bool TakeProfitValue(double tp);
bool IsActive(void);
CTrailing* Trailing;
CObject* ExpertData;
};
//+------------------------------------------------------------------+
//| Инициализация основных свойств позиции |
//+------------------------------------------------------------------+
void CPosition::CPosition(void) : m_id(0),
m_entry_price(0.0),
m_symbol(""),
m_time_open(0)
{
m_id=PositionGetInteger(POSITION_IDENTIFIER);
m_magic=(uint)PositionGetInteger(POSITION_MAGIC);
m_direction=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
m_entry_price=PositionGetDouble(POSITION_PRICE_OPEN);
m_symbol=PositionGetString(POSITION_SYMBOL);
m_time_open=(datetime)PositionGetInteger(POSITION_TIME);
m_entry_comment=PositionGetString(POSITION_COMMENT);
m_trade.SetExpertMagicNumber(m_magic);
}
//+------------------------------------------------------------------+
//| Возвращает направление позиции. |
//+------------------------------------------------------------------+
CPosition::~CPosition(void)
{
if(CheckPointer(Trailing) == POINTER_DYNAMIC)
delete Trailing;
}
//+------------------------------------------------------------------+
//| Возвращает направление позиции. |
//+------------------------------------------------------------------+
ENUM_POSITION_TYPE CPosition::Direction(void)
{
return m_direction;
}
//+------------------------------------------------------------------+
//| Возвращает уникальный идентификатор эксперта, которому |
//| принадлежит текущая позиция. |
//+------------------------------------------------------------------+
uint CPosition::ExpertMagic(void)
{
return m_magic;
}
//+------------------------------------------------------------------+
//| Возвращает уникальный идентификатор позиции. |
//+------------------------------------------------------------------+
ulong CPosition::ID(void)
{
return m_id;
}
//+------------------------------------------------------------------+
//| Возвращает цену входа в позицию. |
//+------------------------------------------------------------------+
double CPosition::EntryPrice(void)
{
return m_entry_price;
}
//+------------------------------------------------------------------+
//| Возвращает текущую цену позиции. |
//+------------------------------------------------------------------+
double CPosition::CurrentPrice(void)
{
double price = 0.0;
int digits = (int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
if(Direction() == POSITION_TYPE_BUY)
price = SymbolInfoDouble(m_symbol, SYMBOL_BID);
else
price = SymbolInfoDouble(m_symbol, SYMBOL_ASK);
return NormalizeDouble(price, digits);
}
//+------------------------------------------------------------------+
//| Возвращает входящий комментарий активной позиции. |
//+------------------------------------------------------------------+
string CPosition::EntryComment(void)
{
return m_entry_comment;
}
//+------------------------------------------------------------------+
//| Возвращает название инструмента, по которому открыта текущая |
//| позиция. |
//+------------------------------------------------------------------+
string CPosition::Symbol(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| Возвращает время открытия позиции. |
//+------------------------------------------------------------------+
datetime CPosition::TimeOpen(void)
{
return m_time_open;
}
//+------------------------------------------------------------------+
//| Возвращает абсолютный уровень стоп-лосса для текущей позиции. |
//| Если уровень стоп-лосса не установлен, возвращает 0.0 |
//+------------------------------------------------------------------+
double CPosition::StopLossValue(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| Устанавливает абсолютный уровень стоп-лосса |
//+------------------------------------------------------------------+
bool CPosition::StopLossValue(double sl)
{
if(!IsActive())
return false;
return m_trade.PositionModify(m_id, sl, TakeProfitValue());
}
//+------------------------------------------------------------------+
//| Возвращает абсолютный уровень стоп-лосса для текущей позиции. |
//| Если уровень стоп-лосса не установлен, возвращает 0.0 |
//+------------------------------------------------------------------+
double CPosition::TakeProfitValue(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_TP);
}
//+------------------------------------------------------------------+
//| Устанавливает абсолютный уровень стоп-лосса |
//+------------------------------------------------------------------+
bool CPosition::TakeProfitValue(double tp)
{
if(!IsActive())
return false;
return m_trade.PositionModify(m_id, StopLossValue(), tp);
}
//+------------------------------------------------------------------+
//| Закрывает текущую позицию по рынку, устанавливая закрывающий |
//| комментарий равный comment |
//+------------------------------------------------------------------+
bool CPosition::CloseAtMarket(string comment="")
{
if(!IsActive())
return false;
ENUM_ACCOUNT_MARGIN_MODE mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
if(mode != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
return m_trade.PositionClose(m_symbol);
return m_trade.PositionClose(m_id);
}
//+------------------------------------------------------------------+
//| Возвращает текущий объем позиции. |
//+------------------------------------------------------------------+
double CPosition::Volume(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_VOLUME);
}
//+------------------------------------------------------------------+
//| Возвращает текущую прибыль позиции в валюте депозита. |
//+------------------------------------------------------------------+
double CPosition::Profit(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_PROFIT);
}
//+------------------------------------------------------------------+
//| Возвращает истину, если позиция активна. Возвращает ложь |
//| в противном случае. |
//+------------------------------------------------------------------+
bool CPosition::IsActive(void)
{
ENUM_ACCOUNT_MARGIN_MODE mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
if(mode!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
return PositionSelect(m_symbol);
else
return PositionSelectByTicket(m_id);
}
//+------------------------------------------------------------------+
//#include "Trailing.mqh"