244 lines
9.2 KiB
MQL5
244 lines
9.2 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| DashboardManager.mqh - Revolutionary AI Dashboard |
|
||
|
//| Real-time trading dashboard with AI integration |
|
||
|
//+------------------------------------------------------------------+
|
||
|
#include <Utils/JAson.mqh>
|
||
|
|
||
|
// 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);
|
||
|
}
|
||
|
};
|