forked from chiki2bum2/SniperGold_ML
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
| |||
"""P3-S25.1 EXTERNAL TICK INGESTION & ORACLE COMPLETION -- CONFIG.
| |||
| |||
Immutable run configuration for the external Tickstory tick CSV ingestion.
| |||
| |||
Timestamp basis (established, not invented):
| |||
- Tickstory -> MT5 tick export. Default Tickstory/MT5 export timezone is
| |||
UTC (GMT+00). The DATE+TIME fields are interpreted as UTC wall-clock
| |||
seconds; offset = 0. This is the same UTC-anchored hypothesis carried
| |||
from P3-S25 and is recorded here as the immutable run configuration
| |||
(timestamp_basis = "utc", tz_offset_seconds = 0).
| |||
| |||
Namespace is research-only. It never writes into frozen research pipelines
| |||
and never modifies external source files.
| |||
"""
| |||
import os
| |||
import hashlib
| |||
import datetime as dt
| |||
| |||
HERE = os.path.dirname(os.path.abspath(__file__))
| |||
OUT = os.path.join(HERE, "output")
| |||
SCRATCH = os.path.join(HERE, "scratch")
| |||
for d in (OUT, SCRATCH):
| |||
os.makedirs(d, exist_ok=True)
| |||
| |||
# ---- Data sources ----------------------------------------------------------
| |||
FILES_DIR = r"D:\TradingTerminal\HFM Metatrader 5\MQL5\Files"
| |||
TICKS_CSV = os.path.join(FILES_DIR, "XAUUSD_mt5_ticks.csv") # PRIMARY
| |||
DUKA_DIR = os.path.join(FILES_DIR, "XAUUSD") # FALLBACK/secondary
| |||
| |||
# ---- Timeframes ------------------------------------------------------------
| |||
M15 = 900
| |||
M30 = 1800
| |||
H4 = 14400
| |||
| |||
# ---- Timestamp semantics (immutable) --------------------------------------
| |||
TIMESTAMP_BASIS = "utc"
| |||
TZ_OFFSET_SECONDS = 0
| |||
PARSER_VERSION = "p3_s251_parser_v1"
| |||
SCHEMA_VERSION = "p3_s251_schema_v1"
| |||
ALGORITHM_VERSION = "p3_s251_algorithm_v1"
| |||
| |||
# ---- CSV column schema (no header) ----------------------------------------
| |||
# columns: date YYYYMMDD, time HH:MM:SS, bid, ask, last, volume
| |||
DATE_LEN = 8
| |||
TIME_LEN = 8
| |||
NCOL = 6
| |||
| |||
| |||
def canonical_line(epo_us, bid, ask, last, vol):
| |||
"""Deterministic CSV row of one parsed record (for chunk_sha256_parsed).
| |||
| |||
Prices serialised with Python repr() which is deterministic for a given
| |||
binary float value. Timestamp is integer UTC microseconds. Volume int.
| |||
"""
| |||
return "%d,%s,%s,%s,%d\n" % (int(epo_us), repr(float(bid)),
| |||
repr(float(ask)), repr(float(last)),
| |||
int(vol))
| |||
| |||
| |||
def default_chunk_rows():
| |||
"""Benchmark-selected rows per chunk (1-5M allowed; 4M chosen)."""
| |||
return 4_000_000
| |||
| |||
| |||
def main_window():
| |||
"""Primary research / population-replay window (matches P3-S25)."""
| |||
return "20170101", "20260101"
| |||
| |||
| |||
def source_stat():
| |||
m = os.path.getmtime(TICKS_CSV)
| |||
return {
| |||
"path": TICKS_CSV,
| |||
"size_bytes": os.path.getsize(TICKS_CSV),
| |||
"mtime_unix": float(m),
| |||
"mtime_iso": dt.datetime.fromtimestamp(
| |||
m, dt.timezone.utc).isoformat(),
| |||
}
|