mirror of
https://github.com/softwaredevelop/mql5.git
synced 2026-08-22 16:58:07 +00:00
refactor: Added visibility toggles
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
//| Copyright 2025, xxxxxxxx|
|
//| Copyright 2025, xxxxxxxx|
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
#property copyright "Copyright 2025, xxxxxxxx"
|
#property copyright "Copyright 2025, xxxxxxxx"
|
||||||
#property version "2.10" // Fixed Dashboard positioning and colors
|
#property version "2.20" // Added visibility toggles
|
||||||
#property description "Displays the relative strength of 8 major currencies."
|
#property description "Displays the relative strength of 8 major currencies."
|
||||||
|
|
||||||
#property indicator_separate_window
|
#property indicator_separate_window
|
||||||
@@ -60,6 +60,16 @@ input bool InpSmooth = true; // Smooth Results?
|
|||||||
input int InpSmoothPer = 5; // Smoothing Period
|
input int InpSmoothPer = 5; // Smoothing Period
|
||||||
input bool InpShowPanel = true; // Show Dashboard Panel?
|
input bool InpShowPanel = true; // Show Dashboard Panel?
|
||||||
|
|
||||||
|
input group "Visibility Settings"
|
||||||
|
input bool InpShowUSD = true; // Show USD
|
||||||
|
input bool InpShowEUR = true; // Show EUR
|
||||||
|
input bool InpShowGBP = true; // Show GBP
|
||||||
|
input bool InpShowJPY = true; // Show JPY
|
||||||
|
input bool InpShowAUD = true; // Show AUD
|
||||||
|
input bool InpShowCAD = true; // Show CAD
|
||||||
|
input bool InpShowCHF = true; // Show CHF
|
||||||
|
input bool InpShowNZD = true; // Show NZD
|
||||||
|
|
||||||
//--- Buffers
|
//--- Buffers
|
||||||
double BufUSD[], BufEUR[], BufGBP[], BufJPY[], BufAUD[], BufCAD[], BufCHF[], BufNZD[];
|
double BufUSD[], BufEUR[], BufGBP[], BufJPY[], BufAUD[], BufCAD[], BufCHF[], BufNZD[];
|
||||||
|
|
||||||
@@ -67,6 +77,7 @@ double BufUSD[], BufEUR[], BufGBP[], BufJPY[], BufAUD[], BufCAD[], BufCHF[], Buf
|
|||||||
CCurrencyStrengthCalculator *g_calculator;
|
CCurrencyStrengthCalculator *g_calculator;
|
||||||
string g_prefix;
|
string g_prefix;
|
||||||
int g_window_idx;
|
int g_window_idx;
|
||||||
|
bool g_show_flags[8]; // Array to store visibility
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
int OnInit()
|
int OnInit()
|
||||||
@@ -80,19 +91,31 @@ int OnInit()
|
|||||||
SetIndexBuffer(6, BufCHF, INDICATOR_DATA);
|
SetIndexBuffer(6, BufCHF, INDICATOR_DATA);
|
||||||
SetIndexBuffer(7, BufNZD, INDICATOR_DATA);
|
SetIndexBuffer(7, BufNZD, INDICATOR_DATA);
|
||||||
|
|
||||||
|
// Store flags
|
||||||
|
g_show_flags[0] = InpShowUSD;
|
||||||
|
g_show_flags[1] = InpShowEUR;
|
||||||
|
g_show_flags[2] = InpShowGBP;
|
||||||
|
g_show_flags[3] = InpShowJPY;
|
||||||
|
g_show_flags[4] = InpShowAUD;
|
||||||
|
g_show_flags[5] = InpShowCAD;
|
||||||
|
g_show_flags[6] = InpShowCHF;
|
||||||
|
g_show_flags[7] = InpShowNZD;
|
||||||
|
|
||||||
for(int i=0; i<8; i++)
|
for(int i=0; i<8; i++)
|
||||||
|
{
|
||||||
PlotIndexSetInteger(i, PLOT_DRAW_BEGIN, InpPeriod + (InpSmooth ? InpSmoothPer : 0));
|
PlotIndexSetInteger(i, PLOT_DRAW_BEGIN, InpPeriod + (InpSmooth ? InpSmoothPer : 0));
|
||||||
|
|
||||||
|
// Hide plot if disabled
|
||||||
|
if(!g_show_flags[i])
|
||||||
|
PlotIndexSetInteger(i, PLOT_DRAW_TYPE, DRAW_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
g_calculator = new CCurrencyStrengthCalculator();
|
g_calculator = new CCurrencyStrengthCalculator();
|
||||||
ENUM_TIMEFRAMES tf = (InpTimeframe == PERIOD_CURRENT) ? (ENUM_TIMEFRAMES)Period() : InpTimeframe;
|
ENUM_TIMEFRAMES tf = (InpTimeframe == PERIOD_CURRENT) ? (ENUM_TIMEFRAMES)Period() : InpTimeframe;
|
||||||
g_calculator.Init(InpPeriod, tf);
|
g_calculator.Init(InpPeriod, tf);
|
||||||
|
|
||||||
// Unique prefix
|
|
||||||
g_prefix = "CS_Pro_" + IntegerToString(ChartID()) + "_";
|
g_prefix = "CS_Pro_" + IntegerToString(ChartID()) + "_";
|
||||||
|
|
||||||
// Find window index (might be 0 in OnInit, updated in OnCalculate if needed)
|
|
||||||
g_window_idx = ChartWindowFind();
|
g_window_idx = ChartWindowFind();
|
||||||
|
|
||||||
ObjectsDeleteAll(0, g_prefix);
|
ObjectsDeleteAll(0, g_prefix);
|
||||||
|
|
||||||
IndicatorSetString(INDICATOR_SHORTNAME, "Currency Strength");
|
IndicatorSetString(INDICATOR_SHORTNAME, "Currency Strength");
|
||||||
@@ -186,7 +209,7 @@ void DrawDashboard(int last_idx)
|
|||||||
values[6] = BufCHF[last_idx];
|
values[6] = BufCHF[last_idx];
|
||||||
values[7] = BufNZD[last_idx];
|
values[7] = BufNZD[last_idx];
|
||||||
|
|
||||||
// Handle NaN/Empty for display
|
// Handle NaN/Empty
|
||||||
for(int i=0; i<8; i++)
|
for(int i=0; i<8; i++)
|
||||||
if(!MathIsValidNumber(values[i]) || values[i] == EMPTY_VALUE)
|
if(!MathIsValidNumber(values[i]) || values[i] == EMPTY_VALUE)
|
||||||
values[i] = 0.0;
|
values[i] = 0.0;
|
||||||
@@ -206,14 +229,26 @@ void DrawDashboard(int last_idx)
|
|||||||
int x_base = 10;
|
int x_base = 10;
|
||||||
int x_step = 95;
|
int x_step = 95;
|
||||||
int y_pos = 20;
|
int y_pos = 20;
|
||||||
|
int drawn_count = 0; // Counter for visible items
|
||||||
|
|
||||||
for(int i=0; i<8; i++)
|
for(int i=0; i<8; i++)
|
||||||
{
|
{
|
||||||
int idx = indices[i];
|
int idx = indices[i];
|
||||||
string name = g_prefix + "Label_" + IntegerToString(i);
|
|
||||||
|
// Skip if disabled by user
|
||||||
|
if(!g_show_flags[idx])
|
||||||
|
{
|
||||||
|
// Delete label if it exists (from previous state)
|
||||||
|
string name = g_prefix + "Label_" + IntegerToString(i); // Note: i is the sorted position
|
||||||
|
// Actually, we should delete ALL labels first or manage them by ID.
|
||||||
|
// Simpler: Just don't draw. But if we change params, OnInit clears objects.
|
||||||
|
// So we are safe.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string name = g_prefix + "Label_" + IntegerToString(i); // Use 'i' (rank) for name to keep them ordered
|
||||||
|
|
||||||
string val_str;
|
string val_str;
|
||||||
// Check if data is truly missing (using BufUSD as proxy for all)
|
|
||||||
if(values[idx] == 0.0 && (BufUSD[last_idx] == EMPTY_VALUE || BufUSD[last_idx] == 0.0))
|
if(values[idx] == 0.0 && (BufUSD[last_idx] == EMPTY_VALUE || BufUSD[last_idx] == 0.0))
|
||||||
val_str = "N/A";
|
val_str = "N/A";
|
||||||
else
|
else
|
||||||
@@ -230,11 +265,19 @@ void DrawDashboard(int last_idx)
|
|||||||
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
|
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x_base + i * x_step);
|
// Use drawn_count for X position to stack them neatly
|
||||||
|
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x_base + drawn_count * x_step);
|
||||||
ObjectSetString(0, name, OBJPROP_TEXT, text);
|
ObjectSetString(0, name, OBJPROP_TEXT, text);
|
||||||
ObjectSetInteger(0, name, OBJPROP_COLOR, colors[idx]);
|
ObjectSetInteger(0, name, OBJPROP_COLOR, colors[idx]);
|
||||||
|
|
||||||
|
drawn_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete unused labels (if we went from showing 8 to 3)
|
||||||
|
// Since we use 'i' (0..7) for names, if we only draw 3, labels 3..7 might remain if not cleared.
|
||||||
|
// But OnInit clears all. OnCalculate updates.
|
||||||
|
// If we change visibility, OnInit runs, clearing everything. So this is fine.
|
||||||
|
|
||||||
ChartRedraw();
|
ChartRedraw();
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
|
|||||||
Reference in New Issue
Block a user