mirror of
https://github.com/softwaredevelop/mql5.git
synced 2026-08-26 02:38:05 +00:00
refactor: Reorganized Weekly V-Score (v_score_week) strictly under the H1 Context Layer
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
//| Copyright 2026, xxxxxxxx |
|
//| Copyright 2026, xxxxxxxx |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
#property copyright "Copyright 2026, xxxxxxxx"
|
#property copyright "Copyright 2026, xxxxxxxx"
|
||||||
#property version "10.38" // Restored live Symbol BID pricing and dynamic live/historical Murrey price routing
|
#property version "10.38" // Reorganized Weekly V-Score (v_score_week) strictly under the H1 Context Layer
|
||||||
#property description "Exports 'QuantScan' dataset for LLM Analysis."
|
#property description "Exports 'QuantScan' dataset for LLM Analysis."
|
||||||
#property description "Features High-Performance Object Caching and precise Historical Audits."
|
#property description "Features High-Performance Object Caching and precise Historical Audits."
|
||||||
#property script_show_inputs
|
#property script_show_inputs
|
||||||
@@ -76,18 +76,22 @@ input int InpSqueezeMom = 12;
|
|||||||
input group "Output Settings"
|
input group "Output Settings"
|
||||||
input int InpPrecision = 3; // Decimal places for CSV Output
|
input int InpPrecision = 3; // Decimal places for CSV Output
|
||||||
|
|
||||||
//--- QuantData Struct
|
//--- QuantData Struct (Updated Layout)
|
||||||
struct QuantData
|
struct QuantData
|
||||||
{
|
{
|
||||||
string timestamp;
|
string timestamp;
|
||||||
string symbol;
|
string symbol;
|
||||||
double price;
|
double price;
|
||||||
|
|
||||||
|
// H1 Context (Layer 1)
|
||||||
string alpha_str;
|
string alpha_str;
|
||||||
string beta_str;
|
string beta_str;
|
||||||
double vhf;
|
double vhf;
|
||||||
double r2;
|
double r2;
|
||||||
string zone;
|
string zone;
|
||||||
double v_score_week;
|
double v_score_week; // MOVED HERE (Since it calculates strictly on H1)
|
||||||
|
|
||||||
|
// M15 Flow (Layer 2)
|
||||||
double v_score_day;
|
double v_score_day;
|
||||||
double autocorr;
|
double autocorr;
|
||||||
double vol_regime;
|
double vol_regime;
|
||||||
@@ -97,13 +101,19 @@ struct QuantData
|
|||||||
double m15_r2;
|
double m15_r2;
|
||||||
double dist_pdh;
|
double dist_pdh;
|
||||||
double dist_pdl;
|
double dist_pdl;
|
||||||
|
|
||||||
|
// M5 Trigger (Layer 3)
|
||||||
double velocity;
|
double velocity;
|
||||||
double v_pressure;
|
double v_pressure;
|
||||||
double vol_thrust;
|
double vol_thrust;
|
||||||
double cost_atr;
|
double cost_atr;
|
||||||
|
|
||||||
|
// Composites
|
||||||
string absorption;
|
string absorption;
|
||||||
string mtf_align;
|
string mtf_align;
|
||||||
string vwap_align;
|
string vwap_align;
|
||||||
|
|
||||||
|
// TSI Hist Caches
|
||||||
double h1_tsi_hist;
|
double h1_tsi_hist;
|
||||||
double m15_tsi_hist;
|
double m15_tsi_hist;
|
||||||
double m5_tsi_hist;
|
double m5_tsi_hist;
|
||||||
@@ -314,7 +324,13 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
else
|
else
|
||||||
data.zone = "N/A";
|
data.zone = "N/A";
|
||||||
|
|
||||||
// 5. TSI H1 Metrics (H1)
|
// 5. V-Score Week (Using H1 data with correct h1_total parameter and idx_l1 index)
|
||||||
|
// MOVED HERE: Since this is evaluated strictly on the H1 Context Layer!
|
||||||
|
ArrayResize(m_temp_buf3, h1_total);
|
||||||
|
m_vscore_week.Calculate(h1_total, 0, slow_t, slow_o, slow_h, slow_l, slow_c, slow_v, slow_v, m_temp_buf3);
|
||||||
|
data.v_score_week = m_temp_buf3[idx_l1];
|
||||||
|
|
||||||
|
// 6. TSI H1 Metrics (H1)
|
||||||
ArrayResize(m_temp_buf1, h1_total);
|
ArrayResize(m_temp_buf1, h1_total);
|
||||||
ArrayResize(m_temp_buf2, h1_total);
|
ArrayResize(m_temp_buf2, h1_total);
|
||||||
ArrayResize(m_temp_buf3, h1_total);
|
ArrayResize(m_temp_buf3, h1_total);
|
||||||
@@ -344,17 +360,12 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
m_vscore_day.Calculate(m15_total, 0, mid_t, mid_o, mid_h, mid_l, mid_c, mid_v, mid_v, m_temp_buf2);
|
m_vscore_day.Calculate(m15_total, 0, mid_t, mid_o, mid_h, mid_l, mid_c, mid_v, mid_v, m_temp_buf2);
|
||||||
data.v_score_day = m_temp_buf2[idx_l2];
|
data.v_score_day = m_temp_buf2[idx_l2];
|
||||||
|
|
||||||
// 3. V-Score Week (Using H1 data with correct h1_total parameter and idx_l1 index)
|
// 3. Autocorrelation Lag-1 (M15)
|
||||||
ArrayResize(m_temp_buf3, h1_total);
|
|
||||||
m_vscore_week.Calculate(h1_total, 0, slow_t, slow_o, slow_h, slow_l, slow_c, slow_v, slow_v, m_temp_buf3);
|
|
||||||
data.v_score_week = m_temp_buf3[idx_l1];
|
|
||||||
|
|
||||||
// 4. Autocorrelation Lag-1 (M15)
|
|
||||||
ArrayResize(m_temp_buf2, m15_total);
|
ArrayResize(m_temp_buf2, m15_total);
|
||||||
m_autocorr.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf2);
|
m_autocorr.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf2);
|
||||||
data.autocorr = m_temp_buf2[idx_l2];
|
data.autocorr = m_temp_buf2[idx_l2];
|
||||||
|
|
||||||
// 5. Volatility Regime (M15)
|
// 4. Volatility Regime (M15)
|
||||||
CATRCalculator atr_reg_calc;
|
CATRCalculator atr_reg_calc;
|
||||||
double atr_fast_buf[], atr_slow_buf[];
|
double atr_fast_buf[], atr_slow_buf[];
|
||||||
atr_reg_calc.Init(5, ATR_POINTS);
|
atr_reg_calc.Init(5, ATR_POINTS);
|
||||||
@@ -363,7 +374,7 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
atr_reg_calc.Calculate(m15_total, 0, mid_o, mid_h, mid_l, mid_c, atr_slow_buf);
|
atr_reg_calc.Calculate(m15_total, 0, mid_o, mid_h, mid_l, mid_c, atr_slow_buf);
|
||||||
data.vol_regime = (atr_slow_buf[idx_l2] != 0.0) ? (atr_fast_buf[idx_l2] / atr_slow_buf[idx_l2]) : 1.0;
|
data.vol_regime = (atr_slow_buf[idx_l2] != 0.0) ? (atr_fast_buf[idx_l2] / atr_slow_buf[idx_l2]) : 1.0;
|
||||||
|
|
||||||
// 6. Squeeze (M15)
|
// 5. Squeeze (M15)
|
||||||
double sqz_mom[], sqz_val[], sqz_col[];
|
double sqz_mom[], sqz_val[], sqz_col[];
|
||||||
ArrayResize(sqz_mom, m15_total);
|
ArrayResize(sqz_mom, m15_total);
|
||||||
ArrayResize(sqz_val, m15_total);
|
ArrayResize(sqz_val, m15_total);
|
||||||
@@ -372,7 +383,7 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
data.sqz = (sqz_col[idx_l2] == 1.0) ? "ON" : "OFF";
|
data.sqz = (sqz_col[idx_l2] == 1.0) ? "ON" : "OFF";
|
||||||
data.sqz_mom = sqz_mom[idx_l2];
|
data.sqz_mom = sqz_mom[idx_l2];
|
||||||
|
|
||||||
// 7. VHF & R2 (M15)
|
// 6. VHF & R2 (M15)
|
||||||
ArrayResize(m_temp_buf1, m15_total);
|
ArrayResize(m_temp_buf1, m15_total);
|
||||||
m_vhf.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf1);
|
m_vhf.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf1);
|
||||||
data.m15_vhf = m_temp_buf1[idx_l2];
|
data.m15_vhf = m_temp_buf1[idx_l2];
|
||||||
@@ -383,7 +394,7 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
m_linreg.CalculateState(m15_total, 0, mid_o, mid_h, mid_l, mid_c, PRICE_CLOSE, m_temp_buf1, m_temp_buf2, m_temp_buf3);
|
m_linreg.CalculateState(m15_total, 0, mid_o, mid_h, mid_l, mid_c, PRICE_CLOSE, m_temp_buf1, m_temp_buf2, m_temp_buf3);
|
||||||
data.m15_r2 = m_temp_buf2[idx_l2];
|
data.m15_r2 = m_temp_buf2[idx_l2];
|
||||||
|
|
||||||
// 8. Dist PDH / PDL (M15)
|
// 7. Dist PDH / PDL (M15)
|
||||||
SessionLevels sl;
|
SessionLevels sl;
|
||||||
if(m_sess.GetLevels(sym, mid_t[idx_l2], sl))
|
if(m_sess.GetLevels(sym, mid_t[idx_l2], sl))
|
||||||
{
|
{
|
||||||
@@ -396,14 +407,14 @@ bool CMarketScanner::RunAnalysis(string sym, QuantData &data)
|
|||||||
data.dist_pdl = 0.0;
|
data.dist_pdl = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 9. TSI M15 (M15)
|
// 8. TSI M15 (M15)
|
||||||
ArrayResize(m_temp_buf1, m15_total);
|
ArrayResize(m_temp_buf1, m15_total);
|
||||||
ArrayResize(m_temp_buf2, m15_total);
|
ArrayResize(m_temp_buf2, m15_total);
|
||||||
ArrayResize(m_temp_buf3, m15_total);
|
ArrayResize(m_temp_buf3, m15_total);
|
||||||
m_tsi.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf1, m_temp_buf2, m_temp_buf3);
|
m_tsi.Calculate(m15_total, 0, PRICE_CLOSE, mid_o, mid_h, mid_l, mid_c, m_temp_buf1, m_temp_buf2, m_temp_buf3);
|
||||||
data.m15_tsi_hist = m_temp_buf1[idx_l2] - m_temp_buf2[idx_l2];
|
data.m15_tsi_hist = m_temp_buf1[idx_l2] - m_temp_buf2[idx_l2];
|
||||||
|
|
||||||
// 10. RVOL M15 for Thrust
|
// 9. RVOL M15 for Thrust
|
||||||
double rvol_m15 = m_rvol.CalculateSingle(m15_total, mid_v, idx_l2);
|
double rvol_m15 = m_rvol.CalculateSingle(m15_total, mid_v, idx_l2);
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
@@ -697,8 +708,8 @@ void OnStart()
|
|||||||
StringReplace(str_fast, "PERIOD_", "");
|
StringReplace(str_fast, "PERIOD_", "");
|
||||||
|
|
||||||
string header = "TIME (" + InpBrokerTimeZone + ");SYMBOL;PRICE;";
|
string header = "TIME (" + InpBrokerTimeZone + ");SYMBOL;PRICE;";
|
||||||
header += StringFormat("ALPHA_%s;BETA_%s;VHF_%s;R2_%s;ZONE_%s;", str_slow, str_slow, str_slow, str_slow, str_slow);
|
header += StringFormat("ALPHA_%s;BETA_%s;VHF_%s;R2_%s;ZONE_%s;V_SCORE_W1_%s;", str_slow, str_slow, str_slow, str_slow, str_slow, str_slow); // MOVED V_SCORE_W1 to H1 Context!
|
||||||
header += StringFormat("V_SCORE_W1_%s;V_SCORE_D1_%s;AUTOCORR_%s;VOL_REGIME_%s;SQZ_%s;SQZ_MOM_%s;VHF_%s;R2_%s;DIST_PDH;DIST_PDL;", str_mid, str_mid, str_mid, str_mid, str_mid, str_mid, str_mid, str_mid);
|
header += StringFormat("V_SCORE_D1_%s;AUTOCORR_%s;VOL_REGIME_%s;SQZ_%s;SQZ_MOM_%s;VHF_%s;R2_%s;DIST_PDH;DIST_PDL;", str_mid, str_mid, str_mid, str_mid, str_mid, str_mid, str_mid);
|
||||||
header += StringFormat("VEL_%s;V_PRES_%s;VOL_THRUST;COST_ATR_%s;", str_fast, str_fast, str_fast);
|
header += StringFormat("VEL_%s;V_PRES_%s;VOL_THRUST;COST_ATR_%s;", str_fast, str_fast, str_fast);
|
||||||
header += "ABSORPTION;MTF_ALIGN;VWAP_ALIGN";
|
header += "ABSORPTION;MTF_ALIGN;VWAP_ALIGN";
|
||||||
|
|
||||||
@@ -716,7 +727,7 @@ void OnStart()
|
|||||||
DoubleToString(results[i].vhf, InpPrecision),
|
DoubleToString(results[i].vhf, InpPrecision),
|
||||||
DoubleToString(results[i].r2, InpPrecision),
|
DoubleToString(results[i].r2, InpPrecision),
|
||||||
results[i].zone,
|
results[i].zone,
|
||||||
DoubleToString(results[i].v_score_week, InpPrecision),
|
DoubleToString(results[i].v_score_week, InpPrecision), // MOVED: Now writes directly after zone under H1
|
||||||
DoubleToString(results[i].v_score_day, InpPrecision),
|
DoubleToString(results[i].v_score_day, InpPrecision),
|
||||||
DoubleToString(results[i].autocorr, InpPrecision),
|
DoubleToString(results[i].autocorr, InpPrecision),
|
||||||
DoubleToString(results[i].vol_regime, InpPrecision),
|
DoubleToString(results[i].vol_regime, InpPrecision),
|
||||||
|
|||||||
Reference in New Issue
Block a user