UTE/Strategy/PendingOrders.mqh

322 lines
28 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| PendingOrders.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 <Trade\Trade.mqh>
#include "Dictionary.mqh"
//+------------------------------------------------------------------+
//| ;0AA ?@54AB02;ONI89 >B;>65==K9 >@45@ |
//+------------------------------------------------------------------+
class CPendingOrder : public CObject
{
private:
ulong m_ticket;
CTrade m_trade;
public:
CPendingOrder(ulong ticket);
ulong ExpertMagic(void);
string Symbol(void);
string Comment(void);
ENUM_ORDER_TYPE Type(void);
ENUM_ORDER_STATE State(void);
ENUM_ORDER_TYPE_FILLING TypeFilling(void);
ENUM_ORDER_TYPE_TIME TypeTime(void);
ulong Ticket(void);
datetime TimeExp(void);
datetime TimeDone(void);
datetime TimeSetup(void);
long TimeSetupMsc(void);
long TimeDoneMsc(void);
long PositionID(void);
long PositionByID(void);
double VolumeInit(void);
double VolumeCurrent(void);
double PriceOpen(void);
double PriceCurrent(void);
double StopLoss(void);
double TakeProfit(void);
bool IsMain(string symbol, ulong magic);
bool Modify(const double price,const double sl,const double tp,
const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit=0.0);
bool Modify(double price);
bool Delete(void);
ENUM_POSITION_TYPE Direction(void);
};
//+------------------------------------------------------------------+
//| !>7405< :;0AA >B;>65==>3> >@45@0 |
//+------------------------------------------------------------------+
CPendingOrder::CPendingOrder(ulong ticket)
{
if(!OrderSelect(ticket))
m_ticket = 0;
else
m_ticket = ticket;
}
//+------------------------------------------------------------------+
//| >48D8F8@C5B >B;>65==K9 >@45@ |
//+------------------------------------------------------------------+
bool CPendingOrder::Modify(const double price,const double sl,const double tp,
const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit=0.0)
{
return m_trade.OrderModify(m_ticket, price, sl, tp, type_time, expiration, stoplimit);
}
//+------------------------------------------------------------------+
//| >48D8F8@C5B >B;>65==K9 >@45@ |
//+------------------------------------------------------------------+
bool CPendingOrder::Modify(double price)
{
return m_trade.OrderModify(m_ticket, price, StopLoss(), TakeProfit(), TypeTime(), TimeExp(), 0.0);
}
//+------------------------------------------------------------------+
//| #40;O5B >B;>65==K9 >@45@ |
//+------------------------------------------------------------------+
bool CPendingOrder::Delete(void)
{
return m_trade.OrderDelete(m_ticket);
}
//+------------------------------------------------------------------+
//| >72@0I05B 8AB8=C, 5A;8 >@45@ ?@8=04;568B M:A?5@BC A C:070==K< |
//| <038G5A:8< =><5@>< 8 8=AB@C<5=B5. >72@0I05B ;>6L 2 ?@>B82=>< |
//| A;CG05. |
//+------------------------------------------------------------------+
bool CPendingOrder::IsMain(string symbol,ulong magic)
{
if(ExpertMagic() == magic && Symbol() == symbol)
return true;
return false;
}
//+------------------------------------------------------------------+
//| >72@0I05B <038G5A:89 =><5@ >@45@0 |
//+------------------------------------------------------------------+
ulong CPendingOrder::ExpertMagic(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_MAGIC);
}
//+------------------------------------------------------------------+
//| >72@0I05B A8<2>; >@45@0 |
//+------------------------------------------------------------------+
string CPendingOrder::Symbol(void)
{
if(!OrderSelect(m_ticket))return "";
return OrderGetString(ORDER_SYMBOL);
}
//+------------------------------------------------------------------+
//| >72@0I05B :><<5=B0@89 >@45@0 |
//+------------------------------------------------------------------+
string CPendingOrder::Comment(void)
{
if(!OrderSelect(m_ticket))return "";
return OrderGetString(ORDER_COMMENT);
}
//+------------------------------------------------------------------+
//| >72@0I05B B8? >@45@0 |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE CPendingOrder::Type(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
}
//+------------------------------------------------------------------+
//| >72@0I05B A>AB>O=85 >@45@0 |
//+------------------------------------------------------------------+
ENUM_ORDER_STATE CPendingOrder::State(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
}
//+------------------------------------------------------------------+
//| >72@0I05B B8? 8A?>;=5=8O >@45@0 |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING CPendingOrder::TypeFilling(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING);
}
//+------------------------------------------------------------------+
//| "8? 2@5<5=8 8A?>;=5=8O >@45@0 |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_TIME CPendingOrder::TypeTime(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME);
}
//+------------------------------------------------------------------+
//| "8:5B >@45@0 |
//+------------------------------------------------------------------+
ulong CPendingOrder::Ticket(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ulong)OrderGetInteger(ORDER_TICKET);
}
//+------------------------------------------------------------------+
//| @5<O M:A?8@0F88 >@45@0 |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeExp(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_EXPIRATION);
}
//+------------------------------------------------------------------+
//| @5<O 8A?>;=5=8O >@45@0 |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeDone(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_DONE);
}
//+------------------------------------------------------------------+
//| @5<O CAB0=>2:8 >@45@0 |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeSetup(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_SETUP);
}
//+------------------------------------------------------------------+
//| @5<O CAB0=>2:8 >@45@0 2 <8;;8A5:C=40E |
//+------------------------------------------------------------------+
long CPendingOrder::TimeSetupMsc(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_TIME_SETUP_MSC);
}
//+------------------------------------------------------------------+
//| @5<O 8A?>;=5=8O >@45@0 2 <8;;8A5:C=40E |
//+------------------------------------------------------------------+
long CPendingOrder::TimeDoneMsc(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_TIME_DONE_MSC);
}
//+------------------------------------------------------------------+
//| ID ?>78F88, :>B>@>9 ?@8=04;568B >@45@ |
//+------------------------------------------------------------------+
long CPendingOrder::PositionID(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_POSITION_ID);
}
//+------------------------------------------------------------------+
//| ID ?>78F88, :>B>@>9 ?@8=04;568B >@45@ 4;O E5468=3>2KE AG5B>2 |
//+------------------------------------------------------------------+
long CPendingOrder::PositionByID(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_POSITION_BY_ID);
}
//+------------------------------------------------------------------+
//| =8F88@CNI89 >1J5< >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::VolumeInit(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_VOLUME_INITIAL);
}
//+------------------------------------------------------------------+
//| A?>;=5==K9 >1J5< >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::VolumeCurrent(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_VOLUME_CURRENT);
}
//+------------------------------------------------------------------+
//| &5=0 >B:@KB8O >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::PriceOpen(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_PRICE_OPEN);
}
//+------------------------------------------------------------------+
//| &5=0 >B:@KB8O >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::PriceCurrent(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_PRICE_CURRENT);
}
//+------------------------------------------------------------------+
//| !B>?-;>AA >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::StopLoss(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_SL);
}
//+------------------------------------------------------------------+
//| "59:-?@>D8B >@45@0 |
//+------------------------------------------------------------------+
double CPendingOrder::TakeProfit(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_TP);
}
//+------------------------------------------------------------------+
//| 0?@02;5=85 >@45@0 |
//+------------------------------------------------------------------+
ENUM_POSITION_TYPE CPendingOrder::Direction(void)
{
if(!OrderSelect(m_ticket))return POSITION_TYPE_BUY;
switch((ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE))
{
case ORDER_TYPE_BUY:
case ORDER_TYPE_BUY_LIMIT:
case ORDER_TYPE_BUY_STOP:
case ORDER_TYPE_BUY_STOP_LIMIT:
return POSITION_TYPE_BUY;
default:
return POSITION_TYPE_SELL;
}
return POSITION_TYPE_BUY;
}
//+------------------------------------------------------------------+
//| ;0AA 4;O @01>BK A >B;>65==K<8 >@45@0<8 |
//+------------------------------------------------------------------+
class COrdersEnvironment
{
private:
CDictionary m_orders; // 1I55 :>;8G5AB2> 2A5E >B;>65==KE >@45@>2
public:
COrdersEnvironment(void);
int Total(void);
CPendingOrder* GetOrder(int index);
};
//+------------------------------------------------------------------+
//| 5>1E>48<> 7=0BL B5:CI89 A8<2>; 8 <038G5A:89 =><5@ M:A?5@B0 |
//+------------------------------------------------------------------+
COrdersEnvironment::COrdersEnvironment(void)
{
}
//+------------------------------------------------------------------+
//| >72@0I05B >B;>65==K9 >@45@ |
//+------------------------------------------------------------------+
CPendingOrder* COrdersEnvironment::GetOrder(int index)
{
ulong ticket = OrderGetTicket(index);
if(ticket == 0)
return NULL;
int total = m_orders.Total();
if(m_orders.ContainsKey(ticket))
return m_orders.GetObjectByKey(ticket);
if(!OrderSelect(ticket))
return NULL;
CPendingOrder* order = new CPendingOrder(ticket);
m_orders.AddObject(ticket, order);
return order;
}
//+------------------------------------------------------------------+
//| >72@0I05B :>;8G5AB2> >B;>65==KE >@45@>2 |
//+------------------------------------------------------------------+
int COrdersEnvironment::Total(void)
{
return OrdersTotal();
}