diff --git a/Indicators/MyIndicators/Session_Analysis_Single_Pro.mq5 b/Indicators/MyIndicators/Session_Analysis_Single_Pro.mq5 index 9cf64d7..0eecfdf 100644 --- a/Indicators/MyIndicators/Session_Analysis_Single_Pro.mq5 +++ b/Indicators/MyIndicators/Session_Analysis_Single_Pro.mq5 @@ -1,14 +1,13 @@ //+------------------------------------------------------------------+ //| Session_Analysis_Single_Pro.mq5 | -//| Copyright 2025, xxxxxxxx| +//| Copyright 2026, xxxxxxxx| //+------------------------------------------------------------------+ -#property copyright "Copyright 2025, xxxxxxxx" -#property version "1.10" // Fixed compilation errors +#property copyright "Copyright 2026, xxxxxxxx" +#property version "1.21" // Fixed incremental VWAP buffer-wipe ghost remnants #property description "Session Analysis for a SINGLE market." -#property description "Supports Pre, Core, Post, and Full sessions with VWAP buffers." +#property description "Fully optimized for flicker-free real-time drawing and state-safe VWAP." #property indicator_chart_window -// We use exactly 8 buffers for 4 sessions x 2 VWAP lines (Odd/Even) #property indicator_buffers 8 #property indicator_plots 8 @@ -65,7 +64,7 @@ #include #include -//--- Enum for selecting the candle source for calculation --- +//--- Enum for Candle Source --- enum ENUM_CANDLE_SOURCE { CANDLE_STANDARD, // Use standard OHLC data @@ -130,26 +129,23 @@ double BufferFull_Odd[], BufferFull_Even[]; CSessionAnalyzer *g_box_analyzers[SESSIONS_COUNT]; CVWAPCalculator *g_vwap_calculators[SESSIONS_COUNT]; string g_unique_prefix; -datetime g_last_bar_time; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { - g_last_bar_time = 0; - -// --- Map Buffers --- - SetIndexBuffer(0, BufferPre_Odd, INDICATOR_DATA); - SetIndexBuffer(1, BufferPre_Even, INDICATOR_DATA); - SetIndexBuffer(2, BufferCore_Odd, INDICATOR_DATA); +//--- Bind Buffers to index mapping + SetIndexBuffer(0, BufferPre_Odd, INDICATOR_DATA); + SetIndexBuffer(1, BufferPre_Even, INDICATOR_DATA); + SetIndexBuffer(2, BufferCore_Odd, INDICATOR_DATA); SetIndexBuffer(3, BufferCore_Even, INDICATOR_DATA); - SetIndexBuffer(4, BufferPost_Odd, INDICATOR_DATA); + SetIndexBuffer(4, BufferPost_Odd, INDICATOR_DATA); SetIndexBuffer(5, BufferPost_Even, INDICATOR_DATA); - SetIndexBuffer(6, BufferFull_Odd, INDICATOR_DATA); + SetIndexBuffer(6, BufferFull_Odd, INDICATOR_DATA); SetIndexBuffer(7, BufferFull_Even, INDICATOR_DATA); -// --- Set Series and Empty Values (Unrolled loop) --- +//--- Force strict chronological alignment and empty value fallbacks (Unrolled loop) ArraySetAsSeries(BufferPre_Odd, false); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); ArraySetAsSeries(BufferPre_Even, false); @@ -167,7 +163,7 @@ int OnInit() ArraySetAsSeries(BufferFull_Even, false); PlotIndexSetDouble(7, PLOT_EMPTY_VALUE, EMPTY_VALUE); -// --- Set Colors Dynamically --- +//--- Apply Custom Session Colors PlotIndexSetInteger(0, PLOT_LINE_COLOR, InpPre_Color); PlotIndexSetInteger(1, PLOT_LINE_COLOR, InpPre_Color); PlotIndexSetInteger(2, PLOT_LINE_COLOR, InpCore_Color); @@ -177,7 +173,7 @@ int OnInit() PlotIndexSetInteger(6, PLOT_LINE_COLOR, InpFull_Color); PlotIndexSetInteger(7, PLOT_LINE_COLOR, InpFull_Color); -// --- Unique Prefix Generation --- +//--- Generate Unique Object Prefix to prevent collisions on multiple instances MathSrand((int)TimeCurrent() + (int)ChartID()); string temp_short_name = StringFormat("SessSingle_TempID_%d_%d", TimeCurrent(), MathRand()); IndicatorSetString(INDICATOR_SHORTNAME, temp_short_name); @@ -185,13 +181,14 @@ int OnInit() int window_index = ChartWindowFind(0, temp_short_name); if(window_index < 0) window_index = 0; + g_unique_prefix = StringFormat("SessSingle_%s_%d_%d_", InpMarketName, ChartID(), window_index); ObjectsDeleteAll(0, g_unique_prefix); -// --- Determine Mode --- bool is_ha_mode = (InpCandleSource == CANDLE_HEIKIN_ASHI); - for(int i=0; i 0 && time[rates_total - 1] == g_last_bar_time && Bars(_Symbol, _Period) == rates_total) - return(rates_total); - if(rates_total > 0) - g_last_bar_time = time[rates_total - 1]; + if(rates_total < 10) + return 0; -// --- Clear VWAP buffers (Unrolled) --- - ArrayInitialize(BufferPre_Odd, EMPTY_VALUE); - ArrayInitialize(BufferPre_Even, EMPTY_VALUE); - ArrayInitialize(BufferCore_Odd, EMPTY_VALUE); - ArrayInitialize(BufferCore_Even, EMPTY_VALUE); - ArrayInitialize(BufferPost_Odd, EMPTY_VALUE); - ArrayInitialize(BufferPost_Even, EMPTY_VALUE); - ArrayInitialize(BufferFull_Odd, EMPTY_VALUE); - ArrayInitialize(BufferFull_Even, EMPTY_VALUE); +//--- Chronological safety safeguards + ArraySetAsSeries(time, false); + ArraySetAsSeries(open, false); + ArraySetAsSeries(high, false); + ArraySetAsSeries(low, false); + ArraySetAsSeries(close, false); + ArraySetAsSeries(tick_volume, false); + ArraySetAsSeries(volume, false); -// --- Object Drawing Logic --- - for(int i=0; i