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));
| |||
}
| |||
//+------------------------------------------------------------------+
|