Files
EA/Buffer EA/Include/UIManager.mqh
Kunthawat Greethong 04aa2eb2e6 New EA and Indi
2026-01-25 10:34:54 +07:00

430 lines
15 KiB
Plaintext

//+------------------------------------------------------------------+
//| UIManager.mqh |
//| Universal Buffer Reader EA v2.0 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025"
#property link ""
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| CUIManager - Manages chart labels and manual mode UI |
//+------------------------------------------------------------------+
class CUIManager
{
private:
long m_chart_id;
bool m_manual_mode;
int m_magic_number;
string m_symbol;
double m_accumulated_loss;
double m_loss_percent;
double m_high_loss_threshold;
// Logging
bool m_enable_debug;
public:
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CUIManager()
{
m_chart_id = 0;
m_manual_mode = false;
m_magic_number = 0;
m_symbol = "";
m_accumulated_loss = 0;
m_loss_percent = 0;
m_high_loss_threshold = 0;
m_enable_debug = false;
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
~CUIManager()
{
DeleteUI();
}
//+------------------------------------------------------------------+
//| Set parameters |
//+------------------------------------------------------------------+
void SetParameters(
long chart_id,
bool manual_mode,
int magic_number,
string symbol,
double high_loss_threshold,
bool enable_debug = false
)
{
// Validate parameters
if(chart_id == 0)
{
Print("[ERROR] Invalid chart ID: 0");
}
m_chart_id = chart_id;
if(magic_number <= 0)
{
Print("[ERROR] Invalid magic number: ", magic_number, ". Using default 24680");
m_magic_number = 24680;
}
else
{
m_magic_number = magic_number;
}
if(symbol == "")
{
Print("[ERROR] Invalid symbol: empty string");
}
m_symbol = symbol;
if(high_loss_threshold < 0)
{
Print("[ERROR] Invalid high loss threshold: ", high_loss_threshold, ". Using 0");
m_high_loss_threshold = 0;
}
else
{
m_high_loss_threshold = high_loss_threshold;
}
m_manual_mode = manual_mode;
m_enable_debug = enable_debug;
if(m_enable_debug)
{
Print("[UIManager] Parameters set:");
Print(" Chart ID: ", m_chart_id);
Print(" Manual mode: ", m_manual_mode);
Print(" Magic number: ", m_magic_number);
Print(" Symbol: ", m_symbol);
Print(" High loss threshold: ", m_high_loss_threshold, "%");
}
}
//+------------------------------------------------------------------+
//| Set debug mode |
//+------------------------------------------------------------------+
void SetDebugMode(bool enable_debug)
{
m_enable_debug = enable_debug;
}
//+------------------------------------------------------------------+
//| Create UI elements |
//+------------------------------------------------------------------+
void CreateUI()
{
if(m_enable_debug)
{
Print("[UIManager] Creating UI elements...");
}
if(m_chart_id == 0)
{
Print("[ERROR] Cannot create UI: Chart ID is 0");
return;
}
CreateLossLabels();
if(m_manual_mode)
{
CreateManualModeControls();
}
if(m_enable_debug)
{
Print("[UIManager] UI elements created successfully");
}
}
//+------------------------------------------------------------------+
//| Delete UI elements |
//+------------------------------------------------------------------+
void DeleteUI()
{
if(m_enable_debug)
{
Print("[UIManager] Deleting UI elements...");
}
int deleted_count = 0;
if(ObjectDelete(m_chart_id, "AccumLossLabel")) deleted_count++;
if(ObjectDelete(m_chart_id, "AccumLossPercentLabel")) deleted_count++;
if(m_manual_mode)
{
if(ObjectDelete(m_chart_id, "ManualTPLabel")) deleted_count++;
if(ObjectDelete(m_chart_id, "ManualTPEdit")) deleted_count++;
if(ObjectDelete(m_chart_id, "ManualSLLabel")) deleted_count++;
if(ObjectDelete(m_chart_id, "ManualSLEdit")) deleted_count++;
if(ObjectDelete(m_chart_id, "ManualTradeButton")) deleted_count++;
}
if(m_enable_debug)
{
Print("[UIManager] Deleted ", deleted_count, " UI elements");
}
}
//+------------------------------------------------------------------+
//| Update loss display |
//+------------------------------------------------------------------+
void UpdateLossDisplay(double accumulated_loss, double loss_percent)
{
m_accumulated_loss = accumulated_loss;
m_loss_percent = loss_percent;
// Validate inputs
if(accumulated_loss < 0)
{
Print("[WARNING] Invalid accumulated loss: ", accumulated_loss, ". Using 0");
accumulated_loss = 0;
}
if(loss_percent < 0)
{
Print("[WARNING] Invalid loss percent: ", loss_percent, "%. Using 0%");
loss_percent = 0;
}
string loss_text = "Accum. Loss: " + DoubleToString(accumulated_loss, 2);
string percent_text = "Loss % of Bal: " + DoubleToString(loss_percent, 2) + "%";
color label_color = clrWhite;
bool is_high_loss = false;
if(m_high_loss_threshold > 0 && loss_percent >= m_high_loss_threshold)
{
label_color = clrOrangeRed;
is_high_loss = true;
}
// Update labels
ObjectSetString(m_chart_id, "AccumLossLabel", OBJPROP_TEXT, loss_text);
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_COLOR, label_color);
ObjectSetString(m_chart_id, "AccumLossPercentLabel", OBJPROP_TEXT, percent_text);
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_COLOR, label_color);
if(m_enable_debug)
{
Print("[UIManager] Loss display updated: ", loss_text, ", ", percent_text,
(is_high_loss ? " [HIGH LOSS WARNING]" : ""));
}
}
//+------------------------------------------------------------------+
//| Update manual mode UI |
//+------------------------------------------------------------------+
void UpdateManualModeUI()
{
// Update any dynamic manual mode elements if needed
}
//+------------------------------------------------------------------+
//| Get manual TP from UI |
//+------------------------------------------------------------------+
double GetManualTP()
{
if(!m_manual_mode)
{
if(m_enable_debug)
{
Print("[UIManager] Manual mode not enabled, returning TP = 0");
}
return 0;
}
string tp_str = ObjectGetString(m_chart_id, "ManualTPEdit", OBJPROP_TEXT);
double tp_value = StringToDouble(tp_str);
if(m_enable_debug)
{
Print("[UIManager] Manual TP: ", tp_value);
}
return tp_value;
}
//+------------------------------------------------------------------+
//| Get manual SL from UI |
//+------------------------------------------------------------------+
double GetManualSL()
{
if(!m_manual_mode)
{
if(m_enable_debug)
{
Print("[UIManager] Manual mode not enabled, returning SL = 0");
}
return 0;
}
string sl_str = ObjectGetString(m_chart_id, "ManualSLEdit", OBJPROP_TEXT);
double sl_value = StringToDouble(sl_str);
if(m_enable_debug)
{
Print("[UIManager] Manual SL: ", sl_value);
}
return sl_value;
}
//+------------------------------------------------------------------+
//| Check if manual trade button was clicked |
//+------------------------------------------------------------------+
bool IsManualTradeButtonClicked()
{
if(!m_manual_mode) return false;
// This will be checked in OnChartEvent
return false;
}
private:
//+------------------------------------------------------------------+
//| Create loss display labels |
//+------------------------------------------------------------------+
void CreateLossLabels()
{
if(m_enable_debug)
{
Print("[UIManager] Creating loss display labels...");
}
// Accumulated Loss Label
if(!ObjectCreate(m_chart_id, "AccumLossLabel", OBJ_LABEL, 0, 0, 0))
{
Print("[ERROR] Failed to create AccumLossLabel. Error: ", GetLastError());
}
else
{
ObjectSetString(m_chart_id, "AccumLossLabel", OBJPROP_TEXT, "Accum. Loss: Loading...");
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_YDISTANCE, 40);
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_FONTSIZE, 10);
ObjectSetInteger(m_chart_id, "AccumLossLabel", OBJPROP_COLOR, clrWhite);
}
// Loss Percent Label
if(!ObjectCreate(m_chart_id, "AccumLossPercentLabel", OBJ_LABEL, 0, 0, 0))
{
Print("[ERROR] Failed to create AccumLossPercentLabel. Error: ", GetLastError());
}
else
{
ObjectSetString(m_chart_id, "AccumLossPercentLabel", OBJPROP_TEXT, "Loss % of Bal: Loading...");
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_YDISTANCE, 20);
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_FONTSIZE, 10);
ObjectSetInteger(m_chart_id, "AccumLossPercentLabel", OBJPROP_COLOR, clrWhite);
}
if(m_enable_debug)
{
Print("[UIManager] Loss display labels created");
}
}
//+------------------------------------------------------------------+
//| Create manual mode controls |
//+------------------------------------------------------------------+
void CreateManualModeControls()
{
if(m_enable_debug)
{
Print("[UIManager] Creating manual mode controls...");
}
int created_count = 0;
// Manual TP Label
if(ObjectCreate(m_chart_id, "ManualTPLabel", OBJ_LABEL, 0, 0, 0))
{
ObjectSetString(m_chart_id, "ManualTPLabel", OBJPROP_TEXT, "Take Profit:");
ObjectSetInteger(m_chart_id, "ManualTPLabel", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(m_chart_id, "ManualTPLabel", OBJPROP_XDISTANCE, 180);
ObjectSetInteger(m_chart_id, "ManualTPLabel", OBJPROP_YDISTANCE, 50);
created_count++;
}
else
{
Print("[ERROR] Failed to create ManualTPLabel. Error: ", GetLastError());
}
// Manual TP Edit
if(ObjectCreate(m_chart_id, "ManualTPEdit", OBJ_EDIT, 0, 0, 0))
{
ObjectSetInteger(m_chart_id, "ManualTPEdit", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(m_chart_id, "ManualTPEdit", OBJPROP_XDISTANCE, 110);
ObjectSetInteger(m_chart_id, "ManualTPEdit", OBJPROP_YDISTANCE, 50);
ObjectSetInteger(m_chart_id, "ManualTPEdit", OBJPROP_XSIZE, 60);
created_count++;
}
else
{
Print("[ERROR] Failed to create ManualTPEdit. Error: ", GetLastError());
}
// Manual SL Label
if(ObjectCreate(m_chart_id, "ManualSLLabel", OBJ_LABEL, 0, 0, 0))
{
ObjectSetString(m_chart_id, "ManualSLLabel", OBJPROP_TEXT, "Stop Loss:");
ObjectSetInteger(m_chart_id, "ManualSLLabel", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(m_chart_id, "ManualSLLabel", OBJPROP_XDISTANCE, 180);
ObjectSetInteger(m_chart_id, "ManualSLLabel", OBJPROP_YDISTANCE, 70);
created_count++;
}
else
{
Print("[ERROR] Failed to create ManualSLLabel. Error: ", GetLastError());
}
// Manual SL Edit
if(ObjectCreate(m_chart_id, "ManualSLEdit", OBJ_EDIT, 0, 0, 0))
{
ObjectSetInteger(m_chart_id, "ManualSLEdit", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(m_chart_id, "ManualSLEdit", OBJPROP_XDISTANCE, 110);
ObjectSetInteger(m_chart_id, "ManualSLEdit", OBJPROP_YDISTANCE, 70);
ObjectSetInteger(m_chart_id, "ManualSLEdit", OBJPROP_XSIZE, 60);
created_count++;
}
else
{
Print("[ERROR] Failed to create ManualSLEdit. Error: ", GetLastError());
}
// Manual Trade Button
if(ObjectCreate(m_chart_id, "ManualTradeButton", OBJ_BUTTON, 0, 0, 0))
{
ObjectSetString(m_chart_id, "ManualTradeButton", OBJPROP_TEXT, "Open Market Order");
ObjectSetInteger(m_chart_id, "ManualTradeButton", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(m_chart_id, "ManualTradeButton", OBJPROP_XDISTANCE, 110);
ObjectSetInteger(m_chart_id, "ManualTradeButton", OBJPROP_YDISTANCE, 95);
ObjectSetInteger(m_chart_id, "ManualTradeButton", OBJPROP_XSIZE, 130);
ObjectSetInteger(m_chart_id, "ManualTradeButton", OBJPROP_YSIZE, 25);
created_count++;
}
else
{
Print("[ERROR] Failed to create ManualTradeButton. Error: ", GetLastError());
}
if(m_enable_debug)
{
Print("[UIManager] Created ", created_count, " manual mode controls");
}
}
};
//+------------------------------------------------------------------+