430 lines
15 KiB
Plaintext
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");
|
|
}
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+ |