ARIMA_SAX_Hybrid_Forecaster/results/MALE5-ML/MALE5_ML_MANIFEST.json

210 lines
No EOL
13 KiB
JSON

{
"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."
}