//+------------------------------------------------------------------+
//|                                      MicrostructureRadarTest.mq5 |
//|                          Copyright 2026, Wanateki Solutions Ltd. |
//|                                         https://www.wanateki.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2026, Wanateki Solutions Ltd."
#property link        "https://www.wanateki.com"
#property version     "1.00"
#property description "Diagnostic Test Script for Real-Time Microstructure Regime Auditing"
#property script_show_inputs

//--- Include the master Friction Guard facade
#include <Why_Backtested_Scalpers_Diverge_in_Live_Trading\ScalperGuard\FrictionGuard.mqh>

//+------------------------------------------------------------------+
//| Script Input Parameters                                          |
//+------------------------------------------------------------------+
input group "=== Observation Session Settings ===";
input int      inputObservationSeconds    = 30;       // Session Duration (Seconds)
input int      inputMaxTicksToAudit       = 100;      // Maximum Ticks to Audit
input int      inputWarmupTicks           = 15;       // Required Warmup Samples

input group "=== Microstructure Engine Calibration ===";
input int      inputBufferSize            = 100;      // Circular Buffer Capacity
input double   inputVelocityWindowSec     = 5.0;      // Velocity Rolling Window (Seconds)
input double   inputMinVelocityPtsSec     = 1.0;      // Min Permissible Velocity (Points/Sec)
input double   inputSpreadZScoreLimit     = 2.0;      // Spread Spike Z-Score Limit
input double   inputHardSpreadMaxPts      = 25.0;     // Absolute Hard Spread Ceiling (Points)
input double   inputMaxFrictionRatio      = 0.40;     // Maximum Permitted Friction Ratio

//+------------------------------------------------------------------+
//| Script Program Start Function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("=============================================================================================================");
   PrintFormat("[+] Starting Microstructure Radar Test on %s", _Symbol);
   PrintFormat("    Digits: %d | Point: %g | Session Window: %d sec | Max Ticks: %d",
               _Digits, _Point, inputObservationSeconds, inputMaxTicksToAudit);
   Print("=============================================================================================================");
   Print("");

//--- Instantiate master gatekeeper on the stack
   CFrictionGuard guard;

//--- Initialize engine without GUI dashboard (pure terminal telemetry)
   if(!guard.Initialize(
         _Symbol,
         inputBufferSize,
         inputVelocityWindowSec,
         inputMinVelocityPtsSec,
         inputSpreadZScoreLimit,
         inputHardSpreadMaxPts,
         inputMaxFrictionRatio,
         5.0,              // Expected holding seconds
         10.0,             // Minimum expected displacement points
         2.0,              // Base slippage estimate points
         false,            // Disable GUI telemetry HUD
         "RADAR TEST",     // Dashboard title
         0.0,              // Take profit points
         0.0,              // Commission equivalent points
         0.0,              // Commission per lot
         inputWarmupTicks  // Required warmup ticks
      ))
     {
      Print("[-] Failed to initialize CFrictionGuard engine. Terminating script.");
      return;
     }

   Print("[*] Engine initialized. Ingesting live market ticks...");

   MqlTick lastTick;
   ZeroMemory(lastTick);

   ulong startTimestampMs = GetTickCount64();
   ulong maxDurationMs    = (ulong)inputObservationSeconds * 1000;
   int   auditedTicks     = 0;

//--- Pre-build format string with dynamic symbol precision (recommended MQL5 pattern)
   string logFormat = StringFormat("[#%%03d] Bid: %%.%df | Ask: %%.%df | Spread: %%4.1f pt (Z: %%+4.2f) | Vel: %%4.2f pt/s | Freq: %%4.1f t/s \n       F-Ratio: %%4.2f | %%s | Trade: %%s (%%s)", _Digits, _Digits);

//--- Diagnostic tick acquisition and classification loop
   while(!IsStopped() && (GetTickCount64() - startTimestampMs < maxDurationMs) && (auditedTicks < inputMaxTicksToAudit))
     {
      MqlTick currentTick;
      if(SymbolInfoTick(_Symbol, currentTick))
        {
         //--- Process new tick arrivals only
         if(currentTick.time_msc != lastTick.time_msc)
           {
            lastTick = currentTick;
            auditedTicks++;

            //--- Ingest raw tick into analytical pipeline
            guard.ProcessTick(currentTick);

            //--- Evaluate pre-trade execution clearance (updates evaluation counters and rejection reason)
            bool isPermitted = guard.IsSafeToTrade();

            //--- Retrieve consolidated metrics snapshot
            SFrictionMetrics metrics;
            guard.GetMetrics(metrics);

            //--- Format regime and reason strings
            string regimeName = EnumToString(metrics.mRegime);
            string reasonName = EnumToString(metrics.mReason);

            //--- Log analytical state to the Experts journal
            PrintFormat(logFormat,
                        auditedTicks,
                        currentTick.bid,
                        currentTick.ask,
                        metrics.mCurrentSpreadPoints,
                        metrics.mSpreadZScore,
                        metrics.mTickVelocityPointsPerSec,
                        metrics.mTickFrequency,
                        metrics.mFrictionRatio,
                        regimeName,
                        isPermitted ? "APPROVED" : "BLOCKED ",
                        reasonName);
            Print("");
           }
        }
      Sleep(10); // Yield CPU to maintain terminal responsiveness
     }

   Print("=============================================================================================================");
   PrintFormat("[+] Microstructure Radar Session Complete. Total Ticks Audited: %d", auditedTicks);
   Print("=============================================================================================================");

//--- Explicit shutdown and memory cleanup
   guard.Shutdown();
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
