UTE/Strategy/PendingOrders.mqh
super.admin bd7e405a90 convert
2025-05-30 16:34:43 +02:00

322 lines
No EOL
28 KiB
MQL5

//+------------------------------------------------------------------+
//| 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"
//+------------------------------------------------------------------+
//| Класс представляющий отложенный ордер |
//+------------------------------------------------------------------+
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);
};
//+------------------------------------------------------------------+
//| Создаем класс отложенного ордера |
//+------------------------------------------------------------------+
CPendingOrder::CPendingOrder(ulong ticket)
{
if(!OrderSelect(ticket))
m_ticket = 0;
else
m_ticket = ticket;
}
//+------------------------------------------------------------------+
//| Модифицирует отложенный ордер |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Модифицирует отложенный ордер |
//+------------------------------------------------------------------+
bool CPendingOrder::Modify(double price)
{
return m_trade.OrderModify(m_ticket, price, StopLoss(), TakeProfit(), TypeTime(), TimeExp(), 0.0);
}
//+------------------------------------------------------------------+
//| Удаляет отложенный ордер |
//+------------------------------------------------------------------+
bool CPendingOrder::Delete(void)
{
return m_trade.OrderDelete(m_ticket);
}
//+------------------------------------------------------------------+
//| Возвращает истину, если ордер принадлежит эксперту с указанным |
//| магическим номером и инструменте. Возвращает ложь в противном |
//| случае. |
//+------------------------------------------------------------------+
bool CPendingOrder::IsMain(string symbol,ulong magic)
{
if(ExpertMagic() == magic && Symbol() == symbol)
return true;
return false;
}
//+------------------------------------------------------------------+
//| Возвращает магический номер ордера |
//+------------------------------------------------------------------+
ulong CPendingOrder::ExpertMagic(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_MAGIC);
}
//+------------------------------------------------------------------+
//| Возвращает символ ордера |
//+------------------------------------------------------------------+
string CPendingOrder::Symbol(void)
{
if(!OrderSelect(m_ticket))return "";
return OrderGetString(ORDER_SYMBOL);
}
//+------------------------------------------------------------------+
//| Возвращает комментарий ордера |
//+------------------------------------------------------------------+
string CPendingOrder::Comment(void)
{
if(!OrderSelect(m_ticket))return "";
return OrderGetString(ORDER_COMMENT);
}
//+------------------------------------------------------------------+
//| Возвращает тип ордера |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE CPendingOrder::Type(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
}
//+------------------------------------------------------------------+
//| Возвращает состояние ордера |
//+------------------------------------------------------------------+
ENUM_ORDER_STATE CPendingOrder::State(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
}
//+------------------------------------------------------------------+
//| Возвращает тип исполнения ордера |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING CPendingOrder::TypeFilling(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING);
}
//+------------------------------------------------------------------+
//| Тип времени исполнения ордера |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_TIME CPendingOrder::TypeTime(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME);
}
//+------------------------------------------------------------------+
//| Тикет ордера |
//+------------------------------------------------------------------+
ulong CPendingOrder::Ticket(void)
{
if(!OrderSelect(m_ticket))return 0;
return (ulong)OrderGetInteger(ORDER_TICKET);
}
//+------------------------------------------------------------------+
//| Время экспирации ордера |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeExp(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_EXPIRATION);
}
//+------------------------------------------------------------------+
//| Время исполнения ордера |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeDone(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_DONE);
}
//+------------------------------------------------------------------+
//| Время установки ордера |
//+------------------------------------------------------------------+
datetime CPendingOrder::TimeSetup(void)
{
if(!OrderSelect(m_ticket))return 0;
return (datetime)OrderGetInteger(ORDER_TIME_SETUP);
}
//+------------------------------------------------------------------+
//| Время установки ордера в миллисекундах |
//+------------------------------------------------------------------+
long CPendingOrder::TimeSetupMsc(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_TIME_SETUP_MSC);
}
//+------------------------------------------------------------------+
//| Время исполнения ордера в миллисекундах |
//+------------------------------------------------------------------+
long CPendingOrder::TimeDoneMsc(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_TIME_DONE_MSC);
}
//+------------------------------------------------------------------+
//| ID позиции, которой принадлежит ордер |
//+------------------------------------------------------------------+
long CPendingOrder::PositionID(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_POSITION_ID);
}
//+------------------------------------------------------------------+
//| ID позиции, которой принадлежит ордер для хеджинговых счетов |
//+------------------------------------------------------------------+
long CPendingOrder::PositionByID(void)
{
if(!OrderSelect(m_ticket))return 0;
return OrderGetInteger(ORDER_POSITION_BY_ID);
}
//+------------------------------------------------------------------+
//| Инициирующий объем ордера |
//+------------------------------------------------------------------+
double CPendingOrder::VolumeInit(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_VOLUME_INITIAL);
}
//+------------------------------------------------------------------+
//| Исполненный объем ордера |
//+------------------------------------------------------------------+
double CPendingOrder::VolumeCurrent(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_VOLUME_CURRENT);
}
//+------------------------------------------------------------------+
//| Цена открытия ордера |
//+------------------------------------------------------------------+
double CPendingOrder::PriceOpen(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_PRICE_OPEN);
}
//+------------------------------------------------------------------+
//| Цена открытия ордера |
//+------------------------------------------------------------------+
double CPendingOrder::PriceCurrent(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_PRICE_CURRENT);
}
//+------------------------------------------------------------------+
//| Стоп-лосс ордера |
//+------------------------------------------------------------------+
double CPendingOrder::StopLoss(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_SL);
}
//+------------------------------------------------------------------+
//| Тейк-профит ордера |
//+------------------------------------------------------------------+
double CPendingOrder::TakeProfit(void)
{
if(!OrderSelect(m_ticket))return 0.0;
return OrderGetDouble(ORDER_TP);
}
//+------------------------------------------------------------------+
//| Направление ордера |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Класс для работы с отложенными ордерами |
//+------------------------------------------------------------------+
class COrdersEnvironment
{
private:
CDictionary m_orders; // Общее количество всех отложенных ордеров
public:
COrdersEnvironment(void);
int Total(void);
CPendingOrder* GetOrder(int index);
};
//+------------------------------------------------------------------+
//| Необходимо знать текущий символ и магический номер эксперта |
//+------------------------------------------------------------------+
COrdersEnvironment::COrdersEnvironment(void)
{
}
//+------------------------------------------------------------------+
//| Возвращает отложенный ордер |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Возвращает количество отложенных ордеров |
//+------------------------------------------------------------------+
int COrdersEnvironment::Total(void)
{
return OrdersTotal();
}