Roast-Punkte 1-3: Erfolgskontrolle erweitert, flip_close sichtbar, WARTEN-Massstab
korrigiert - und ein eigener Messfehler gefunden
(3) backtest_dist_gated.py: der 43-%-Massstab war UNGUELTIG. backtest_dist.py
misst _build ALLEIN, ohne Breakout-Bestaetigung und ohne Entry-Raum-Gate - genau
die beiden sind live die groessten Blocker. Ueber 80k Bars: nur _build 77,9 %
gerichtet, voller Live-Stack 19,5 %, live 7,2 %. Der reale Abstand ist 12,3 Pp,
nicht 50. Damit ist der "93 statt 43 %"-Alarm entschaerft, der den TF-Churn-Fix
ausgeloest hat; die dortige Erfolgskontrolle ist hinfaellig. Ein Rest bleibt
(min_conf live 16,3 % gegen 0,9 % in der Sim) und ist als naechster Ansatzpunkt
notiert.
⚠ Dabei EIGENEN Fehler gefunden: set_entry_room(0.6) fehlte in DREI heute neu
gebauten Skripten - _entry_room_atr ist im Konstruktor 0.0, _room_gate ist dann
ein No-op. Aufgefallen, weil entry_room in der Verteilung mit 0 % auftauchte
statt mit 35 %. Alle drei korrigiert und die SIG-Messung WIEDERHOLT: Population
aendert sich stark (n 967->295 / 1327->524), die Schlussfolgerung nicht - Market
in 7 von 8 Feldern negativ, am Level bestehen alle vier Schwellen
(OeR +0,392/+0,356, PF 2,37/2,39), Slippage-Test haelt bis 0,20 xATR. Die
heutige Bau-Entscheidung ist gedeckt.
(2) auto_flip_close ist jetzt sichtbar (#flip-note, v=139) - mit Schwelle,
Zaehler UND der Messung im Text ("gemessen in beiden Halbjahren negativ"). Ein
blanker Zaehler haette wie ein Erfolg ausgesehen. Der Exit bleibt an.
(1) analyze_squeeze_entry_gap.py erfasst jetzt BEIDE Bot-Pfade (Squeeze +
Signal), Reminder entsprechend erweitert - sonst wartet er auf eine Population,
die vielleicht nie kommt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
90d77a2305
commit
516f1eaa7f
@@ -33,8 +33,17 @@ _BERLIN = ZoneInfo("Europe/Berlin")
|
||||
_BROKER = timezone(timedelta(hours=3))
|
||||
_UTC = timezone.utc
|
||||
_UMBAU = datetime(2026, 8, 5, 8, 55, tzinfo=_BERLIN) # Pending-Entry ging live
|
||||
_RX = re.compile(r"^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d).*AUTO-SQUEEZE-ENTRY: (\w+) "
|
||||
r"@ Ausbruch ([\d.]+)")
|
||||
# ⚠ BEIDE Market-Pfade erfassen (2026-08-05): seit dem Pending-Umbau laeuft auch
|
||||
# der Signal-Entry ueber eine ruhende Stop-Order. Nur der FALLBACK schreibt noch
|
||||
# eine Log-Zeile mit Level — die faengt dieses Muster ebenfalls ein.
|
||||
_RX = re.compile(r"^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d).*"
|
||||
r"(?:AUTO-SQUEEZE-ENTRY: (\w+) @ Ausbruch ([\d.]+)"
|
||||
r"|AUTO-SIGNAL-ENTRY: (\w+) )")
|
||||
# Der Signal-Log nennt kein Level (es steht nur im Snapshot) — dort wird der
|
||||
# Abstand deshalb nicht berechnet, der Trade zaehlt aber als Market-Fallback.
|
||||
_RX_SIG = re.compile(r"^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d).*AUTO-SIGNAL-ENTRY: (\w+) ")
|
||||
_RX_SQ = re.compile(r"^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d).*AUTO-SQUEEZE-ENTRY: (\w+) "
|
||||
r"@ Ausbruch ([\d.]+)")
|
||||
|
||||
|
||||
def _berlin(ts):
|
||||
@@ -57,20 +66,27 @@ def main():
|
||||
seit = datetime.now(_BERLIN) - timedelta(days=tage)
|
||||
|
||||
# ── 1) Log: Ausbruchs-Level je Market-Entry ──────────────────────────
|
||||
log_eintraege = []
|
||||
log_eintraege, sig_fallback = [], []
|
||||
for f in sorted(glob.glob(os.path.join(_HIER, "oil_widget.log*"))):
|
||||
try:
|
||||
with open(f, encoding="utf-8", errors="replace") as fh:
|
||||
for z in fh:
|
||||
m = _RX.match(z)
|
||||
m = _RX_SQ.match(z)
|
||||
if m:
|
||||
ts = datetime.strptime(m.group(1), "%Y-%m-%d %H:%M:%S") \
|
||||
.replace(tzinfo=_BERLIN)
|
||||
if ts >= seit:
|
||||
log_eintraege.append((ts, m.group(2), float(m.group(3))))
|
||||
continue
|
||||
m = _RX_SIG.match(z)
|
||||
if m:
|
||||
ts = datetime.strptime(m.group(1), "%Y-%m-%d %H:%M:%S") \
|
||||
.replace(tzinfo=_BERLIN)
|
||||
if ts >= seit:
|
||||
sig_fallback.append((ts, m.group(2)))
|
||||
except OSError:
|
||||
continue
|
||||
log_eintraege.sort()
|
||||
log_eintraege.sort(); sig_fallback.sort()
|
||||
|
||||
# ── 2) ATR-Reihe für die Normierung ──────────────────────────────────
|
||||
mt5.initialize()
|
||||
@@ -127,17 +143,23 @@ def main():
|
||||
print(" die Market-Order ist nur noch Fallback, und die Nachjagd-Bremse")
|
||||
print(" (squeeze_max_chase_atr) deckelt sie bei 0,20×ATR.")
|
||||
print()
|
||||
print(" ⚠ Die eigentliche Erfolgsmeldung: Squeeze-Trades OHNE Log-Zeile —")
|
||||
print(" das sind die per Pending-Order gefüllten.")
|
||||
n_sq = 0
|
||||
print(" ⚠ Die eigentliche Erfolgsmeldung: Bot-Trades OHNE Market-Log-Zeile —")
|
||||
print(" das sind die per Pending-Order gefüllten (Squeeze UND Signal).")
|
||||
sig_ts = {t.timestamp() for t, _ in sig_fallback}
|
||||
n_bot = 0
|
||||
for t in trades:
|
||||
if t["entry_time"] < _UMBAU.timestamp():
|
||||
continue
|
||||
n_sq += 1
|
||||
if t["ticket"] not in getroffen:
|
||||
n_bot += 1
|
||||
# Market-Fallback erkannt, wenn eine der beiden Log-Zeilen zeitlich passt
|
||||
market = (t["ticket"] in getroffen
|
||||
or any(abs(t["entry_time"] - s) <= 90 for s in sig_ts))
|
||||
if not market:
|
||||
ohne_log.append(t)
|
||||
print(f" Trades seit dem Umbau: {n_sq} · davon ohne Market-Log-Zeile: "
|
||||
print(f" Trades seit dem Umbau: {n_bot} · davon ohne Market-Log-Zeile: "
|
||||
f"{len(ohne_log)}")
|
||||
print(f" (Market-Fallback-Zeilen im Log: Squeeze {len(log_eintraege)} · "
|
||||
f"Signal {len(sig_fallback)})")
|
||||
for t in ohne_log[-10:]:
|
||||
print(f" {datetime.fromtimestamp(t['entry_time'], _BERLIN):%d.%m %H:%M} "
|
||||
f"{t['direction']:<5} @ {t['entry_price']:.3f} "
|
||||
|
||||
Reference in New Issue
Block a user