UTE/Strategy/PositionMT5.mqh

223 lines
19 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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>
//+------------------------------------------------------------------+
//| ;0AA 0:B82=>9 ?>78F88, 4;O :;0AA8G5A:8E AB@0B5389 |
//+------------------------------------------------------------------+
class CPosition : public CObject
{
private:
ulong m_id; // #=8:0;L=K9 845=B8D8:0B>@ ?>78F88
uint m_magic; // #=8:0;L=K9 845=B8D8:0B>@ M:A?5@B0, : :>B>@><C ?@8=04;568B 40==0O ?>78F8O.
ENUM_POSITION_TYPE m_direction; // 0?@02;5=85 ?>78F88
double m_entry_price; // &5=0 2E>40 2 ?>78F8N
string m_symbol; // =AB@C<5=B, ?> :>B>@><C >B:@KB0 ?>78F8O
datetime m_time_open; // @5<O >B:@KB8O
string m_entry_comment; // E>4OI89 :><<5=B0@89
bool m_is_closed; // AB8=0, 5A;8 ?>78F8O 1K;0 70:@KB0
CLog* Log; // >38@>20=85
CTrade m_trade; // ">@3>2K9 <>4C;L
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;
};
//+------------------------------------------------------------------+
//| =8F80;870F8O >A=>2=KE A2>9AB2 ?>78F88 |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| >72@0I05B =0?@02;5=85 ?>78F88. |
//+------------------------------------------------------------------+
CPosition::~CPosition(void)
{
if(CheckPointer(Trailing) == POINTER_DYNAMIC)
delete Trailing;
}
//+------------------------------------------------------------------+
//| >72@0I05B =0?@02;5=85 ?>78F88. |
//+------------------------------------------------------------------+
ENUM_POSITION_TYPE CPosition::Direction(void)
{
return m_direction;
}
//+------------------------------------------------------------------+
//| >72@0I05B C=8:0;L=K9 845=B8D8:0B>@ M:A?5@B0, :>B>@><C |
//| ?@8=04;568B B5:CI0O ?>78F8O. |
//+------------------------------------------------------------------+
uint CPosition::ExpertMagic(void)
{
return m_magic;
}
//+------------------------------------------------------------------+
//| >72@0I05B C=8:0;L=K9 845=B8D8:0B>@ ?>78F88. |
//+------------------------------------------------------------------+
ulong CPosition::ID(void)
{
return m_id;
}
//+------------------------------------------------------------------+
//| >72@0I05B F5=C 2E>40 2 ?>78F8N. |
//+------------------------------------------------------------------+
double CPosition::EntryPrice(void)
{
return m_entry_price;
}
//+------------------------------------------------------------------+
//| >72@0I05B B5:CICN F5=C ?>78F88. |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| >72@0I05B 2E>4OI89 :><<5=B0@89 0:B82=>9 ?>78F88. |
//+------------------------------------------------------------------+
string CPosition::EntryComment(void)
{
return m_entry_comment;
}
//+------------------------------------------------------------------+
//| >72@0I05B =0720=85 8=AB@C<5=B0, ?> :>B>@><C >B:@KB0 B5:CI0O |
//| ?>78F8O. |
//+------------------------------------------------------------------+
string CPosition::Symbol(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| >72@0I05B 2@5<O >B:@KB8O ?>78F88. |
//+------------------------------------------------------------------+
datetime CPosition::TimeOpen(void)
{
return m_time_open;
}
//+------------------------------------------------------------------+
//| >72@0I05B 01A>;NB=K9 C@>25=L AB>?-;>AA0 4;O B5:CI59 ?>78F88. |
//| A;8 C@>25=L AB>?-;>AA0 =5 CAB0=>2;5=, 2>72@0I05B 0.0 |
//+------------------------------------------------------------------+
double CPosition::StopLossValue(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B 01A>;NB=K9 C@>25=L AB>?-;>AA0 |
//+------------------------------------------------------------------+
bool CPosition::StopLossValue(double sl)
{
if(!IsActive())
return false;
return m_trade.PositionModify(m_id, sl, TakeProfitValue());
}
//+------------------------------------------------------------------+
//| >72@0I05B 01A>;NB=K9 C@>25=L AB>?-;>AA0 4;O B5:CI59 ?>78F88. |
//| A;8 C@>25=L AB>?-;>AA0 =5 CAB0=>2;5=, 2>72@0I05B 0.0 |
//+------------------------------------------------------------------+
double CPosition::TakeProfitValue(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_TP);
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B 01A>;NB=K9 C@>25=L AB>?-;>AA0 |
//+------------------------------------------------------------------+
bool CPosition::TakeProfitValue(double tp)
{
if(!IsActive())
return false;
return m_trade.PositionModify(m_id, StopLossValue(), tp);
}
//+------------------------------------------------------------------+
//| 0:@K205B B5:CICN ?>78F8N ?> @K=:C, CAB0=02;820O 70:@K20NI89 |
//| :><<5=B0@89 @02=K9 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);
}
//+------------------------------------------------------------------+
//| >72@0I05B B5:CI89 >1J5< ?>78F88. |
//+------------------------------------------------------------------+
double CPosition::Volume(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_VOLUME);
}
//+------------------------------------------------------------------+
//| >72@0I05B B5:CICN ?@81K;L ?>78F88 2 20;NB5 45?>78B0. |
//+------------------------------------------------------------------+
double CPosition::Profit(void)
{
if(!IsActive())
return 0.0;
return PositionGetDouble(POSITION_PROFIT);
}
//+------------------------------------------------------------------+
//| >72@0I05B 8AB8=C, 5A;8 ?>78F8O 0:B82=0. >72@0I05B ;>6L |
//| 2 ?@>B82=>< A;CG05. |
//+------------------------------------------------------------------+
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"