//+------------------------------------------------------------------+ //| Informative dashboard.mqh | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include #include #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CInformativeDashboard: public CAppDialog { protected: virtual bool OnEvent(const int id,const long& lparam,const double& dparam,const string& sparam); //Very important function inheritance CLabel account_name; CLabel daily_pl; CLabel percent_dd; CLabel pos_orders; CLabel spread; CLabel account_name_value; CLabel daily_pl_value; CLabel percent_dd_value; CLabel pos_orders_value; CLabel spread_value; bool CreateLabel(CLabel &label, int x, int y, int width, string label_name, string text); public: CInformativeDashboard(void); ~CInformativeDashboard(void); bool CreateDashboard(string name, int x1, int y1, int x2, int y2); virtual bool Run() { return CAppDialog::Run(); } void RefreshValues(void); }; EVENT_MAP_BEGIN(CInformativeDashboard) EVENT_MAP_END(CAppDialog) //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CInformativeDashboard::CInformativeDashboard(void) { m_chart_id = 0; m_subwin = 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CInformativeDashboard::CreateDashboard(string name,int x1,int y1,int x2,int y2) { if (!Create(m_chart_id, name, m_subwin, x1, y1, x2, y2)) { Print("Failed to create dashboard Err=",GetLastError()); return false; } int width = 10; //--- Label names CreateLabel(account_name, 20, 20, width, "ac_name", "AC Name :"); account_name.Color(clrDodgerBlue); CreateLabel(daily_pl, 20, 40, width, "daily_pl", "Daily PL :"); CreateLabel(percent_dd, 20, 60, width, "percent_dd", "% Drawdown :"); CreateLabel(pos_orders, 20, 80, width, "pos_order", "Pos & Orders :"); CreateLabel(spread, 20, 100, width, "spread", "Spread : "); //--- Label values string ac_name = AccountInfoString(ACCOUNT_NAME); CreateLabel(account_name_value, 100, 20, width, "ac_name_value", ac_name); account_name_value.Color(clrDodgerBlue); CreateLabel(daily_pl_value, 100, 40, width, "daily_pl_value", "0.0"); CreateLabel(percent_dd_value, 110, 60, width, "percent_dd_value", "0.0"); CreateLabel(pos_orders_value, 110, 80, width, "pos_order_value", "0"); CreateLabel(spread_value, 80, 100, width, "spread_value", "0"); ChartRedraw(m_chart_id); return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CInformativeDashboard::~CInformativeDashboard(void) { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CInformativeDashboard::CreateLabel(CLabel &label,int x,int y,int width,string label_name,string text) { if (!label.Create(m_chart_id, m_name + label_name, m_subwin, x, y, x, y + width)) return false; if (!Add(label)) return false; if (!label.Text(text)) return false; return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CInformativeDashboard::RefreshValues(void) { daily_pl_value.Text(DoubleToString(DailyPL(), 3)); double daily_pl_var = DailyPL(); if (daily_pl_var<0) //we made losses daily_pl_value.Color(clrRed); else { daily_pl_value.Color(clrDodgerBlue); } double dd_percent = (AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE))/AccountInfoDouble(ACCOUNT_BALANCE); percent_dd_value.Text(DoubleToString(dd_percent*100, 3)); pos_orders_value.Text(string(OrdersTotal()+ PositionsTotal())); int market_spread = (int)SymbolInfoInteger(Symbol(), SYMBOL_SPREAD); spread_value.Text(string(market_spread)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double DailyPL() { double dayprof = 0.0; datetime end = TimeCurrent(); string sdate = TimeToString (TimeCurrent(), TIME_DATE); datetime start = StringToTime(sdate); HistorySelect(start, end); int TotalDeals = HistoryDealsTotal(); for(int i = 0; i < TotalDeals; i++) { ulong Ticket = HistoryDealGetTicket(i); if(HistoryDealGetInteger(Ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT) { double LatestProfit = HistoryDealGetDouble(Ticket, DEAL_PROFIT); dayprof += LatestProfit; } } return dayprof; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+