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

171 lines
6.2 KiB
MQL5

//+------------------------------------------------------------------+
//| ExpertTrade.mqh |
//| Copyright 2000-2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Class CExpertTrade. |
//| Appointment: Class simple trade operations. |
//| Derives from class CTrade. |
//+------------------------------------------------------------------+
class CExpertTrade : public CTrade
{
protected:
ENUM_ORDER_TYPE_TIME m_order_type_time;
datetime m_order_expiration;
CSymbolInfo *m_symbol; // symbol object
CAccountInfo m_account; // account object
public:
CExpertTrade(void);
~CExpertTrade(void);
//--- methods for easy trade
bool SetSymbol(CSymbolInfo *symbol);
bool SetOrderTypeTime(ENUM_ORDER_TYPE_TIME order_type_time);
bool SetOrderExpiration(datetime order_expiration);
bool Buy(double volume,double price,double sl,double tp,const string comment="");
bool Sell(double volume,double price,double sl,double tp,const string comment="");
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
void CExpertTrade::CExpertTrade(void) : m_symbol(NULL),
m_order_type_time(ORDER_TIME_GTC),
m_order_expiration(0)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CExpertTrade::~CExpertTrade(void)
{
}
//+------------------------------------------------------------------+
//| Setting working symbol for easy trade operations. |
//+------------------------------------------------------------------+
bool CExpertTrade::SetSymbol(CSymbolInfo *symbol)
{
if(symbol!=NULL)
{
m_symbol=symbol;
return(true);
}
//---
return(false);
}
//+------------------------------------------------------------------+
//| Setting order expiration type for easy trade operations |
//+------------------------------------------------------------------+
bool CExpertTrade::SetOrderTypeTime(ENUM_ORDER_TYPE_TIME order_type_time)
{
if(m_symbol==NULL)
return(false);
//---
if(order_type_time==ORDER_TIME_SPECIFIED)
{
if((m_symbol.TradeTimeFlags()&SYMBOL_EXPIRATION_SPECIFIED)==0)
{
m_order_type_time =ORDER_TIME_GTC;
m_order_expiration=0;
return(false);
}
}
//---
m_order_type_time=order_type_time;
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Setting order expiration time for easy trade operations |
//+------------------------------------------------------------------+
bool CExpertTrade::SetOrderExpiration(datetime order_expiration)
{
if(m_symbol==NULL)
return(false);
//--- check expiration
if(order_expiration>=TimeCurrent()+60)
{
if(!SetOrderTypeTime(ORDER_TIME_SPECIFIED))
return(false);
m_order_expiration=order_expiration;
}
else
{
m_order_type_time=ORDER_TIME_GTC;
m_order_expiration=0;
}
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Easy LONG trade operation |
//+------------------------------------------------------------------+
bool CExpertTrade::Buy(double volume,double price,double sl,double tp,const string comment="")
{
double ask,stops_level;
//--- checking
if(m_symbol==NULL)
return(false);
string symbol=m_symbol.Name();
if(symbol=="")
return(false);
//---
ask=m_symbol.Ask();
stops_level=m_symbol.StopsLevel()*m_symbol.Point();
if(price!=0.0)
{
if(price>ask+stops_level)
{
//--- send "BUY_STOP" order
return(OrderOpen(symbol,ORDER_TYPE_BUY_STOP,volume,0.0,price,sl,tp,
m_order_type_time,m_order_expiration,comment));
}
if(price<ask-stops_level)
{
//--- send "BUY_LIMIT" order
return(OrderOpen(symbol,ORDER_TYPE_BUY_LIMIT,volume,0.0,price,sl,tp,
m_order_type_time,m_order_expiration,comment));
}
}
//---
return(PositionOpen(symbol,ORDER_TYPE_BUY,volume,ask,sl,tp,comment));
}
//+------------------------------------------------------------------+
//| Easy SHORT trade operation |
//+------------------------------------------------------------------+
bool CExpertTrade::Sell(double volume,double price,double sl,double tp,const string comment="")
{
double bid,stops_level;
//--- checking
if(m_symbol==NULL)
return(false);
string symbol=m_symbol.Name();
if(symbol=="")
return(false);
//---
bid=m_symbol.Bid();
stops_level=m_symbol.StopsLevel()*m_symbol.Point();
if(price!=0.0)
{
if(price>bid+stops_level)
{
//--- send "SELL_LIMIT" order
return(OrderOpen(symbol,ORDER_TYPE_SELL_LIMIT,volume,0.0,price,sl,tp,
m_order_type_time,m_order_expiration,comment));
}
if(price<bid-stops_level)
{
//--- send "SELL_STOP" order
return(OrderOpen(symbol,ORDER_TYPE_SELL_STOP,volume,0.0,price,sl,tp,
m_order_type_time,m_order_expiration,comment));
}
}
//---
return(PositionOpen(symbol,ORDER_TYPE_SELL,volume,bid,sl,tp,comment));
}
//+------------------------------------------------------------------+