mql5/Experts/_Architecture/Trade/TradeExecutor.mqh
younglubah-gmail e8a2e2d6d1
2026-08-14 16:19:56 +02:00

87 lines
3.4 KiB
MQL5

//+------------------------------------------------------------------+
//| 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 <Mql5Book\TradeHedge.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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;}
};
//+------------------------------------------------------------------+