//+------------------------------------------------------------------+ //| ExpertTrade.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include #include #include #include #include //+------------------------------------------------------------------+ //| 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(pricebid+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