472 lines
19 KiB
MQL5
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);
| |||
}
| |||
//+------------------------------------------------------------------+
|