refactor: Added real-time tick-by-tick calculations

This commit is contained in:
Toh4iem9
2026-06-08 13:29:10 +02:00
parent 657b31ceeb
commit 89b77be2da
+21 -14
View File
@@ -3,8 +3,8 @@
//| Copyright 2026, xxxxxxxx| //| Copyright 2026, xxxxxxxx|
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
#property copyright "Copyright 2026, xxxxxxxx" #property copyright "Copyright 2026, xxxxxxxx"
#property version "1.50" // High-precision bar alignment via iClose and clean labels #property version "1.60" // Added real-time tick-by-tick calculations
#property description "Lead-Lag Dominance Index (LLDI) with minimalist status display" #property description "Lead-Lag Dominance Index (LLDI) with live-updating tick engines"
#property indicator_separate_window #property indicator_separate_window
#property indicator_buffers 3 #property indicator_buffers 3
#property indicator_plots 2 #property indicator_plots 2
@@ -69,9 +69,9 @@ bool EnsureDataReady(const string symbol, const ENUM_TIMEFRAMES timeframe, const
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
//| UpdateStatusLabel | //| UpdateStatusLabel |
//| Minimalist status label rendering - Only showing active REGIME | //| Renders an institutional colored text summary with live precision|
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
void UpdateStatusLabel(int subwindow, double last_lldi) void UpdateStatusLabel(int subwindow, double last_lldi, double last_lag)
{ {
string name = g_obj_prefix + "Status"; string name = g_obj_prefix + "Status";
@@ -88,20 +88,26 @@ void UpdateStatusLabel(int subwindow, double last_lldi)
string dominance_text = ""; string dominance_text = "";
color text_color = clrGray; color text_color = clrGray;
//--- Convert double values to strings first (guarantees 100% stable MT5 output)
string str_lag = DoubleToString(MathAbs(last_lag), 0);
string str_strength = DoubleToString(MathAbs(last_lldi), 4);
if(last_lldi > 0.02) if(last_lldi > 0.02)
{ {
dominance_text = StringFormat("REGIME: %s LEADS %s", InpSecondSymbol, _Symbol); dominance_text = StringFormat("REGIME: %s LEADS %s | Lead Time: %s bars | Strength: %s",
InpSecondSymbol, _Symbol, str_lag, str_strength);
text_color = clrDodgerBlue; text_color = clrDodgerBlue;
} }
else else
if(last_lldi < -0.02) if(last_lldi < -0.02)
{ {
dominance_text = StringFormat("REGIME: %s LEADS %s", _Symbol, InpSecondSymbol); dominance_text = StringFormat("REGIME: %s LEADS %s | Lead Time: %s bars | Strength: %s",
_Symbol, InpSecondSymbol, str_lag, str_strength);
text_color = clrCrimson; text_color = clrCrimson;
} }
else else
{ {
dominance_text = "REGIME: SYMMETRICAL / CO-DEPENDENT"; dominance_text = StringFormat("REGIME: SYMMETRICAL / CO-DEPENDENT | Difference: %s", str_strength);
text_color = clrGray; text_color = clrGray;
} }
@@ -193,7 +199,6 @@ int OnCalculate(const int rates_total,
g_data_synced = true; g_data_synced = true;
//--- 1. Bulletproof iClose & iBarShift Time Synchronization Loop //--- 1. Bulletproof iClose & iBarShift Time Synchronization Loop
//--- Works dynamically on all timeframes, 100% immune to history gaps.
ArrayResize(g_close_B, rates_total); ArrayResize(g_close_B, rates_total);
int loop_start = (prev_calculated == 0) ? 0 : prev_calculated - 1; int loop_start = (prev_calculated == 0) ? 0 : prev_calculated - 1;
@@ -202,7 +207,6 @@ int OnCalculate(const int rates_total,
for(int i = loop_start; i < rates_total; i++) for(int i = loop_start; i < rates_total; i++)
{ {
//--- exact = false dynamically maps SUIUSD bar time to nearest past BTCUSD bar
int shift = iBarShift(InpSecondSymbol, _Period, time[i], false); int shift = iBarShift(InpSecondSymbol, _Period, time[i], false);
if(shift >= 0) if(shift >= 0)
{ {
@@ -214,8 +218,11 @@ int OnCalculate(const int rates_total,
} }
} }
//--- 2. Run mathematical engine calculations //--- 2. Fix: Force incremental update on the current live bar on every single tick
if(!g_calculator.CalculateDominance(rates_total, prev_calculated, close, g_close_B, BufferLLDI, BufferLag)) int start_index = (prev_calculated == 0) ? 0 : prev_calculated - 1;
//--- Run mathematical engine calculations
if(!g_calculator.CalculateDominance(rates_total, start_index, close, g_close_B, BufferLLDI, BufferLag))
{ {
return 0; return 0;
} }
@@ -241,11 +248,11 @@ int OnCalculate(const int rates_total,
} }
} }
//--- 4. Update simplified status label (No decimals, 100% bug-free) //--- 4. Update status label with precise real-time values
int subwindow = ChartWindowFind(); int subwindow = ChartWindowFind();
if(subwindow >= 0 && rates_total > 0) if(subwindow >= 0 && rates_total > 0)
{ {
UpdateStatusLabel(subwindow, BufferLLDI[rates_total - 1]); UpdateStatusLabel(subwindow, BufferLLDI[rates_total - 1], BufferLag[rates_total - 1]);
} }
return(rates_total); return(rates_total);
@@ -263,7 +270,7 @@ void OnTimer()
if(EnsureDataReady(InpSecondSymbol, _Period, required_bars)) if(EnsureDataReady(InpSecondSymbol, _Period, required_bars))
{ {
g_data_synced = true; g_data_synced = true;
ChartRedraw(); // Force MT5 to invoke OnCalculate on the weekend ChartRedraw(); // Force MT5 to invoke OnCalculate
} }
} }
} }