366 lines
15 KiB
MQL5
366 lines
15 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| PositionInfo.mqh |
|
|
//| Copyright 2000-2025, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#include <Object.mqh>
|
|
//+------------------------------------------------------------------+
|
|
//| Class CPositionInfo. |
|
|
//| Appointment: Class for access to position info. |
|
|
//| Derives from class CObject. |
|
|
//+------------------------------------------------------------------+
|
|
class CPositionInfo : public CObject
|
|
{
|
|
protected:
|
|
ENUM_POSITION_TYPE m_type;
|
|
double m_volume;
|
|
double m_price;
|
|
double m_stop_loss;
|
|
double m_take_profit;
|
|
|
|
public:
|
|
CPositionInfo(void);
|
|
~CPositionInfo(void);
|
|
//--- fast access methods to the integer position propertyes
|
|
ulong Ticket(void) const;
|
|
datetime Time(void) const;
|
|
ulong TimeMsc(void) const;
|
|
datetime TimeUpdate(void) const;
|
|
ulong TimeUpdateMsc(void) const;
|
|
ENUM_POSITION_TYPE PositionType(void) const;
|
|
string TypeDescription(void) const;
|
|
long Magic(void) const;
|
|
long Identifier(void) const;
|
|
//--- fast access methods to the double position propertyes
|
|
double Volume(void) const;
|
|
double PriceOpen(void) const;
|
|
double StopLoss(void) const;
|
|
double TakeProfit(void) const;
|
|
double PriceCurrent(void) const;
|
|
double Commission(void) const;
|
|
double Swap(void) const;
|
|
double Profit(void) const;
|
|
//--- fast access methods to the string position propertyes
|
|
string Symbol(void) const;
|
|
string Comment(void) const;
|
|
//--- access methods to the API MQL5 functions
|
|
bool InfoInteger(const ENUM_POSITION_PROPERTY_INTEGER prop_id,long &var) const;
|
|
bool InfoDouble(const ENUM_POSITION_PROPERTY_DOUBLE prop_id,double &var) const;
|
|
bool InfoString(const ENUM_POSITION_PROPERTY_STRING prop_id,string &var) const;
|
|
//--- info methods
|
|
string FormatType(string &str,const uint type) const;
|
|
string FormatPosition(string &str) const;
|
|
//--- methods for select position
|
|
bool Select(const string symbol);
|
|
bool SelectByMagic(const string symbol,const ulong magic);
|
|
bool SelectByTicket(const ulong ticket);
|
|
bool SelectByIndex(const int index);
|
|
//---
|
|
void StoreState(void);
|
|
bool CheckState(void);
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Constructor |
|
|
//+------------------------------------------------------------------+
|
|
CPositionInfo::CPositionInfo(void) : m_type(WRONG_VALUE),
|
|
m_volume(0.0),
|
|
m_price(0.0),
|
|
m_stop_loss(0.0),
|
|
m_take_profit(0.0)
|
|
{
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Destructor |
|
|
//+------------------------------------------------------------------+
|
|
CPositionInfo::~CPositionInfo(void)
|
|
{
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TICKET" |
|
|
//+------------------------------------------------------------------+
|
|
ulong CPositionInfo::Ticket(void) const
|
|
{
|
|
return((ulong)PositionGetInteger(POSITION_TICKET));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TIME" |
|
|
//+------------------------------------------------------------------+
|
|
datetime CPositionInfo::Time(void) const
|
|
{
|
|
return((datetime)PositionGetInteger(POSITION_TIME));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TIME_MSC" |
|
|
//+------------------------------------------------------------------+
|
|
ulong CPositionInfo::TimeMsc(void) const
|
|
{
|
|
return((ulong)PositionGetInteger(POSITION_TIME_MSC));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TIME_UPDATE" |
|
|
//+------------------------------------------------------------------+
|
|
datetime CPositionInfo::TimeUpdate(void) const
|
|
{
|
|
return((datetime)PositionGetInteger(POSITION_TIME_UPDATE));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TIME_UPDATE_MSC" |
|
|
//+------------------------------------------------------------------+
|
|
ulong CPositionInfo::TimeUpdateMsc(void) const
|
|
{
|
|
return((ulong)PositionGetInteger(POSITION_TIME_UPDATE_MSC));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TYPE" |
|
|
//+------------------------------------------------------------------+
|
|
ENUM_POSITION_TYPE CPositionInfo::PositionType(void) const
|
|
{
|
|
return((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TYPE" as string |
|
|
//+------------------------------------------------------------------+
|
|
string CPositionInfo::TypeDescription(void) const
|
|
{
|
|
string str;
|
|
//---
|
|
return(FormatType(str,PositionType()));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_MAGIC" |
|
|
//+------------------------------------------------------------------+
|
|
long CPositionInfo::Magic(void) const
|
|
{
|
|
return(PositionGetInteger(POSITION_MAGIC));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_IDENTIFIER" |
|
|
//+------------------------------------------------------------------+
|
|
long CPositionInfo::Identifier(void) const
|
|
{
|
|
return(PositionGetInteger(POSITION_IDENTIFIER));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_VOLUME" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::Volume(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_VOLUME));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_PRICE_OPEN" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::PriceOpen(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_PRICE_OPEN));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_SL" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::StopLoss(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_SL));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_TP" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::TakeProfit(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_TP));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_PRICE_CURRENT" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::PriceCurrent(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_PRICE_CURRENT));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_COMMISSION" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::Commission(void) const
|
|
{
|
|
//--- property POSITION_COMMISSION is deprecated
|
|
SetUserError(ERR_FUNCTION_NOT_ALLOWED);
|
|
return(0);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_SWAP" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::Swap(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_SWAP));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_PROFIT" |
|
|
//+------------------------------------------------------------------+
|
|
double CPositionInfo::Profit(void) const
|
|
{
|
|
return(PositionGetDouble(POSITION_PROFIT));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_SYMBOL" |
|
|
//+------------------------------------------------------------------+
|
|
string CPositionInfo::Symbol(void) const
|
|
{
|
|
return(PositionGetString(POSITION_SYMBOL));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Get the property value "POSITION_COMMENT" |
|
|
//+------------------------------------------------------------------+
|
|
string CPositionInfo::Comment(void) const
|
|
{
|
|
return(PositionGetString(POSITION_COMMENT));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionGetInteger(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::InfoInteger(const ENUM_POSITION_PROPERTY_INTEGER prop_id,long &var) const
|
|
{
|
|
return(PositionGetInteger(prop_id,var));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionGetDouble(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::InfoDouble(const ENUM_POSITION_PROPERTY_DOUBLE prop_id,double &var) const
|
|
{
|
|
return(PositionGetDouble(prop_id,var));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionGetString(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::InfoString(const ENUM_POSITION_PROPERTY_STRING prop_id,string &var) const
|
|
{
|
|
return(PositionGetString(prop_id,var));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Converts the position type to text |
|
|
//+------------------------------------------------------------------+
|
|
string CPositionInfo::FormatType(string &str,const uint type) const
|
|
{
|
|
//--- see the type
|
|
switch(type)
|
|
{
|
|
case POSITION_TYPE_BUY:
|
|
str="buy";
|
|
break;
|
|
case POSITION_TYPE_SELL:
|
|
str="sell";
|
|
break;
|
|
default:
|
|
str="unknown position type "+(string)type;
|
|
}
|
|
//--- return the result
|
|
return(str);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Converts the position parameters to text |
|
|
//+------------------------------------------------------------------+
|
|
string CPositionInfo::FormatPosition(string &str) const
|
|
{
|
|
string tmp,type;
|
|
long tmp_long;
|
|
ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
|
|
//--- set up
|
|
string symbol_name=this.Symbol();
|
|
int digits=_Digits;
|
|
if(SymbolInfoInteger(symbol_name,SYMBOL_DIGITS,tmp_long))
|
|
digits=(int)tmp_long;
|
|
//--- form the position description
|
|
if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
|
|
str=StringFormat("#%I64u %s %s %s %s",
|
|
Ticket(),
|
|
FormatType(type,PositionType()),
|
|
DoubleToString(Volume(),2),
|
|
symbol_name,
|
|
DoubleToString(PriceOpen(),digits+3));
|
|
else
|
|
str=StringFormat("%s %s %s %s",
|
|
FormatType(type,PositionType()),
|
|
DoubleToString(Volume(),2),
|
|
symbol_name,
|
|
DoubleToString(PriceOpen(),digits+3));
|
|
//--- add stops if there are any
|
|
double sl=StopLoss();
|
|
double tp=TakeProfit();
|
|
if(sl!=0.0)
|
|
{
|
|
tmp=StringFormat(" sl: %s",DoubleToString(sl,digits));
|
|
str+=tmp;
|
|
}
|
|
if(tp!=0.0)
|
|
{
|
|
tmp=StringFormat(" tp: %s",DoubleToString(tp,digits));
|
|
str+=tmp;
|
|
}
|
|
//--- return the result
|
|
return(str);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionSelect(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::Select(const string symbol)
|
|
{
|
|
return(PositionSelect(symbol));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionSelect(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::SelectByMagic(const string symbol,const ulong magic)
|
|
{
|
|
bool res=false;
|
|
uint total=PositionsTotal();
|
|
//---
|
|
for(uint i=0; i<total; i++)
|
|
{
|
|
string position_symbol=PositionGetSymbol(i);
|
|
if(position_symbol==symbol && magic==PositionGetInteger(POSITION_MAGIC))
|
|
{
|
|
res=true;
|
|
break;
|
|
}
|
|
}
|
|
//---
|
|
return(res);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Access functions PositionSelectByTicket(...) |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::SelectByTicket(const ulong ticket)
|
|
{
|
|
return(PositionSelectByTicket(ticket));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Select a position on the index |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::SelectByIndex(const int index)
|
|
{
|
|
ulong ticket=PositionGetTicket(index);
|
|
return(ticket>0);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Stored position's current state |
|
|
//+------------------------------------------------------------------+
|
|
void CPositionInfo::StoreState(void)
|
|
{
|
|
m_type =PositionType();
|
|
m_volume =Volume();
|
|
m_price =PriceOpen();
|
|
m_stop_loss =StopLoss();
|
|
m_take_profit=TakeProfit();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Check position change |
|
|
//+------------------------------------------------------------------+
|
|
bool CPositionInfo::CheckState(void)
|
|
{
|
|
if(m_type==PositionType() &&
|
|
m_volume==Volume() &&
|
|
m_price==PriceOpen() &&
|
|
m_stop_loss==StopLoss() &&
|
|
m_take_profit==TakeProfit())
|
|
return(false);
|
|
//---
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|