| //+------------------------------------------------------------------+
|
| //| OrderInfo.mqh |
|
| //| Copyright 2000-2025, MetaQuotes Ltd. |
|
| //| https://www.mql5.com |
|
| //+------------------------------------------------------------------+
|
| #include <Object.mqh>
|
| //+------------------------------------------------------------------+
|
| //| Class COrderInfo. |
|
| //| Appointment: Class for access to order info. |
|
| //| Derives from class CObject. |
|
| //+------------------------------------------------------------------+
|
| class COrderInfo : public CObject
|
| {
|
| protected:
|
| ulong m_ticket;
|
| ENUM_ORDER_TYPE m_type;
|
| ENUM_ORDER_STATE m_state;
|
| datetime m_expiration;
|
| double m_volume_curr;
|
| double m_price_open;
|
| double m_stop_loss;
|
| double m_take_profit;
|
|
|
| public:
|
| COrderInfo(void);
|
| ~COrderInfo(void);
|
| //--- methods of access to protected data
|
| 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 order
|
| bool Select(void);
|
| bool Select(const ulong ticket);
|
| bool SelectByIndex(const int index);
|
| //--- additional methods
|
| void StoreState(void);
|
| bool CheckState(void);
|
| };
|
| //+------------------------------------------------------------------+
|
| //| Constructor |
|
| //+------------------------------------------------------------------+
|
| COrderInfo::COrderInfo(void) : m_ticket(ULONG_MAX),
|
| m_type(WRONG_VALUE),
|
| m_state(WRONG_VALUE),
|
| m_expiration(0),
|
| m_volume_curr(0.0),
|
| m_price_open(0.0),
|
| m_stop_loss(0.0),
|
| m_take_profit(0.0)
|
| {
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Destructor |
|
| //+------------------------------------------------------------------+
|
| COrderInfo::~COrderInfo(void)
|
| {
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TIME_SETUP" |
|
| //+------------------------------------------------------------------+
|
| datetime COrderInfo::TimeSetup(void) const
|
| {
|
| return((datetime)OrderGetInteger(ORDER_TIME_SETUP));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TIME_SETUP_MSC" |
|
| //+------------------------------------------------------------------+
|
| ulong COrderInfo::TimeSetupMsc(void) const
|
| {
|
| return(OrderGetInteger(ORDER_TIME_SETUP_MSC));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TIME_DONE" |
|
| //+------------------------------------------------------------------+
|
| datetime COrderInfo::TimeDone(void) const
|
| {
|
| return((datetime)OrderGetInteger(ORDER_TIME_DONE));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TIME_DONE_MSC" |
|
| //+------------------------------------------------------------------+
|
| ulong COrderInfo::TimeDoneMsc(void) const
|
| {
|
| return(OrderGetInteger(ORDER_TIME_DONE_MSC));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE" |
|
| //+------------------------------------------------------------------+
|
| ENUM_ORDER_TYPE COrderInfo::OrderType(void) const
|
| {
|
| return((ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE" as string |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::TypeDescription(void) const
|
| {
|
| string str;
|
| //---
|
| return(FormatType(str,OrderType()));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_STATE" |
|
| //+------------------------------------------------------------------+
|
| ENUM_ORDER_STATE COrderInfo::State(void) const
|
| {
|
| return((ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_STATE" as string |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::StateDescription(void) const
|
| {
|
| string str;
|
| //---
|
| return(FormatStatus(str,State()));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TIME_EXPIRATION" |
|
| //+------------------------------------------------------------------+
|
| datetime COrderInfo::TimeExpiration(void) const
|
| {
|
| return((datetime)OrderGetInteger(ORDER_TIME_EXPIRATION));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE_FILLING" |
|
| //+------------------------------------------------------------------+
|
| ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
|
| {
|
| return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE_FILLING" as string |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::TypeFillingDescription(void) const
|
| {
|
| string str;
|
| //---
|
| return(FormatTypeFilling(str,TypeFilling()));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE_TIME" |
|
| //+------------------------------------------------------------------+
|
| ENUM_ORDER_TYPE_TIME COrderInfo::TypeTime(void) const
|
| {
|
| return((ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TYPE_TIME" as string |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::TypeTimeDescription(void) const
|
| {
|
| string str;
|
| //---
|
| return(FormatTypeTime(str,TypeFilling()));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_MAGIC" |
|
| //+------------------------------------------------------------------+
|
| long COrderInfo::Magic(void) const
|
| {
|
| return(OrderGetInteger(ORDER_MAGIC));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_POSITION_ID" |
|
| //+------------------------------------------------------------------+
|
| long COrderInfo::PositionId(void) const
|
| {
|
| return(OrderGetInteger(ORDER_POSITION_ID));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_POSITION_BY_ID" |
|
| //+------------------------------------------------------------------+
|
| long COrderInfo::PositionById(void) const
|
| {
|
| return(OrderGetInteger(ORDER_POSITION_BY_ID));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_VOLUME_INITIAL" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::VolumeInitial(void) const
|
| {
|
| return(OrderGetDouble(ORDER_VOLUME_INITIAL));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_VOLUME_CURRENT" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::VolumeCurrent(void) const
|
| {
|
| return(OrderGetDouble(ORDER_VOLUME_CURRENT));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_PRICE_OPEN" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::PriceOpen(void) const
|
| {
|
| return(OrderGetDouble(ORDER_PRICE_OPEN));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_SL" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::StopLoss(void) const
|
| {
|
| return(OrderGetDouble(ORDER_SL));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_TP" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::TakeProfit(void) const
|
| {
|
| return(OrderGetDouble(ORDER_TP));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_PRICE_CURRENT" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::PriceCurrent(void) const
|
| {
|
| return(OrderGetDouble(ORDER_PRICE_CURRENT));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_PRICE_STOPLIMIT" |
|
| //+------------------------------------------------------------------+
|
| double COrderInfo::PriceStopLimit(void) const
|
| {
|
| return(OrderGetDouble(ORDER_PRICE_STOPLIMIT));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_SYMBOL" |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::Symbol(void) const
|
| {
|
| return(OrderGetString(ORDER_SYMBOL));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_COMMENT" |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::Comment(void) const
|
| {
|
| return(OrderGetString(ORDER_COMMENT));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Get the property value "ORDER_EXTERNAL_ID" |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::ExternalId(void) const
|
| {
|
| return(OrderGetString(ORDER_EXTERNAL_ID));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Access functions OrderGetInteger(...) |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::InfoInteger(const ENUM_ORDER_PROPERTY_INTEGER prop_id,long &var) const
|
| {
|
| return(OrderGetInteger(prop_id,var));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Access functions OrderGetDouble(...) |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::InfoDouble(const ENUM_ORDER_PROPERTY_DOUBLE prop_id,double &var) const
|
| {
|
| return(OrderGetDouble(prop_id,var));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Access functions OrderGetString(...) |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::InfoString(const ENUM_ORDER_PROPERTY_STRING prop_id,string &var) const
|
| {
|
| return(OrderGetString(prop_id,var));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Converts the order type to text |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::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 COrderInfo::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;
|
| case ORDER_STATE_REQUEST_ADD:
|
| str="request adding";
|
| break;
|
| case ORDER_STATE_REQUEST_MODIFY:
|
| str="request modifying";
|
| break;
|
| case ORDER_STATE_REQUEST_CANCEL:
|
| str="request cancelling";
|
| break;
|
| default :
|
| str="unknown order status "+(string)status;
|
| }
|
| //--- return the result
|
| return(str);
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Converts the order filling type to text |
|
| //+------------------------------------------------------------------+
|
| string COrderInfo::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 COrderInfo::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 COrderInfo::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 COrderInfo::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);
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Selecting an order to access |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::Select(void)
|
| {
|
| return(OrderSelect(m_ticket));
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Selecting an order to access |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::Select(const ulong ticket)
|
| {
|
| if(OrderSelect(ticket))
|
| {
|
| m_ticket=ticket;
|
| return(true);
|
| }
|
| m_ticket=ULONG_MAX;
|
| //---
|
| return(false);
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Select an order by the index |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::SelectByIndex(const int index)
|
| {
|
| ulong ticket=OrderGetTicket(index);
|
| if(ticket==0)
|
| {
|
| m_ticket=ULONG_MAX;
|
| return(false);
|
| }
|
| m_ticket=ticket;
|
| //---
|
| return(true);
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Stored order's current state |
|
| //+------------------------------------------------------------------+
|
| void COrderInfo::StoreState(void)
|
| {
|
| m_type =OrderType();
|
| m_state =State();
|
| m_expiration =TimeExpiration();
|
| m_volume_curr=VolumeCurrent();
|
| m_price_open =PriceOpen();
|
| m_stop_loss =StopLoss();
|
| m_take_profit=TakeProfit();
|
| }
|
| //+------------------------------------------------------------------+
|
| //| Check order change |
|
| //+------------------------------------------------------------------+
|
| bool COrderInfo::CheckState(void)
|
| {
|
| if(m_type==OrderType() &&
|
| m_state==State() &&
|
| m_expiration==TimeExpiration() &&
|
| m_volume_curr==VolumeCurrent() &&
|
| m_price_open==PriceOpen() &&
|
| m_stop_loss==StopLoss() &&
|
| m_take_profit==TakeProfit())
|
| return(false);
|
| //---
|
| return(true);
|
| }
|
| //+------------------------------------------------------------------+
|