Pie Chart Profit By Day

Author: Copyright © 2021, Vladimir Karputov
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Pie Chart Profit By Day
ÿþ//+------------------------------------------------------------------+

//|                                      Pie Chart Profit By Day.mq5 |

//|                              Copyright © 2021, Vladimir Karputov |

//|                      https://www.mql5.com/en/users/barabashkakvn |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2021, Vladimir Karputov"

#property link      "https://www.mql5.com/en/users/barabashkakvn"

#property version   "1.000"

#property description "Based on 'Simple Profit By Periods Panel 2'"

//---

#include <Canvas\Charts\PieChart.mqh>

CPieChart      m_pie_chart_loss;             // object of CPieChart class

CPieChart      m_pie_chart_profit;           // object of CPieChart class

//--- input parameters

input group    "Loss"

input int         InpLossX       = 50;       // X-axis distance

input int         InpLossY       = 50;       // Y-axis distance

input int         InpLossWidth   = 400;      // Width

input int         InpLossHeight  = 450;      // Height

input group    "Profit"

input int         InpProfitX     = 500;      // X-axis distance

input int         InpProfitY     = 50;       // Y-axis distance

input int         InpProfitWidth = 400;      // Width

input int         InpProfitHeight= 450;      // Height

//---

bool     m_init_error            = false;    // error on InInit

//+------------------------------------------------------------------+

//| Structure Profit                                                 |

//+------------------------------------------------------------------+

struct STRUCT_PROFIT

  {

   string            symbol;                 // symbol

   double            profit;                 // profit

   //--- Constructor

                     STRUCT_PROFIT()

     {

      symbol                     = "-";

      profit                     = 0.0;

     }

  };

STRUCT_PROFIT SLoss[];

STRUCT_PROFIT SProfit[];

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

   ArrayFree(SLoss);

   ArrayFree(SProfit);

//--- check

   if(InpLossWidth<=0 || InpLossHeight<=0)

     {

      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?

                      "'Width' 8;8 'Height' =5 <>65B 1KBL <= 0!":

                      "'Width' or 'Height' cannot be <= 0!";

      if(MQLInfoInteger(MQL_TESTER)) // when testing, we will only output to the log about incorrect input parameters

         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);

      else // if the Expert Advisor is run on the chart, tell the user about the error

         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);

      //---

      m_init_error=true;

      return(INIT_SUCCEEDED);

     }

   if(InpProfitWidth<=0 || InpProfitHeight<=0)

     {

      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?

                      "'Width' 8;8 'Height' =5 <>65B 1KBL <= 0!":

                      "'Width' or 'Height' cannot be <= 0!";

      if(MQLInfoInteger(MQL_TESTER)) // when testing, we will only output to the log about incorrect input parameters

         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);

      else // if the Expert Advisor is run on the chart, tell the user about the error

         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);

      //---

      m_init_error=true;

      return(INIT_SUCCEEDED);

     }

//--- create charts

   if(!m_pie_chart_loss.CreateBitmapLabel("Pie Chart Loss",InpLossX,InpLossY,InpLossWidth,InpLossHeight))

     {

      Print("Error creating pie chart: ",GetLastError());

      m_init_error=true;

      return(INIT_SUCCEEDED);

     }

   m_pie_chart_profit.ShowPercent();

   if(!m_pie_chart_profit.CreateBitmapLabel("Pie Chart Profit",InpProfitX,InpProfitY,InpProfitWidth,InpProfitHeight))

     {

      Print("Error creating pie chart: ",GetLastError());

      m_init_error=true;

      return(INIT_SUCCEEDED);

     }

   m_pie_chart_loss.ShowValue();

   m_pie_chart_profit.ShowValue();

//---

   ProfitForDay();

//+------------------------------------------------------------------+

//--- Loss

   uint size_struct_loss=ArraySize(SLoss);

   uint size_pie_chart_loss=m_pie_chart_loss.DataTotal();

//--- add

   for(uint i=0; i<size_struct_loss; i++)

      m_pie_chart_loss.ValueAdd(SLoss[i].profit,"loss "+SLoss[i].symbol);

//+------------------------------------------------------------------+

//--- Profit

   uint size_struct_profit=ArraySize(SProfit);

   uint size_pie_chart_profit=m_pie_chart_profit.DataTotal();

//--- add

   for(uint i=0; i<size_struct_profit; i++)

      m_pie_chart_profit.ValueAdd(SProfit[i].profit,"profit "+SProfit[i].symbol);

//--- create timer

   EventSetTimer(3);

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//--- destroy timer

   EventKillTimer();

//---

   m_pie_chart_loss.Destroy();

   m_pie_chart_profit.Destroy();

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   if(m_init_error)

      return;

//---

  }

//+------------------------------------------------------------------+

//| Timer function                                                   |

//+------------------------------------------------------------------+

void OnTimer()

  {

   if(m_init_error)

      return;

//---

   ProfitForDay();

//+------------------------------------------------------------------+

//--- Loss

   int size_struct_loss=ArraySize(SLoss);

   int size_pie_chart_loss=(int)m_pie_chart_loss.DataTotal();

//--- delete

   for(int i=size_pie_chart_loss-1; i>=0; i--)

      m_pie_chart_loss.ValueDelete(i);

   size_pie_chart_loss=(int)m_pie_chart_loss.DataTotal();

//--- update

   for(int i=0; i<size_struct_loss; i++)

      m_pie_chart_loss.ValueAdd(SLoss[i].profit,"loss "+SLoss[i].symbol);

//+------------------------------------------------------------------+

//--- Profit

   int size_struct_profit=ArraySize(SProfit);

   int size_pie_chart_profit=(int)m_pie_chart_profit.DataTotal();

//--- delete

   for(int i=size_pie_chart_profit-1; i>=0; i--)

      m_pie_chart_profit.ValueDelete(i);

   size_pie_chart_profit=(int)m_pie_chart_profit.DataTotal();

//--- update

   for(int i=0; i<size_struct_profit; i++)

      m_pie_chart_profit.ValueAdd(SProfit[i].profit,"profit "+SProfit[i].symbol);

  }

//+------------------------------------------------------------------+

//| Profit for the period                                            |

//+------------------------------------------------------------------+

void ProfitForDay(void)

  {

   ArrayFree(SLoss);

   ArrayFree(SProfit);

//---

   datetime time_trade_server = TimeTradeServer();

   datetime from_date         = time_trade_server;

   datetime to_date           = time_trade_server+60*60*24*3;  // to the future ...

   MqlDateTime STime;

   TimeToStruct(time_trade_server,STime);

   STime.hour=0;

   STime.min=0;

   STime.sec=0;

   from_date=StructToTime(STime);           // start time of the last day (Monday to Friday)

//--- request trade history

   HistorySelect(from_date,to_date);

//---

   uint     total=HistoryDealsTotal();

   ulong    ticket=0;

//--- for all deals

   for(uint i=0; i<total; i++) // for(uint i=0;i<total;i++) => i #0 - 2016, i #1045 - 2017

     {

      //--- try to get deals ticket

      if((ticket=HistoryDealGetTicket(i))>0)

        {

         //--- get deals properties

         long     deal_time         = HistoryDealGetInteger(ticket,DEAL_TIME);

         long     deal_type         = HistoryDealGetInteger(ticket,DEAL_TYPE);

         long     deal_entry        = HistoryDealGetInteger(ticket,DEAL_ENTRY);

         double   deal_commission   = HistoryDealGetDouble(ticket,DEAL_COMMISSION);

         double   deal_swap         = HistoryDealGetDouble(ticket,DEAL_SWAP);

         double   deal_profit       = HistoryDealGetDouble(ticket,DEAL_PROFIT);

         string   deal_symbol       = HistoryDealGetString(ticket,DEAL_SYMBOL);

         //--- only for current symbol and magic

         if((ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_BUY || (ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_SELL)

           {

            double profit=deal_commission+deal_swap+deal_profit;

            bool find=false;

            if(profit<0.0)

              {

               uint size_struct=ArraySize(SLoss);

               for(uint j=0; j<size_struct; j++)

                 {

                  if(SLoss[j].symbol==deal_symbol)

                    {

                     SLoss[j].profit=SLoss[j].profit+MathAbs(profit);

                     find=true;

                     break;

                    }

                 }

               if(!find)

                 {

                  ArrayResize(SLoss,size_struct+1);

                  SLoss[size_struct].symbol=deal_symbol;

                  SLoss[size_struct].profit=MathAbs(profit);

                 }

              }

            else

              {

               if(profit>0.0)

                 {

                  uint size_struct=ArraySize(SProfit);

                  for(uint j=0; j<size_struct; j++)

                    {

                     if(SProfit[j].symbol==deal_symbol)

                       {

                        SProfit[j].profit=SProfit[j].profit+profit;

                        find=true;

                        break;

                       }

                    }

                  if(!find)

                    {

                     ArrayResize(SProfit,size_struct+1);

                     SProfit[size_struct].symbol=deal_symbol;

                     SProfit[size_struct].profit=profit;

                    }

                 }

              }

           }

        }

     }

//---

   return;

  }

//+------------------------------------------------------------------+

Comments