//+------------------------------------------------------------------+ //| TradeExecutor.mqh | //| Copyright 2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #include "ITradeExecutor.mqh" #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CTradeExecutor final: public ITradeExecutor { private: CTradeHedge m_trade; CTrade trade; public: CTradeExecutor() {} ~CTradeExecutor() {} void SetDeviation(ulong deviation) { m_trade.Deviation(deviation); trade.Deviation(deviation); } void SetMagic(ulong magic) { m_trade.MagicNumber(magic); trade.MagicNumber(magic); } virtual ulong PlaceMarketOrder(const MarketOrderRequest &req) override { if(req.magic != 0) m_trade.MagicNumber(req.magic); if(req.direction == 1) return m_trade.Buy(req.symbol, req.volume, req.sl, req.tp, req.comment); else return m_trade.Sell(req.symbol, req.volume, req.sl, req.tp, req.comment); } virtual ulong PlacePendingOrder(const PendingOrderRequest &req) override { if(req.magic != 0) m_trade.MagicNumber(req.magic); // map enum to CTradeHedge methods (BuyStop, SellStop, etc.) // CTradeHedge doesn’t have pending methods; use CTrade instead. // For simplicity, we’ll call CTrade directly (you may extend CTradeHedge). // Here we assume CTrade is available. if(req.magic != 0) m_trade.MagicNumber(req.magic); ulong ticket = 0; switch(req.type) { case ORDER_TYPE_BUY_STOP: ticket = trade.BuyStop(req.symbol, req.volume, req.price, req.sl, req.tp, req.expiration, req.comment) ? trade.result.order : 0; break; case ORDER_TYPE_SELL_STOP: ticket = trade.SellStop(req.symbol, req.volume, req.price, req.sl, req.tp, req.expiration, req.comment) ? trade.result.order : 0; break; case ORDER_TYPE_BUY_LIMIT: ticket = trade.BuyLimit(req.symbol, req.volume, req.price, req.sl, req.tp, req.expiration, req.comment) ? trade.result.order : 0; break; case ORDER_TYPE_SELL_LIMIT: ticket = trade.SellLimit(req.symbol, req.volume, req.price, req.sl, req.tp, req.expiration, req.comment) ? trade.result.order : 0; break; default: ticket = 0; } return ticket; } virtual bool ModifyPosition(ulong ticket, double sl, double tp) {return false;} virtual bool ClosePosition(ulong ticket, double volume = 0) {return m_trade.Close(ticket);} virtual bool DeleteOrder(ulong ticket) {return false;} }; //+------------------------------------------------------------------+