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