mql5/Include/MasterOfPuppetsLib/Trader.mq5
MasterOfPuppets fe8658ad28 use IModifier
2026-03-12 12:12:59 +03:00

176 lines
7.3 KiB
MQL5

//+------------------------------------------------------------------+
//| 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 <MasterOfPuppetsLib\Trader.mqh>
#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
//+------------------------------------------------------------------+