//+------------------------------------------------------------------+ //| Trader.mq5 | //| Copyright 2026, MasterOfPuppets | //| https://forge.mql5.io/masterofpuppets/mql5 | //+------------------------------------------------------------------+ #ifndef MASTER_OF_PUPPETS_LIB_TRADER_MQ5 #define MASTER_OF_PUPPETS_LIB_TRADER_MQ5 #include #property copyright "Copyright 2026, MasterOfPuppets" #property link "https://forge.mql5.io/masterofpuppets/mql5" //+------------------------------------------------------------------+ //| Trader initialization function | //+------------------------------------------------------------------+ void Trader::Init(const TradeContext *srcTradeContext, const TraderContext *srcTraderContext) { m_tradeContext = srcTradeContext; m_traderContext = srcTraderContext; } //+------------------------------------------------------------------+ //| Log function | //+------------------------------------------------------------------+ void Trader::Log(const string message) const { Print(message); PlaySoundFile(m_traderContext.GetSoundEnabled(), m_traderContext.GetSoundFileName()); } //+------------------------------------------------------------------+ //| Delete orders function | //+------------------------------------------------------------------+ void Trader::DeleteOrders(const string message, const bool allOrders) const { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(m_tradeContext.GetOrderInfo().SelectByIndex(i)) { if(allOrders || (m_tradeContext.GetOrderInfo().Magic() == m_traderContext.GetMagic())) { m_tradeContext.GetTrade().OrderDelete(m_tradeContext.GetOrderInfo().Ticket()); } } } Log(message); } //+------------------------------------------------------------------+ //| Modify function | //+------------------------------------------------------------------+ void Trader::Modify(const string message, const IModifier* modifier) const { ModifyPositions(modifier); Log(message); } //+------------------------------------------------------------------+ //| Modify positions function | //+------------------------------------------------------------------+ void Trader::ModifyPositions(const IModifier* modifier) const { for(int i = PositionsTotal() - 1; i >= 0; i--) { if(m_tradeContext.GetPositionInfo().SelectByIndex(i)) { modifier.Modify(); } } } //+------------------------------------------------------------------+ //| Order open function | //+------------------------------------------------------------------+ void Trader::OrderOpen(const string message, const TradeAction tradeAction) const { ENUM_ORDER_TYPE orderType; double price; double deltaStopLoss; double deltaTakeProfit; m_tradeContext.GetSymbolInfo().RefreshRates(); switch(tradeAction) { case TradeAction::TRADE_ACTION_BUY_LIMIT: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_BUY_LIMIT; price = m_tradeContext.GetSymbolInfo().Ask() - m_traderContext.GetStopLoss(); deltaStopLoss = -m_traderContext.GetStopLoss(); deltaTakeProfit = m_traderContext.GetTakeProfit(); break; case TradeAction::TRADE_ACTION_BUY_STOP: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_BUY_STOP; price = m_tradeContext.GetSymbolInfo().Ask() + m_traderContext.GetStopLoss(); deltaStopLoss = -m_traderContext.GetStopLoss(); deltaTakeProfit = m_traderContext.GetTakeProfit(); break; case TradeAction::TRADE_ACTION_SELL_LIMIT: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_SELL_LIMIT; price = m_tradeContext.GetSymbolInfo().Bid() + m_traderContext.GetStopLoss(); deltaStopLoss = m_traderContext.GetStopLoss(); deltaTakeProfit = -m_traderContext.GetTakeProfit(); break; case TradeAction::TRADE_ACTION_SELL_STOP: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_SELL_STOP; price = m_tradeContext.GetSymbolInfo().Bid() - m_traderContext.GetStopLoss(); deltaStopLoss = m_traderContext.GetStopLoss(); deltaTakeProfit = -m_traderContext.GetTakeProfit(); break; default: return; } double stopLoss = IsZero(m_traderContext.GetStopLoss()) ? 0.0 : m_tradeContext.GetSymbolInfo().NormalizePrice(price + deltaStopLoss); double takeProfit = IsZero(m_traderContext.GetTakeProfit()) ? 0.0 : m_tradeContext.GetSymbolInfo().NormalizePrice(price + deltaTakeProfit); m_tradeContext.GetTrade().OrderOpen( _Symbol, orderType, m_traderContext.GetContracts(), price, price, stopLoss, takeProfit); Log(message); } //+------------------------------------------------------------------+ //| Position open function | //+------------------------------------------------------------------+ void Trader::PositionOpen(const string message, const TradeAction tradeAction) { ENUM_ORDER_TYPE orderType; double price; double deltaStopLoss; double deltaTakeProfit; m_tradeContext.GetSymbolInfo().RefreshRates(); switch(tradeAction) { case TradeAction::TRADE_ACTION_BUY: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_BUY; price = m_tradeContext.GetSymbolInfo().Ask(); m_buyPyramidPriceOpen = price; deltaStopLoss = -m_traderContext.GetStopLoss(); deltaTakeProfit = m_traderContext.GetTakeProfit(); break; case TradeAction::TRADE_ACTION_SELL: orderType = ENUM_ORDER_TYPE::ORDER_TYPE_SELL; price = m_tradeContext.GetSymbolInfo().Bid(); m_sellPyramidPriceOpen = price; deltaStopLoss = m_traderContext.GetStopLoss(); deltaTakeProfit = -m_traderContext.GetTakeProfit(); break; default: return; } double stopLoss = IsZero(m_traderContext.GetStopLoss()) ? 0.0 : m_tradeContext.GetSymbolInfo().NormalizePrice(price + deltaStopLoss); double takeProfit = IsZero(m_traderContext.GetTakeProfit()) ? 0.0 : m_tradeContext.GetSymbolInfo().NormalizePrice(price + deltaTakeProfit); m_tradeContext.GetTrade().PositionOpen( _Symbol, orderType, m_traderContext.GetContracts(), price, stopLoss, takeProfit); Log(message); } //+------------------------------------------------------------------+ //| Get buy pyramid price open function | //+------------------------------------------------------------------+ const double Trader::GetBuyPyramidPriceOpen() const { return m_buyPyramidPriceOpen; } //+------------------------------------------------------------------+ //| Get sell pyramid price open function | //+------------------------------------------------------------------+ const double Trader::GetSellPyramidPriceOpen() const { return m_sellPyramidPriceOpen; } #endif //+------------------------------------------------------------------+