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;
|
||||
|
||||
+19
-7
@@ -12,9 +12,9 @@
|
||||
⚠ LOKAL eingebunden, kein CDN: die PWA laeuft ueber WireGuard
|
||||
und muss offline funktionieren. -->
|
||||
<link rel="stylesheet" href="pico.min.css?v=1">
|
||||
<link rel="stylesheet" href="style.css?v=208">
|
||||
<link rel="stylesheet" href="style.css?v=210">
|
||||
</head>
|
||||
<body data-html-v="208">
|
||||
<body data-html-v="210">
|
||||
<!-- Modul-Menü (ganz oben) -->
|
||||
<nav id="tabs">
|
||||
<button class="tab active" data-view="dash">Dashboard</button>
|
||||
@@ -43,6 +43,12 @@
|
||||
</div>
|
||||
<div class="price-row">
|
||||
<div class="px"><label title="Kontostand ohne die offene Position.">BALANCE</label><span id="balance">—</span></div>
|
||||
<!-- ⚠⚠ Farb-Logik wie vom Nutzer vorgegeben: GRUEN = Breaker AUS
|
||||
(inaktiv, nichts begrenzt), ROT = Breaker AN (aktiv, ein
|
||||
Tagesverlust-Limit ist scharf). Das ist bewusst NICHT die
|
||||
uebliche "gruen = geschuetzt"-Lesart — hier signalisiert Rot,
|
||||
dass eine Automatik eingreifen kann. -->
|
||||
<button class="cb-dot" id="btn-cb" title="Circuit Breaker (Tagesverlust-Stopp) an/aus">CB</button>
|
||||
<div class="px"><label title="Realisiertes Ergebnis von heute. Brutto — die Quellensteuer wird größtenteils erstattet und ist hier nicht abgezogen.">TAG P/L</label><span id="day-pl">—</span></div>
|
||||
<div class="px"><label title="Kontostand einschließlich der offenen Position.">EQUITY</label><span id="equity">—</span></div>
|
||||
<div class="px"><label id="hdr-price-lbl" title="Der Kurs, zu dem tatsächlich gehandelt wird. Steht er länger als 3 Minuten still, gilt der Markt als geschlossen und das Label zeigt ZU.">PEPPERSTONE KURS</label><span id="hdr-price">—</span></div>
|
||||
@@ -98,8 +104,8 @@
|
||||
Broker-TP NICHT kennt. -->
|
||||
<span class="tb-field gain"><label title="TP3 — die Obergrenze des 80-%-Kegels auf 120 Minuten (core/cone.py). Out-of-sample geprüft: die 80-%-Bänder treffen real 77 %. ⚠ Das ist eine Aussage über die REICHWEITE, nicht über die Richtung — weiter kommt der Kurs in dieser Zeit selten, nicht: er kommt dorthin.">TP3 · Kegel 120′</label>
|
||||
<span class="tb-val" id="tb-tp3">—</span></span>
|
||||
<span class="tb-field gain"><label title="Mindestgewinn in Euro, unter dem der Auto-Close am Level NICHT schließt. Leer oder 0 = aus.">Gewinn-Close</label>
|
||||
<input id="srmin-input" type="number" inputmode="decimal" step="1" placeholder="€"></span>
|
||||
<!-- ⚠ "Gewinn-Close" entfernt am 2026-08-21 mit dem S/R-Auto-Close:
|
||||
die Schwelle gab es NUR fuer ihn. -->
|
||||
<span class="tb-field stop"><label title="Harte Verlustgrenze in Euro — der Server schließt sofort, wenn sie erreicht ist. Wirkt auch bei gesperrtem Handy. ⚠ Ein gesetzter Wert wird auf den nächsten Trade übernommen, bis er gelöscht wird.">Notfall-Close</label>
|
||||
<input id="emg-input" type="number" inputmode="decimal" step="1" placeholder="€"></span>
|
||||
</div>
|
||||
@@ -421,14 +427,20 @@
|
||||
Close-Alarm (nur Slot 1, dort entsteht der Anlass). -->
|
||||
<!-- BRK-Schalter ENTFERNT, dafuer der Circuit-Breaker (User 2026-08-19).
|
||||
Der Auto-Squeeze-Zustand bleibt in der Breakout-Karte sichtbar. -->
|
||||
<button class="btn tog" id="btn-cb" title="Circuit Breaker (Tagesverlust-Stopp) an/aus">🛑 CIRCUIT BREAKER</button>
|
||||
<!-- ⚠ Der CIRCUIT-BREAKER-Knopf sitzt seit dem 2026-08-21 als runder
|
||||
"CB" rechts neben BALANCE (User-Wunsch). VERSCHOBEN, nicht kopiert:
|
||||
zwei Elemente mit derselben ID waeren ein stiller Fehler, weil
|
||||
`getElementById` nur das erste findet. -->
|
||||
<!-- S/R-Auto-Close auch in der Aktionsleiste (User 2026-08-19). Den
|
||||
Schalter gab es nur in der Trade-Leiste -- die ist aber NUR bei
|
||||
offener Position sichtbar, also genau dann nicht, wenn man ihn vor
|
||||
einem Trade setzen will. Der alte Knopf bleibt; beide lesen
|
||||
`auto_sr_close` aus demselben Snapshot und koennen nicht
|
||||
auseinanderlaufen. -->
|
||||
<button class="btn tog" id="btn-sr" title="Auto-Close am S/R-Level an/aus (P(break)-gegatet: schliesst nur, wenn das Level wahrscheinlich haelt)">S/R</button>
|
||||
<!-- ⚠ Knopf S/R entfernt am 2026-08-21 (User-Vorgabe). Der Auto-Close am
|
||||
Level ist samt Endpoint und Backend-Logik weg; der HINWEIS in der
|
||||
Meldungen-Karte, die P(break)-Chartlinien und das
|
||||
`pbreak_predictions`-Tracking bleiben. -->
|
||||
<!-- M15-Karten-Auto-Entry (User-Test 2026-08-19). ⚠ GEGEN DIE MESSUNG:
|
||||
backtest_m15_auto.py -> Lesart beidhaelftig negativ (OeR -0,162/
|
||||
-0,094, PF 0,72/0,84), KI ohne Null, schlechter als die
|
||||
@@ -473,6 +485,6 @@
|
||||
</div>
|
||||
<div id="toast" class="toast hidden"></div>
|
||||
|
||||
<script src="app.js?v=208"></script>
|
||||
<script src="app.js?v=210"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -757,3 +757,18 @@ main{padding-bottom:4.1111rem} /* Platz für die fixe Leiste */
|
||||
border-radius:var(--r-sm); color:var(--bright); cursor:pointer;
|
||||
font-size:1.1111rem; line-height:1; padding:0.3333rem 0.5556rem}
|
||||
.pt-img[data-bild]{cursor:zoom-in}
|
||||
|
||||
/* ── Runder Circuit-Breaker-Knopf neben BALANCE (User 2026-08-21) ──────────
|
||||
⚠ Farb-Logik ist die VORGABE des Nutzers: gruen = Breaker AUS (inaktiv),
|
||||
rot = Breaker AN (aktiv/scharf). Bewusst nicht die uebliche
|
||||
"gruen = geschuetzt"-Lesart — hier heisst Rot: eine Automatik kann eingreifen. */
|
||||
.cb-dot{
|
||||
width:2.0556rem; height:2.0556rem; border-radius:50%; flex:0 0 auto;
|
||||
border:1px solid var(--border); cursor:pointer; align-self:center;
|
||||
font:700 0.6667rem/1 var(--mono); letter-spacing:.5px;
|
||||
display:flex; align-items:center; justify-content:center;
|
||||
background:var(--surface-2); color:var(--dim); transition:filter .15s;
|
||||
}
|
||||
.cb-dot:active{filter:brightness(1.3)}
|
||||
.cb-dot.inaktiv{background:#0d2a16; border-color:#1a4731; color:#3fb950}
|
||||
.cb-dot.aktiv{background:#2d0d0d; border-color:#5c1a1a; color:#f85149}
|
||||
|
||||
Reference in New Issue
Block a user