S/R-Auto-Close komplett entfernt + Circuit-Breaker als runder CB-Knopf (v=210)
(1) S/R-AUTO-CLOSE RAUS (User-Vorgabe: "die brauche ich nicht mehr").
Der Schalter stand seit dem 19.08. ohnehin auf AUS - abgeschaltet, nachdem
analyze_pbreak_live.py das P(break)-Modell live als INVERTIERT gemessen hatte
(AUC 0,452, Klassen monoton rueckwaerts). Ohne funktionierendes Gate ist der
S/R-Close faktisch der PAUSCHALE, und der ist 2x gemessen und verworfen
(Gewinner-Kappen). Die Entfernung vollzieht den gemessenen Stand nach.
WEG: _check_sr_close, set_sr_autoclose, set_sr_close_min_gain, die
Konstruktor-Felder, die %-Armierung des Gewinn-Close, drei Snapshot-Felder,
beide runtime_state-Schluessel, die Reichweiten- und Systemstatus-Zeilen,
/api/srclose und /api/srclose_min, der Knopf S/R, das Gewinn-Close-Feld, der
Toast "Bot hat am Level geschlossen".
BLEIBT: `_sr_close_hint` (App-Hinweis, P(break)-Chartlinien, Copilot-Kontext,
pbreak_predictions-Tracking), `stop_approach`, das Modell selbst und die
closed_by=sr_close-Historie in der DB. Live gegengeprueft: die drei Felder sind
aus dem Snapshot verschwunden, sr_close_hint und stop_approach sind da, beide
Endpunkte antworten 405.
Sicherung: .removed_backup/sr_auto_close_2026-08-21.py
⚠ Der Close-Alarm gilt jetzt schlicht ab jedem Gewinn (`minGain = 0`) - die
Schwelle gab es nur fuer den Auto-Close. Das ist der Zustand von vor 2026-07.
⚠ Der Test test_automatik_zeile_nennt_alle_schalter war MITGEZAEHLT und faellt
korrekt - er ist angepasst, nicht entfernt: jetzt zwei Schalter statt drei, und
die Negativ-Pruefungen ("SIG"/"S/R-Close" duerfen NICHT auftauchen) sind der
eigentliche Wert, denn ein wieder auftauchender Pfad waere ein stiller Rueckbau.
(2) CIRCUIT BREAKER als runder Knopf "CB" rechts neben BALANCE.
⚠ Farb-Logik wie vorgegeben: GRUEN = inaktiv (aus), ROT = aktiv (scharf).
Bewusst NICHT die uebliche "gruen = geschuetzt"-Lesart - hier signalisiert Rot,
dass eine Automatik eingreifen kann. Im Code und im Markup steht das dran, damit
es niemand spaeter "korrigiert".
⚠ VERSCHOBEN, nicht kopiert: zwei Elemente mit derselben ID waeren ein stiller
Fehler, weil getElementById nur das erste findet.
⚠ Beim Entfernen zwei eigene Fehler: (a) ein Slice ueber `rindex("try:")`
schnitt durch fremde Konstruktor-Bloecke und riss Kommentar-Fragmente heraus -
zurueckgesetzt und zeilenbasiert von hinten neu gemacht; (b) beim Toast-Block
eine Klammer zu viel entfernt, von `node --check` sofort gefangen.
Pipeline A-G gruen, 97 Tests, 14 render*-Funktionen, deployt und am
ausgelieferten HTML/Snapshot verifiziert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ebf10da00e
commit
0dd2e524b7
+18
-56
@@ -94,7 +94,7 @@ function beepCloseAlert() {
|
||||
// unterscheidbar). Sofort beim Signal-Wechsel + WIEDERHOLUNG alle 30 s, solange
|
||||
// der Button blinkt (Empfehlung aktiv & flat) — einmaliger Piep war überhörbar.
|
||||
const _REC_REBEEP_MS = 30000;
|
||||
let _lastRecBeep = 0, _lastRecSignal = null, _audioHintShown = false, _lastSrCloseCount = null;
|
||||
let _lastRecBeep = 0, _lastRecSignal = null, _audioHintShown = false;
|
||||
|
||||
// ── Laufzeit-Uhr des offenen Trades ───────────────────────────────────────────
|
||||
// Öffnungszeit kommt als echte Epoch (Broker-Offset serverseitig korrigiert) im
|
||||
@@ -1519,16 +1519,13 @@ function render(d) {
|
||||
+ " Entries). ACHTUNG: gemessen negativ -- reiner Test."
|
||||
: "Auto-Entry auf die gruene M15-Karte AUS (gemessen negativ).";
|
||||
}
|
||||
const srb = $streng("btn-sr");
|
||||
if (srb) {
|
||||
srb.classList.toggle("on", !!d.auto_sr_close);
|
||||
srb.title = d.auto_sr_close
|
||||
? "S/R-Auto-Close AN: schliesst am Level, wenn P(break) unter der Schwelle liegt."
|
||||
: "S/R-Auto-Close AUS -- der Bot schliesst nicht mehr selbst am Level.";
|
||||
}
|
||||
const cbb = $streng("btn-cb");
|
||||
if (cbb) {
|
||||
cbb.classList.toggle("on", !!cb.enabled);
|
||||
// ⚠ Vorgabe des Nutzers: GRUEN = inaktiv (aus), ROT = aktiv (scharf).
|
||||
// Bewusst nicht die uebliche "gruen = geschuetzt"-Lesart — Rot
|
||||
// signalisiert hier, dass eine Automatik eingreifen kann.
|
||||
cbb.classList.toggle("aktiv", !!cb.enabled);
|
||||
cbb.classList.toggle("inaktiv", !cb.enabled);
|
||||
cbb.title = cb.enabled
|
||||
? "Circuit Breaker AN: schliesst bei " + fmt(cb.limit_eur, 2) + " € ("
|
||||
+ cb.limit_pct + " % der Balance). Heute: " + fmt(cb.day_total, 2) + " €."
|
||||
@@ -1559,7 +1556,9 @@ function render(d) {
|
||||
// Deckt sich mit dem Auto-Close-Gate im Backend (unter der Schwelle schließt der
|
||||
// Bot ohnehin nicht → dann auch kein Alarm/Ton).
|
||||
const posLong = p.order_type === 0;
|
||||
const minGain = d.sr_close_min_gain || 0;
|
||||
// ⚠ Der Mindestgewinn ist mit dem S/R-Auto-Close entfallen; der
|
||||
// Close-Alarm gilt jetzt schlicht ab jedem Gewinn (wie vor 2026-07).
|
||||
const minGain = 0;
|
||||
const gainOK = hasPos && (p.pnl || 0) > minGain;
|
||||
const flipClose = gainOK &&
|
||||
((posLong && w.signal === "SHORT") || (!posLong && w.signal === "LONG"));
|
||||
@@ -1567,7 +1566,8 @@ function render(d) {
|
||||
// schwacher Anlauf → Level hält ~74 % → Close schlägt Laufenlassen. Text-Hinweis
|
||||
// in der Position-Kachel immer; Blink/Ton nur über dem Mindestgewinn.
|
||||
const srHint = d.sr_close_hint || null; // vorhanden = Kurs am Level
|
||||
const srAuto = !!d.auto_sr_close;
|
||||
// ⚠ Der Bot schliesst seit dem 2026-08-21 NICHT mehr selbst am Level.
|
||||
const srAuto = false;
|
||||
const srClose = !!(srHint && srHint.close); // P(break) < Schwelle → schließen
|
||||
const closeAlert = flipClose || (gainOK && srClose);
|
||||
// ⚠ Der Alarm gilt der Position in Slot 1 (dort entsteht `sr_close_hint` und
|
||||
@@ -1686,23 +1686,9 @@ function render(d) {
|
||||
flipEl.className = "news-conflict hidden"; flipEl.textContent = "";
|
||||
}
|
||||
}
|
||||
// ⚠ Der Auto-Close-Schalter der Trade-Leiste ist am 2026-08-20 entfernt
|
||||
// (User-Wunsch) — er war doppelt: der Knopf S/R in der Aktionsleiste
|
||||
// schaltet dasselbe und ist auch sichtbar, wenn KEINE Position offen ist.
|
||||
// `srAuto` wird weiter gebraucht (Knopf `btn-sr`, Hinweistexte).
|
||||
const srMin = d.sr_close_min_gain || 0;
|
||||
const smi = $("srmin-input");
|
||||
if (smi && document.activeElement !== smi) {
|
||||
smi.value = srMin > 0 ? String(srMin) : "";
|
||||
}
|
||||
// Einblendung: der Bot hat am S/R automatisch geschlossen (Zähler stieg)
|
||||
const src = d.sr_close_count;
|
||||
if (src != null) {
|
||||
if (_lastSrCloseCount != null && src > _lastSrCloseCount) {
|
||||
toast("🎯 Bot hat am Level geschlossen (schwacher Anlauf, Gewinn gesichert)", true);
|
||||
}
|
||||
_lastSrCloseCount = src;
|
||||
}
|
||||
// ⚠ Am 2026-08-21 entfernt: der Auto-Close-Schalter der Trade-Leiste, das
|
||||
// Mindestgewinn-Feld und die Toast-Meldung "Bot hat am Level
|
||||
// geschlossen" — es gibt keinen Auto-Close am Level mehr.
|
||||
|
||||
// ── Letzte Trades ───────────────────────
|
||||
// 5 → 10 (User-Wunsch 2026-08-04). Das Backend liefert bereits 10
|
||||
@@ -2116,37 +2102,13 @@ _updateMuteBtn();
|
||||
|
||||
// Toggle-Buttons (AUTO/TRAIL/S-R-Close) — ohne Bestätigung
|
||||
$("btn-cb").onclick = () => toggle("api/circuit", "Circuit Breaker");
|
||||
$("btn-sr").onclick = () => toggle("api/srclose", "S/R-Auto-Close");
|
||||
$("btn-m15").onclick = () => toggle("api/autom15", "M15-Auto-Entry (gemessen negativ!)");
|
||||
// (🎯 SIG entfernt 2026-08-12 — s. renderOrderButtons oben)
|
||||
$("btn-trail").onclick = () => toggle("api/trail", "Trailing");
|
||||
|
||||
// Mindestgewinn für den S/R-Auto-Close (0/leer = aus)
|
||||
async function setSrMin() {
|
||||
const raw = $("srmin-input").value;
|
||||
const v = raw === "" ? 0 : parseFloat(raw);
|
||||
if (isNaN(v) || v < 0) { toast("Bitte Betrag ≥ 0 eingeben (0 = aus)", false); return; }
|
||||
const tok = await ensureToken();
|
||||
if (tok === null) return;
|
||||
$("srmin-input").blur();
|
||||
try {
|
||||
const r = await fetch("api/srclose_min", { method: "POST",
|
||||
headers: { "X-Auth-Token": tok, "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ value: v }) });
|
||||
if (r.status === 401) { clearToken(); throw new Error("401"); }
|
||||
toast(v > 0 ? `Mindestgewinn +${v} gesetzt` : "Mindestgewinn aus", true);
|
||||
} catch (e) {
|
||||
toast(e.message === "401" ? "Token abgelaufen — neu eingeben" : "Netzwerkfehler", false);
|
||||
}
|
||||
}
|
||||
// Feld sitzt in der Button-Zeile: setzt beim Verlassen/Enter automatisch
|
||||
$("srmin-input").addEventListener("change", setSrMin);
|
||||
// Enter NUR blurren → das change-Event feuert setSrMin genau EINMAL (und nur, wenn
|
||||
// der Wert wirklich geändert wurde). Vorher: keydown + change = doppelter Send,
|
||||
// und Enter auf leerem Feld schickte ungewollt 0 (Fix 2026-07-22).
|
||||
$("srmin-input").addEventListener("keydown", e => {
|
||||
if (e.key === "Enter") { e.preventDefault(); e.target.blur(); }
|
||||
});
|
||||
// ⚠ Der Mindestgewinn-Sender ist am 2026-08-21 mit dem S/R-Auto-Close
|
||||
// entfallen — die Schwelle gab es nur fuer ihn (Endpoint, Feld und
|
||||
// Backend-Zustand sind ebenfalls weg).
|
||||
|
||||
// Einsatz-Felder ENTFERNT (User 2026-08-19). Das BACKEND bleibt vollstaendig:
|
||||
// beide Endpunkte sind weiter erreichbar, die Werte leben in
|
||||
@@ -2519,7 +2481,7 @@ async function closeSlot(slot, label, pnl) {
|
||||
// und der Browser zeigte Altes. Statt das jedes Mal von Hand zu diagnostizieren,
|
||||
// sagt die Seite es jetzt selbst.
|
||||
// ⚠ Bewusst SICHTBAR statt nur Konsole: die Konsole sieht am Handy niemand.
|
||||
const _JS_V = "208";
|
||||
const _JS_V = "210";
|
||||
{
|
||||
const htmlV = document.body && document.body.dataset
|
||||
? document.body.dataset.htmlV : null;
|
||||
|
||||
Reference in New Issue
Block a user