diff --git a/Scripts/MyScripts/Market_Scanner_Pro.mq5 b/Scripts/MyScripts/Market_Scanner_Pro.mq5 index 0beabb1..54d026e 100644 --- a/Scripts/MyScripts/Market_Scanner_Pro.mq5 +++ b/Scripts/MyScripts/Market_Scanner_Pro.mq5 @@ -1,10 +1,10 @@ //+------------------------------------------------------------------+ //| Market_Scanner_Pro.mq5 | -//| QuantScan 4.1 - Header Fix | +//| QuantScan 4.2 - Benchmark Exclusions | //| Copyright 2026, xxxxxxxx | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, xxxxxxxx" -#property version "4.10" // Re-added Dynamic Header logic +#property version "4.20" // Logic update: Exclude Benchmarks from Stats #property description "Exports 'QuantScan 4.0' for LLM Analysis." #property description "Includes Trend, Volatility, Stats + Beta/Alpha metrics." #property script_show_inputs @@ -70,9 +70,11 @@ struct QuantData double trend_score; double trend_qual; string zone; - double rel_strength; - double beta; - double alpha; + + // Strings for Stats to allow "BENCHMARK" text + string rel_strength_str; + string beta_str; + string alpha_str; // --- M15 --- double momentum; @@ -92,16 +94,21 @@ struct QuantData //+------------------------------------------------------------------+ bool IsForexPair(string sym) { +// Safety: If symbol IS one of the benchmarks, we don't classify it as generic forex pair here + if(sym == InpBenchmark || sym == InpForexBench) + return false; + if(StringFind(sym, "USD") != -1 || StringFind(sym, "EUR") != -1 || StringFind(sym, "GBP") != -1 || StringFind(sym, "JPY") != -1 || StringFind(sym, "CHF") != -1 || StringFind(sym, "AUD") != -1 || - StringFind(sym, "CAD") != -1 || StringFind(sym, "NZD") != -1) + StringFind(sym, "CAD") != -1 || StringFind(sym, "NZD") != -1 || + StringFind(sym, "XAU") != -1 || StringFind(sym, "XAG") != -1) { - if(StringFind(sym, "XAU") != -1) - return false; if(StringFind(sym, "XTI") != -1) return false; - if(StringFind(sym, "WTI") != -1) + if(StringFind(sym, "UKO") != -1) + return false; + if(StringFind(sym, "USO") != -1) return false; if(StringFind(sym, "BTC") != -1) return false; @@ -178,7 +185,7 @@ void OnStart() header += StringFormat("VOL_REGIME_%s;", str_fast); header += StringFormat("TSI_DIR_%s;", str_fast); -// Composites (Mixed logic, no suffix needed as discussed) +// Composites header += "REVERSION_PROB;"; header += "ABSORPTION"; @@ -196,6 +203,7 @@ void OnStart() if(RunQuantAnalysis(sym, data)) { + // Note: Strings used for stats FileWrite(file_handle, data.timestamp, data.symbol, @@ -203,9 +211,9 @@ void OnStart() DoubleToString(data.trend_score, 2), DoubleToString(data.trend_qual, 2), data.zone, - DoubleToString(data.rel_strength, 2) + "%", - DoubleToString(data.beta, 2), - DoubleToString(data.alpha, 4), + data.rel_strength_str, + data.beta_str, + data.alpha_str, DoubleToString(data.momentum, 2), DoubleToString(data.vol_qual, 2), data.squeeze, @@ -248,45 +256,59 @@ bool RunQuantAnalysis(string sym, QuantData &data) data.trend_qual = Calc_ER(h1_o, h1_h, h1_l, h1_c, InpERPeriod); data.zone = Calc_MurreyZone(sym, InpTFSlow); -// --- BETA / ALPHA Calculation --- - string bench_sym = InpBenchmark; - if(IsForexPair(sym) && SymbolSelect(InpForexBench, true)) - bench_sym = InpForexBench; +// --- BETA / ALPHA Calculation (With Exclusion Logic) --- + bool is_benchmark = (sym == InpBenchmark || sym == InpForexBench); - double bench_c[]; - if(CopyClose(bench_sym, InpTFSlow, 0, InpBetaLookback+2, bench_c) > InpBetaLookback) + if(is_benchmark) { - CMathStatisticsCalculator stats; - double asset_ret[], bench_ret[]; - - int h1_size = ArraySize(h1_c); - double asset_subset[]; - ArrayResize(asset_subset, InpBetaLookback); - double bench_subset[]; - ArrayResize(bench_subset, InpBetaLookback); - - for(int k=0; k InpBetaLookback) + { + CMathStatisticsCalculator stats; + double asset_ret[], bench_ret[]; + + int h1_size = ArraySize(h1_c); + double asset_subset[]; + ArrayResize(asset_subset, InpBetaLookback); + double bench_subset[]; + ArrayResize(bench_subset, InpBetaLookback); + + for(int k=0; k