forked from chiki2bum2/SniperGold_ML
83 lines
3 KiB
Python
83 lines
3 KiB
Python
# -*- coding: utf-8 -*-
| |||
"""P2.1 probe: infer window/endpoint yang dipakai EA utk f1 (H4) pd row terpilih.
| |||
| |||
Row 2026-03-18 01:00 (tc=01:15): PY=CLOSED=ANCHOR=-1 tetapi EA=+1.
| |||
Cari kombinasi (endpoint, length) yang menghasilkan +1 pada data npz H4.
| |||
Endpoint kandidat: bar terakhir yg boleh masuk window (E).
| |||
Length kandidat: 120..300.
| |||
"""
| |||
import os
| |||
import datetime as dt
| |||
import numpy as np
| |||
| |||
DATA = r"D:\TradingTerminal\HFM Metatrader 5\MQL5\Files\AlgoForge\Data"
| |||
| |||
| |||
def load(name):
| |||
z = np.load(os.path.join(DATA, "XAUUSD_" + name + ".npz"))
| |||
return (z["time"].astype(np.int64), z["high"].astype(float),
| |||
z["low"].astype(float), z["close"].astype(float))
| |||
| |||
| |||
def bttf(h, l, c, need):
| |||
"""Replika BTTFBias EA (need=len window)."""
| |||
if need < 120:
| |||
return 0
| |||
s = 3
| |||
m = need - 1
| |||
up, dn = float("inf"), -float("inf")
| |||
upb = dnb = -1
| |||
trend = 0
| |||
for i in range(s + 1, m):
| |||
p = i - s
| |||
if p >= s:
| |||
isH = isL = True
| |||
for kk in range(1, s + 1):
| |||
if h[p] <= h[p + kk] or h[p] <= h[p - kk]:
| |||
isH = False
| |||
if l[p] >= l[p + kk] or l[p] >= l[p - kk]:
| |||
isL = False
| |||
if isH:
| |||
up, upb = h[p], p
| |||
if isL:
| |||
dn, dnb = l[p], p
| |||
if upb >= 0 and c[i] > up:
| |||
trend = 1
| |||
up, upb = float("inf"), -1
| |||
if dnb >= 0 and c[i] < dn:
| |||
trend = -1
| |||
dn, dnb = -float("inf"), -1
| |||
return trend
| |||
| |||
| |||
ht, hh, hl, hc = load("H4")
| |||
t = int(dt.datetime(2026, 3, 18, 1, 0, tzinfo=dt.timezone.utc).timestamp())
| |||
tc = t + 900
| |||
| |||
# endpoint kandidat (indeks H4)
| |||
ends = {}
| |||
ends["20:00 03-17 (E_ea)"] = int(np.searchsorted(ht, tc - 14400, side="right")) - 1
| |||
ends["00:00 03-18 (contain)"] = int(np.searchsorted(ht, t, side="right")) - 1
| |||
ends["00:00 03-18 -1 (E_py)"] = int(np.searchsorted(ht, t, side="right")) - 2
| |||
ends["04:00 03-18 (forming)"] = int(np.searchsorted(ht, tc, side="right")) - 1
| |||
ends["16:00 03-17 (stale-1)"] = ends["20:00 03-17 (E_ea)"] - 1
| |||
ends["12:00 03-17 (stale-2)"] = ends["20:00 03-17 (E_ea)"] - 2
| |||
| |||
print(f"row t={dt.datetime.fromtimestamp(t, dt.timezone.utc)} tc={dt.datetime.fromtimestamp(tc, dt.timezone.utc)} EA f1=+1")
| |||
for name, e in ends.items():
| |||
if e < 0 or e >= len(ht):
| |||
continue
| |||
ts = dt.datetime.fromtimestamp(int(ht[e]), dt.timezone.utc)
| |||
row = f" end={name:24s} e={e:5d} ({ts})"
| |||
vals = []
| |||
for L in (120, 150, 180, 200, 210, 220, 240, 250, 260, 280, 300):
| |||
start = max(0, e - L + 1)
| |||
v = bttf(hh[start:e + 1], hl[start:e + 1], hc[start:e + 1], e - start + 1)
| |||
vals.append(f"L{L}={v:+d}")
| |||
print(row + " | " + " ".join(vals))
| |||
| |||
# juga: cek apakah data H4 npz di sekitar window wajar (sanity)
| |||
print("\nH4 bars 03-17 16:00 .. 03-18 04:00:")
| |||
i0 = int(np.searchsorted(ht, int(dt.datetime(2026, 3, 17, 16, tzinfo=dt.timezone.utc).timestamp())))
| |||
for i in range(i0, i0 + 6):
| |||
print(f" {dt.datetime.fromtimestamp(int(ht[i]), dt.timezone.utc)} H={hh[i]:.2f} L={hl[i]:.2f} C={hc[i]:.2f}")
|