//+------------------------------------------------------------------+ //| DashboardManager.mqh - Revolutionary AI Dashboard | //| Real-time trading dashboard with AI integration | //+------------------------------------------------------------------+ #include // Dashboard colors and styles #define COLOR_PROFIT C'32,133,66' #define COLOR_LOSS C'187,44,44' #define COLOR_NEUTRAL C'128,128,128' #define FONT_SIZE_NORMAL 10 #define FONT_SIZE_LARGE 12 class DashboardManager { private: string m_symbol; string m_fontName; int m_window; // Layout coordinates struct DashboardLayout { int x, y; int width, height; int margin; int rowHeight; } layout; // Real-time metrics struct DashboardMetrics { double dailyPnL; double totalBalance; double equity; int totalTrades; double winRate; double avgRR; double maxDrawdown; string aiSignal; double aiConfidence; string marketRegime; double riskExposure; string currentStrategy; } metrics; public: DashboardManager(string symbol) { m_symbol = symbol; m_fontName = "Consolas"; InitializeLayout(); m_window = 0; // Use main chart window for overlays } void Update() { UpdateMetrics(); DrawDashboard(); } // Update strategy display void UpdateStrategy(string strategy) { metrics.currentStrategy = strategy; Update(); } // Set symbol for dashboard void SetSymbol(string symbol) { m_symbol = symbol; } private: void InitializeLayout() { layout.x = 20; layout.y = 20; layout.width = 400; layout.height = 600; layout.margin = 10; layout.rowHeight = 25; } void DrawBackground() { string name = "dashboard_bg_" + m_symbol; ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, layout.x - 5); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, layout.y - 5); ObjectSetInteger(0, name, OBJPROP_XSIZE, layout.width + 10); ObjectSetInteger(0, name, OBJPROP_YSIZE, layout.height + 10); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, C'25,25,35'); ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT); ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, C'65,105,225'); ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); } void DrawStatusIndicator() { string name = "status_indicator_" + m_symbol; ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, layout.x + layout.width - 30); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, layout.y + 5); ObjectSetInteger(0, name, OBJPROP_XSIZE, 20); ObjectSetInteger(0, name, OBJPROP_YSIZE, 20); // Green = active, Red = inactive, Yellow = waiting color statusColor = (metrics.aiSignal != "N/A") ? COLOR_PROFIT : COLOR_LOSS; if (metrics.aiConfidence > 0 && metrics.aiConfidence < 0.7) statusColor = clrYellow; ObjectSetInteger(0, name, OBJPROP_BGCOLOR, statusColor); ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT); ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, clrBlack); } void UpdateMetrics() { metrics.dailyPnL = CalculateDailyPnL(); metrics.totalBalance = AccountInfoDouble(ACCOUNT_BALANCE); metrics.equity = AccountInfoDouble(ACCOUNT_EQUITY); metrics.winRate = CalculateWinRate(); metrics.avgRR = CalculateAverageRR(); metrics.maxDrawdown = CalculateMaxDrawdown(); metrics.riskExposure = CalculateRiskExposure(); // Mock AI data (in real implementation, this comes from server) metrics.aiSignal = "BUY"; metrics.aiConfidence = 0.85; metrics.marketRegime = "BULLISH"; } // Metric calculation functions (simplified for demo) double CalculateDailyPnL() { return 247.80; // Mock value } double CalculateWinRate() { return 0.73; // Mock value } double CalculateAverageRR() { return 2.1; // Mock value } double CalculateMaxDrawdown() { return -0.05; // Mock value } double CalculateRiskExposure() { return 0.08; // Mock value } void DrawDashboard() { int y = layout.y; // Draw background panel DrawBackground(); // Draw header DrawHeader("🚀 Revolutionary AI Trading Dashboard", y); y += layout.rowHeight * 2; // Current Strategy Display DrawSection("⚡ Active Strategy", y); y += layout.rowHeight; DrawMetric("Strategy", metrics.currentStrategy, y, true); y += layout.rowHeight * 2; // Account Overview DrawSection("💰 Account Overview", y); y += layout.rowHeight; DrawMetric("Balance", "$" + DoubleToString(metrics.totalBalance, 2), y, true); y += layout.rowHeight; DrawMetric("Equity", "$" + DoubleToString(metrics.equity, 2), y, metrics.equity >= metrics.totalBalance); y += layout.rowHeight; DrawMetric("Daily P&L", "$" + DoubleToString(metrics.dailyPnL, 2), y, metrics.dailyPnL >= 0); y += layout.rowHeight * 2; // Performance metrics DrawSection("📊 Performance", y); y += layout.rowHeight; DrawMetric("Total Trades", IntegerToString(metrics.totalTrades), y, true); y += layout.rowHeight; DrawMetric("Win Rate", DoubleToString(metrics.winRate * 100, 1) + "%", y, metrics.winRate >= 0.5); y += layout.rowHeight; DrawMetric("Avg R:R", DoubleToString(metrics.avgRR, 2), y, metrics.avgRR >= 1.5); y += layout.rowHeight * 2; // AI Analysis DrawSection("🧠 AI Analysis", y); y += layout.rowHeight; DrawMetric("Signal", metrics.aiSignal, y, metrics.aiSignal == "BUY"); y += layout.rowHeight; DrawMetric("Confidence", DoubleToString(metrics.aiConfidence * 100, 1) + "%", y, metrics.aiConfidence >= 0.7); y += layout.rowHeight; DrawMetric("Market Regime", metrics.marketRegime, y, true); y += layout.rowHeight * 2; // Risk Metrics DrawSection("🛡️ Risk Management", y); y += layout.rowHeight; DrawMetric("Risk Exposure", DoubleToString(metrics.riskExposure * 100, 1) + "%", y, metrics.riskExposure <= 0.15); y += layout.rowHeight; DrawMetric("Max Drawdown", DoubleToString(metrics.maxDrawdown * 100, 1) + "%", y, metrics.maxDrawdown >= -0.1); // Status indicator DrawStatusIndicator(); } void DrawHeader(string text, int &y) { string name = "header_" + m_symbol; ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetString(0, name, OBJPROP_FONT, m_fontName); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, FONT_SIZE_LARGE); ObjectSetInteger(0, name, OBJPROP_COLOR, clrWhite); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, layout.x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); } void DrawSection(string text, int &y) { string name = "section_" + text + "_" + m_symbol; ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetString(0, name, OBJPROP_FONT, m_fontName); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, FONT_SIZE_NORMAL); ObjectSetInteger(0, name, OBJPROP_COLOR, COLOR_NEUTRAL); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, layout.x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); } void DrawMetric(string label, string value, int &y, bool positive) { string nameLbl = "metric_" + label + "_label_" + m_symbol; string nameVal = "metric_" + label + "_value_" + m_symbol; // Draw label ObjectCreate(0, nameLbl, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, nameLbl, OBJPROP_TEXT, label + ":"); ObjectSetString(0, nameLbl, OBJPROP_FONT, m_fontName); ObjectSetInteger(0, nameLbl, OBJPROP_FONTSIZE, FONT_SIZE_NORMAL); ObjectSetInteger(0, nameLbl, OBJPROP_COLOR, COLOR_NEUTRAL); ObjectSetInteger(0, nameLbl, OBJPROP_XDISTANCE, layout.x); ObjectSetInteger(0, nameLbl, OBJPROP_YDISTANCE, y); // Draw value ObjectCreate(0, nameVal, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, nameVal, OBJPROP_TEXT, value); ObjectSetString(0, nameVal, OBJPROP_FONT, m_fontName); ObjectSetInteger(0, nameVal, OBJPROP_FONTSIZE, FONT_SIZE_NORMAL); ObjectSetInteger(0, nameVal, OBJPROP_COLOR, positive ? COLOR_PROFIT : COLOR_LOSS); ObjectSetInteger(0, nameVal, OBJPROP_XDISTANCE, layout.x + 150); ObjectSetInteger(0, nameVal, OBJPROP_YDISTANCE, y); } };