{ "manifest_id": "MALE5-ML-MANIFEST-v0.1.0-frozen", "research_family": "MALE5-ML", "title": "MULTIVARIATE MALE5 CLASSIFIER RESEARCH PROTOCOL — design manifest", "status": "DESIGN FROZEN — EXECUTION NOT AUTHORIZED", "design_session_date": "2026-08-26", "freeze_date": "2026-08-27", "branch": "main", "project": { "name": "ARIMA_SAX_Hybrid_Forecaster", "workspace": "D:\\TradingTerminal\\MetaTrader 5\\MQL5\\Shared Projects\\ARIMA_SAX_Hybrid_Forecaster", "remote": "https://forge.mql5.io/chiki2bum2/ARIMA_SAX_Hybrid_Forecaster.git" }, "protocol": { "path": "results/MALE5-ML/MALE5_ML_PROTOCOL.md", "version": "male5-ml-v0.1.0-frozen", "sha256": "6226f12be14e1ed805542c0be84273cd20b1cee0a7ffecfb0b594eec2f5d8e7f" }, "dependency": { "upstream_url": "https://github.com/MegaJoctan/MALE5", "canonical_tag": "v3.2.0", "exact_commit": "d6fb0695a7c2fbeaa03de379557a8b5447915384", "archive_sha256": "ad161d75ae0b54ee54a1fd3b0d48c315cf776eebc97077a4b1ae7a629f0c0d4d", "canonical_local_path": "D:\\TradingTerminal\\MetaTrader 5\\MQL5\\Include\\MALE5", "compile_smoke": { "errors": 0, "warnings": 0, "note": "CRandomForestClassifier include/instantiate/fit/predict smoke, build 6140 AVX512" }, "predict_proba": "UNSUPPORTED — protocol binary classification only", "policy": "v3.2.0 only; no v3.5.0; no HEAD; no version mixing; no patching" }, "dependency_corresponding_hashes_sha256": { "Random_Forest_mqh": "cb0935ac6b69283ff0d2de2b2fc7c1460d14983f23a56e0b3d2e9ce8dccfc0db", "tree_mqh": "9568b9f903876acca0cfa1340cffe19f071fcafeeb0c67ae4802974d6dd23b2a", "correspondence_note": "RF file verified to canonical value in freeze session" }, "source_dataset": { "path": "results/R1_real_data/XAUUSDc_M1_raw.json", "symbol": "XAUUSDc", "timeframe": "M1", "n_bars": 397558, "source_hash_raw_json_sha256": "5472357e67f70f7d1bfef8f9de67fcce91ee6f26208072d7a6766b06c158ee6e", "verify_status": "PASS — matches frozen R2-H identity", "derived_csv": "results/R1_real_data/XAUUSDc_M1.csv", "tick_data": "D:\\TradingTerminal\\MetaTrader 5\\MQL5\\Files\\XAUUSD_mt5_ticks.csv", "tick_features": "NONE — no tick features in MALE5-ML v0.1" }, "oos_origin_list": { "path": "results/R2-H/origins_H060.csv", "horizon_minutes": 60, "n_origins": 3169, "sha256": "e7b5132c321f5350ec1e231d49d68dbc29468cdf9ee6a5014a2764aaf36eb9af", "verify_status": "PASS — matches frozen identity; reused, NOT modified" }, "horizon": { "value_minutes": 60, "definition": "elapsed-time horizon; t_end = first valid M1 bar at/after timestamp(o)+60min; gap 5 min" }, "target": { "definition": "y(o) = 1 if Close[t_end] \u003e Close[o] else 0; zero move =\u003e class 0", "binary_only": true }, "features": { "grid": "M1 only", "scaler": "OFF", "warmup_W_m1_bars": 40, "definitions": { "F1_short_momentum": "(C[o]-C[o-5])/C[o-5]", "F2_medium_momentum": "(C[o]-C[o-15])/C[o-15]", "F3_trend_slope": "OLS slope of log(C) over 30 bars, slope*30/ATR20(o)", "F4_distance_from_SMA20": "C[o]/SMA20(o)-1", "F5_recent_range": "(max10-min10)/ATR20(o)", "F6_normalized_volatility": "ATR20(o)/C[o]", "F7_session_phase": "hour_of_day(o)/24.0" }, "atr20_definition": "close-only deterministic ATR proxy: rolling mean of |C[i]-C[i-1]| over trailing 20 M1 bars (NOT Wilder ATR)" }, "model": { "class": "CRandomForestClassifier", "source": "MALE5 v3.2.0 MALE5/Ensemble/Random Forest.mqh", "parameters": { "n_trees": 100, "minsplit": 2, "max_depth": 10, "random_state": 42 }, "supported_api": [ "fit", "predict" ], "prohibited": [ "min_samples_leaf", "criterion", "n_jobs", "predict_proba" ], "policy": "single fixed model; no model comparison; no tuning" }, "training_window_rule": { "type": "deterministic causal dense-M1 construction", "notes": [ "per OOS origin o, valid training bar t iff:", "1) t \u003e= W=40 M1 bars (features available)", "2) t not in frozen OOS list L (OOS reserved for evaluation only)", "3) target endpoint t_end(t) resolves and no gap \u003e 5 min within (t, t_end(t)]", "4) t_end(t) \u003c o (training labels never cross into OOS; no lookahead)", "classifier refit from scratch at each origin on T(o); causal expanding window", "no shuffle; no random split; no future preprocessing" ] }, "preprocessing": { "scaler": "OFF", "normalization": "none", "notes": "no full-dataset preprocessing; tree scale-invariance; F-values dimensionless/price-relative" }, "baselines": { "majority": "modal class of that origin\u0027s causal training labels T(o); tie -\u003e class 0; per-origin, causal", "drift": "DriftBaseline sign (last 40 closes slope projected H); label 1 if drift\u003e0 else 0; causal fixed", "naive": "zero-return forecast; classification reference only" }, "metrics": { "primary": [ "balanced accuracy (MBB 95% CI)", "directional accuracy (MBB 95% CI)", "paired classification error vs Majority (CI lower bound \u003e 0)", "paired classification error vs Drift (CI lower bound \u003e 0)" ], "secondary": [ "gross return/trade (ATR units)", "net return/trade (gross - cost, ATR units)", "gross/cost ratio", "cost/range ratio", "trade coverage", "time-normalized economics (per 60 min)", "EARLY/MIDDLE/LATE descriptive" ], "prohibited": [ "Brier", "log-loss", "calibration", "synthetic probabilities" ] }, "statistical_inference": { "method": "Moving Block Bootstrap (MBB)", "block_length_B": 60, "block_unit": "OOS origins (chronological evaluation series)", "repetitions": 10000, "seed": 20260827, "confidence_level": 0.95, "ci_type": "percentile [2.5%, 97.5%]", "effective_sample_size": "n_eff = floor(n_usable / B); n_origins~3169 =\u003e n_eff~52", "coherence_check": "paired error differences defined per OOS origin on common chronological series; block resampling with B=60 preserved; fixed before execution" }, "economic": { "cost_bps_round_trip": 7.57, "spread_bps": 1.57, "commission_bps": 6.00, "status": "PRE-REGISTERED GLOBAL CONSTANT", "formula": "cost_atr(o) = (7.57/10000) * close(o) / ATR20(o)", "gross_net_separate": true, "sensitivity": { "0.5x": "descriptive only", "2x": "descriptive only", "decision_impact": "none" } }, "success_criteria": [ "better than Majority (MBB CI lower bound of paired error difference \u003e 0)", "better than Drift (MBB CI lower bound of paired error difference \u003e 0)", "dependence-aware statistical support", "no material reversal across EARLY/MIDDLE/LATE (point estimate advantage \u003e= 0 in every segment toward both baselines)", "positive gross return/return (CI lower bound \u003e 0) for any trading claim", "positive net return (CI lower bound \u003e 0) for economic viability" ], "hard_stop_conditions": [ "dependency identity mismatch", "predict_proba or non-v3.2.0 API required", "RF params unsupported", "origin list modified/regenerated / hash mismatch", "dataset hash mismatch", "no-lookahead failure (mutation testing)", "tuning from results (model/MBB/seed/cost)", "protocol contradiction or unresolved spec", "any execution before separate EXECUTION COMPLETION gate", "accidental R1-R / R2-H modification" ], "no_lookahead_gates": { "F1": "feature construction", "F2": "target construction", "F3": "ATR20 construction", "F4": "SMA20/range/slope windows", "F5": "training data boundary (t_end(t) \u003c o; t not in L)", "F6": "normalization/scaler (OFF)", "F7": "horizon endpoint determination", "F8": "cost information", "F9": "tick-derived information (none used)" }, "governance": { "freeze_commit_message": "research: freeze MALE5-ML protocol", "push": "NOT PERFORMED — not authorized in this session", "git_rule": "single governance commit; no history rewrite; no auto-push" }, "generated_design_artifacts": { "protocol": "results/MALE5-ML/MALE5_ML_PROTOCOL.md", "manifest": "results/MALE5-ML/MALE5_ML_MANIFEST.json" }, "note": "MALE5-ML = DESIGN FROZEN; EXECUTION NOT AUTHORIZED. No model executed, no metrics computed, no prediction/backtest/OOS/tuning artifact produced. Required next gate: EXECUTION AUTHORIZATION. Agent does not auto-git commit or push for experimental work." }