mql5/Include/MasterOfPuppetsLib/Reporter.mq5
2026-03-10 03:06:35 +03:00

120 lines
4.1 KiB
MQL5

//+------------------------------------------------------------------+
//| Reporter.mq5 |
//| Copyright 2026, MasterOfPuppets |
//| https://forge.mql5.io/masterofpuppets/mql5 |
//+------------------------------------------------------------------+
#ifndef MASTER_OF_PUPPETS_LIB_REPORTER_MQ5
#define MASTER_OF_PUPPETS_LIB_REPORTER_MQ5
#include <MasterOfPuppetsLib\Reporter.mqh>
#include <MasterOfPuppetsLib\Utils.mqh>
#property copyright "Copyright 2026, MasterOfPuppets"
#property link "https://forge.mql5.io/masterofpuppets/mql5"
//+------------------------------------------------------------------+
//| Reporter initialization function |
//+------------------------------------------------------------------+
void Reporter::Init(CDealInfo *srcDealInfo, const int srcLastProfitsSize)
{
m_dealInfo = srcDealInfo;
m_lastProfitsSize = srcLastProfitsSize;
}
//+------------------------------------------------------------------+
//| Calculate total last profit function |
//+------------------------------------------------------------------+
void Reporter::CalculateTotalLastProfit()
{
for(int i = 0; i < m_lastProfits.Total(); i++)
{
LastProfit *lastProfit = m_lastProfits.At(i);
m_totalLastProfit += lastProfit.profit;
}
}
//+------------------------------------------------------------------+
//| Get message function |
//+------------------------------------------------------------------+
const string Reporter::GetMessage(const ENUM_DEAL_TYPE enumDealType) const
{
switch(enumDealType)
{
case ENUM_DEAL_TYPE::DEAL_TYPE_BUY:
return MESSAGE_SELL;
case ENUM_DEAL_TYPE::DEAL_TYPE_SELL:
return MESSAGE_BUY;
}
return "";
}
//+------------------------------------------------------------------+
//| Get suffix function |
//+------------------------------------------------------------------+
const string Reporter::GetSuffix(const long dealReason) const
{
if(dealReason == DEAL_REASON_SL)
{
return "(stop loss) ";
}
if(dealReason == DEAL_REASON_TP)
{
return "(take profit) ";
}
return "";
}
//+------------------------------------------------------------------+
//| Last profits initialization function |
//+------------------------------------------------------------------+
void Reporter::InitLastProfits()
{
m_lastProfits.Clear();
m_totalLastProfit = 0.0;
datetime now = TimeCurrent();
datetime yesterday = now - 86400; // PERIOD_D1 * 60
HistorySelect(yesterday, now);
int lastProfitIndex = 0;
for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
{
if(!m_dealInfo.SelectByIndex(i))
{
continue;
}
if(m_dealInfo.Entry() == DEAL_ENTRY_IN)
{
continue;
}
if(lastProfitIndex >= m_lastProfitsSize)
{
break;
}
double dealProfit = m_dealInfo.Profit();
long dealReason = HistoryDealGetInteger(m_dealInfo.Ticket(), DEAL_REASON);
if(IsStandardDealReason((int) dealReason))
{
m_lastProfits.Add(new LastProfit(GetMessage(m_dealInfo.DealType()), dealProfit, GetSuffix(dealReason)));
lastProfitIndex++;
}
}
CalculateTotalLastProfit();
}
//+------------------------------------------------------------------+
//| Get last profits function |
//+------------------------------------------------------------------+
const CArrayObj* Reporter::GetLastProfits() const
{
return GetPointer(m_lastProfits);
}
//+------------------------------------------------------------------+
//| Get total last profit function |
//+------------------------------------------------------------------+
const double Reporter::GetTotalLastProfit() const
{
return m_totalLastProfit;
}
#endif
//+------------------------------------------------------------------+