87 lines
3.4 KiB
MQL5
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;}
| |||
};
| |||
//+------------------------------------------------------------------+
|