MobinMQL/Include/Trade/HistoryOrderInfo.mqh
2025-07-22 14:47:41 +03:00

472 lines
19 KiB
MQL5

//+------------------------------------------------------------------+
//| HistoryOrderInfo.mqh |
//| Copyright 2000-2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.mqh>
//+------------------------------------------------------------------+
//| Class CHistoryOrderInfo. |
//| Appointment: Class for access to history order info. |
//| Derives from class CObject. |
//+------------------------------------------------------------------+
class CHistoryOrderInfo : public CObject
{
protected:
ulong m_ticket; // ticket of history order
public:
CHistoryOrderInfo(void);
~CHistoryOrderInfo(void);
//--- methods of access to protected data
void Ticket(const ulong ticket) { m_ticket=ticket; }
ulong Ticket(void) const { return(m_ticket); }
//--- fast access methods to the integer order propertyes
datetime TimeSetup(void) const;
ulong TimeSetupMsc(void) const;
datetime TimeDone(void) const;
ulong TimeDoneMsc(void) const;
ENUM_ORDER_TYPE OrderType(void) const;
string TypeDescription(void) const;
ENUM_ORDER_STATE State(void) const;
string StateDescription(void) const;
datetime TimeExpiration(void) const;
ENUM_ORDER_TYPE_FILLING TypeFilling(void) const;
string TypeFillingDescription(void) const;
ENUM_ORDER_TYPE_TIME TypeTime(void) const;
string TypeTimeDescription(void) const;
long Magic(void) const;
long PositionId(void) const;
long PositionById(void) const;
//--- fast access methods to the double order propertyes
double VolumeInitial(void) const;
double VolumeCurrent(void) const;
double PriceOpen(void) const;
double StopLoss(void) const;
double TakeProfit(void) const;
double PriceCurrent(void) const;
double PriceStopLimit(void) const;
//--- fast access methods to the string order propertyes
string Symbol(void) const;
string Comment(void) const;
string ExternalId(void) const;
//--- access methods to the API MQL5 functions
bool InfoInteger(const ENUM_ORDER_PROPERTY_INTEGER prop_id,long &var) const;
bool InfoDouble(const ENUM_ORDER_PROPERTY_DOUBLE prop_id,double &var) const;
bool InfoString(const ENUM_ORDER_PROPERTY_STRING prop_id,string &var) const;
//--- info methods
string FormatType(string &str,const uint type) const;
string FormatStatus(string &str,const uint status) const;
string FormatTypeFilling(string &str,const uint type) const;
string FormatTypeTime(string &str,const uint type) const;
string FormatOrder(string &str) const;
string FormatPrice(string &str,const double price_order,const double price_trigger,const uint digits) const;
//--- method for select history order
bool SelectByIndex(const int index);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CHistoryOrderInfo::CHistoryOrderInfo(void) : m_ticket(0)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CHistoryOrderInfo::~CHistoryOrderInfo(void)
{
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TIME_SETUP" |
//+------------------------------------------------------------------+
datetime CHistoryOrderInfo::TimeSetup(void) const
{
return((datetime)HistoryOrderGetInteger(m_ticket,ORDER_TIME_SETUP));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TIME_SETUP_MSC" |
//+------------------------------------------------------------------+
ulong CHistoryOrderInfo::TimeSetupMsc(void) const
{
return(HistoryOrderGetInteger(m_ticket,ORDER_TIME_SETUP_MSC));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TIME_DONE" |
//+------------------------------------------------------------------+
datetime CHistoryOrderInfo::TimeDone(void) const
{
return((datetime)HistoryOrderGetInteger(m_ticket,ORDER_TIME_DONE));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TIME_DONE_MSC" |
//+------------------------------------------------------------------+
ulong CHistoryOrderInfo::TimeDoneMsc(void) const
{
return(HistoryOrderGetInteger(m_ticket,ORDER_TIME_DONE_MSC));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE" |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE CHistoryOrderInfo::OrderType(void) const
{
return((ENUM_ORDER_TYPE)HistoryOrderGetInteger(m_ticket,ORDER_TYPE));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE" as string |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::TypeDescription(void) const
{
string str;
//---
return(FormatType(str,OrderType()));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_STATE" |
//+------------------------------------------------------------------+
ENUM_ORDER_STATE CHistoryOrderInfo::State(void) const
{
return((ENUM_ORDER_STATE)HistoryOrderGetInteger(m_ticket,ORDER_STATE));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_STATE" as string |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::StateDescription(void) const
{
string str;
//---
return(FormatStatus(str,State()));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TIME_EXPIRATION" |
//+------------------------------------------------------------------+
datetime CHistoryOrderInfo::TimeExpiration(void) const
{
return((datetime)HistoryOrderGetInteger(m_ticket,ORDER_TIME_EXPIRATION));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING" |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING CHistoryOrderInfo::TypeFilling(void) const
{
return((ENUM_ORDER_TYPE_FILLING)HistoryOrderGetInteger(m_ticket,ORDER_TYPE_FILLING));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING" as string |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::TypeFillingDescription(void) const
{
string str;
//---
return(FormatTypeFilling(str,TypeFilling()));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_TIME" |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_TIME CHistoryOrderInfo::TypeTime(void) const
{
return((ENUM_ORDER_TYPE_TIME)HistoryOrderGetInteger(m_ticket,ORDER_TYPE_TIME));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_TIME" as string |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::TypeTimeDescription(void) const
{
string str;
//---
return(FormatTypeTime(str,TypeTime()));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_EXPERT" |
//+------------------------------------------------------------------+
long CHistoryOrderInfo::Magic(void) const
{
return(HistoryOrderGetInteger(m_ticket,ORDER_MAGIC));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_POSITION_ID" |
//+------------------------------------------------------------------+
long CHistoryOrderInfo::PositionId(void) const
{
return(HistoryOrderGetInteger(m_ticket,ORDER_POSITION_ID));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_POSITION_BY_ID" |
//+------------------------------------------------------------------+
long CHistoryOrderInfo::PositionById(void) const
{
return(HistoryOrderGetInteger(m_ticket,ORDER_POSITION_BY_ID));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_VOLUME_INITIAL" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::VolumeInitial(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_VOLUME_INITIAL));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_VOLUME_CURRENT" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::VolumeCurrent(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_VOLUME_CURRENT));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_PRICE_OPEN" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::PriceOpen(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_PRICE_OPEN));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_SL" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::StopLoss(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_SL));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TP" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::TakeProfit(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_TP));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_PRICE_CURRENT" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::PriceCurrent(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_PRICE_CURRENT));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_PRICE_STOPLIMIT" |
//+------------------------------------------------------------------+
double CHistoryOrderInfo::PriceStopLimit(void) const
{
return(HistoryOrderGetDouble(m_ticket,ORDER_PRICE_STOPLIMIT));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_SYMBOL" |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::Symbol(void) const
{
return(HistoryOrderGetString(m_ticket,ORDER_SYMBOL));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_COMMENT" |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::Comment(void) const
{
return(HistoryOrderGetString(m_ticket,ORDER_COMMENT));
}
//+------------------------------------------------------------------+
//| Get the property value "ORDER_EXTERNAL_ID" |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::ExternalId(void) const
{
return(HistoryOrderGetString(m_ticket,ORDER_EXTERNAL_ID));
}
//+------------------------------------------------------------------+
//| Access functions OrderGetInteger(...) |
//+------------------------------------------------------------------+
bool CHistoryOrderInfo::InfoInteger(const ENUM_ORDER_PROPERTY_INTEGER prop_id,long &var) const
{
return(HistoryOrderGetInteger(m_ticket,prop_id,var));
}
//+------------------------------------------------------------------+
//| Access functions OrderGetDouble(...) |
//+------------------------------------------------------------------+
bool CHistoryOrderInfo::InfoDouble(const ENUM_ORDER_PROPERTY_DOUBLE prop_id,double &var) const
{
return(HistoryOrderGetDouble(m_ticket,prop_id,var));
}
//+------------------------------------------------------------------+
//| Access functions OrderGetString(...) |
//+------------------------------------------------------------------+
bool CHistoryOrderInfo::InfoString(const ENUM_ORDER_PROPERTY_STRING prop_id,string &var) const
{
return(HistoryOrderGetString(m_ticket,prop_id,var));
}
//+------------------------------------------------------------------+
//| Converts the order type to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatType(string &str,const uint type) const
{
//--- see the type
switch(type)
{
case ORDER_TYPE_BUY:
str="buy";
break;
case ORDER_TYPE_SELL:
str="sell";
break;
case ORDER_TYPE_BUY_LIMIT:
str="buy limit";
break;
case ORDER_TYPE_SELL_LIMIT:
str="sell limit";
break;
case ORDER_TYPE_BUY_STOP:
str="buy stop";
break;
case ORDER_TYPE_SELL_STOP:
str="sell stop";
break;
case ORDER_TYPE_BUY_STOP_LIMIT:
str="buy stop limit";
break;
case ORDER_TYPE_SELL_STOP_LIMIT:
str="sell stop limit";
break;
case ORDER_TYPE_CLOSE_BY:
str="close by";
break;
default:
str="unknown order type "+(string)type;
}
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Converts the order status to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatStatus(string &str,const uint status) const
{
//--- see the type
switch(status)
{
case ORDER_STATE_STARTED:
str="started";
break;
case ORDER_STATE_PLACED:
str="placed";
break;
case ORDER_STATE_CANCELED:
str="canceled";
break;
case ORDER_STATE_PARTIAL:
str="partial";
break;
case ORDER_STATE_FILLED:
str="filled";
break;
case ORDER_STATE_REJECTED:
str="rejected";
break;
case ORDER_STATE_EXPIRED:
str="expired";
break;
default:
str="unknown order status "+(string)status;
}
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Converts the order filling type to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatTypeFilling(string &str,const uint type) const
{
//--- see the type
switch(type)
{
case ORDER_FILLING_RETURN:
str="return remainder";
break;
case ORDER_FILLING_IOC:
str="cancel remainder";
break;
case ORDER_FILLING_FOK:
str="fill or kill";
break;
default:
str="unknown type filling "+(string)type;
}
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Converts the type of order by expiration to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatTypeTime(string &str,const uint type) const
{
//--- see the type
switch(type)
{
case ORDER_TIME_GTC:
str="gtc";
break;
case ORDER_TIME_DAY:
str="day";
break;
case ORDER_TIME_SPECIFIED:
str="specified";
break;
case ORDER_TIME_SPECIFIED_DAY:
str="specified day";
break;
default:
str="unknown type time "+(string)type;
}
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Converts the order parameters to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatOrder(string &str) const
{
string type,price;
long tmp_long;
//--- set up
string symbol_name=this.Symbol();
int digits=_Digits;
if(SymbolInfoInteger(symbol_name,SYMBOL_DIGITS,tmp_long))
digits=(int)tmp_long;
//--- form the order description
str=StringFormat("#%I64u %s %s %s",
Ticket(),
FormatType(type,OrderType()),
DoubleToString(VolumeInitial(),2),
symbol_name);
//--- receive the price of the order
FormatPrice(price,PriceOpen(),PriceStopLimit(),digits);
//--- if there is price, write it
if(price!="")
{
str+=" at ";
str+=price;
}
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Converts the order prices to text |
//+------------------------------------------------------------------+
string CHistoryOrderInfo::FormatPrice(string &str,const double price_order,const double price_trigger,const uint digits) const
{
string price,trigger;
//--- Is there its trigger price?
if(price_trigger)
{
price =DoubleToString(price_order,digits);
trigger=DoubleToString(price_trigger,digits);
str =StringFormat("%s (%s)",price,trigger);
}
else
str=DoubleToString(price_order,digits);
//--- return the result
return(str);
}
//+------------------------------------------------------------------+
//| Select a history order on the index |
//+------------------------------------------------------------------+
bool CHistoryOrderInfo::SelectByIndex(const int index)
{
ulong ticket=HistoryOrderGetTicket(index);
if(ticket==0)
return(false);
Ticket(ticket);
//---
return(true);
}
//+------------------------------------------------------------------+