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