UI aufgeraeumt + Telegram auf Closes reduziert (v=177)
Vier User-Vorgaben:
1. Einsatz-Felder entfernt. Backend bleibt vollstaendig -- Folge: der
Prozentsatz ist ohne UI nur ueber ini + Neustart aenderbar.
2. BRK-Schalter entfernt, dafuer STOPP (Circuit-Breaker). Bewusster Tausch mit
Konsequenz: der An/Aus-Schalter des AUTONOMEN Pfads ist aus der App weg (nur
noch POST bzw. ini), sein Zustand bleibt in der Breakout-Karte sichtbar.
Dafuer ist die Notbremse bedienbar, die am 17.08. real ausgeloest hat.
set_circuit_breaker + POST /api/circuit + runtime_state (cb_limit_pct,
cb_remember -- ohne das Gedaechtnis waere die Prozentzahl nach einmal
Ausschalten fuer immer weg).
3. Telegram nur noch bei geschlossenen Trades: EINE Filterstelle vor
_send_telegram_roh statt 17 Einzeleingriffe, _TG_ERLAUBT = ('Trade
geschlossen',). Umkehren = Liste erweitern. Tages-/Wochenreport wird nur auf
dem Telegram-Weg still, die E-Mail laeuft weiter.
EINE Ausnahme mit Bypass: '<ok_word> FEHLGESCHLAGEN' beim Notfall-Close --
dort ist die Position NICHT zu und es braucht eine Handeingabe.
Verifiziert: /api/circuit vorher 405, nachher 200; Toggle aus->an->8 %/57,94 EUR
persistiert; 85 Tests, node --check, check_nfalle gruen; 0 verwaiste
JS-Referenzen; genau eine Instanz je Port.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
32c064a1a6
commit
e48ad80c0a
+17
-95
@@ -1144,7 +1144,18 @@ function render(d) {
|
||||
longBtn.disabled = hasPos;
|
||||
shortBtn.disabled = hasPos;
|
||||
closeBtn.disabled = !hasPos;
|
||||
$("btn-squeeze").classList.toggle("on", !!d.auto_squeeze);
|
||||
// BRK-Schalter ENTFERNT (User 2026-08-19), dafuer der Circuit-Breaker. Der
|
||||
// Auto-Squeeze-ZUSTAND bleibt in der Breakout-Karte sichtbar -- nur sein
|
||||
// Schalter ist weg (jetzt POST-Endpunkt bzw. ini).
|
||||
const cb = d.circuit_breaker || {};
|
||||
const cbb = $streng("btn-cb");
|
||||
if (cbb) {
|
||||
cbb.classList.toggle("on", !!cb.enabled);
|
||||
cbb.title = cb.enabled
|
||||
? "Tagesverlust-Stopp AN: schliesst bei " + fmt(cb.limit_eur, 2) + " € ("
|
||||
+ cb.limit_pct + " % der Balance). Heute: " + fmt(cb.day_total, 2) + " €."
|
||||
: "Tagesverlust-Stopp AUS — kein automatischer Schutz gegen eine Verlust-Serie.";
|
||||
}
|
||||
// ⚠⚠ Der 🎯 SIG-Button ist am 2026-08-12 ENTFERNT (User-Entscheidung). Der
|
||||
// autonome Entry auf die Empfehlung war seit dem 01.08. aus und auf BEIDEN
|
||||
// Ausführungs-Achsen gemessen negativ — Markt in allen 8 Feldern, ruhende
|
||||
@@ -1306,32 +1317,6 @@ function render(d) {
|
||||
if (smi && document.activeElement !== smi) {
|
||||
smi.value = srMin > 0 ? String(srMin) : "";
|
||||
}
|
||||
// Feste Einsatz-Margin (0/leer = automatisch). Nicht überschreiben, während
|
||||
// getippt wird — sonst löscht der 1-s-Render die Eingabe unter den Fingern weg.
|
||||
const mgi = $("margin-input");
|
||||
if (mgi && document.activeElement !== mgi) {
|
||||
const mm = d.manual_margin || 0;
|
||||
mgi.value = mm > 0 ? String(mm) : "";
|
||||
mgi.classList.toggle("on", mm > 0);
|
||||
}
|
||||
// Einsatz in Prozent der freien Margin. Ausgegraut, sobald links ein fester
|
||||
// Betrag steht — der hat Vorrang, und ohne den Hinweis wäre unklar, was gilt.
|
||||
const mpi = $("marginpct-input");
|
||||
if (mpi && document.activeElement !== mpi) {
|
||||
const mp = d.margin_pct || 0;
|
||||
mpi.value = mp > 0 ? String(mp) : "";
|
||||
const fest = (d.manual_margin || 0) > 0;
|
||||
mpi.classList.toggle("on", mp > 0 && !fest);
|
||||
const wrap = $("marginpct-wrap");
|
||||
if (wrap) {
|
||||
wrap.classList.toggle("muted", fest);
|
||||
wrap.title = fest
|
||||
? `Ohne Wirkung: links steht ein fester Einsatz (${fmt(d.manual_margin, 2)} €). `
|
||||
+ `Der Prozentsatz (${mp} %) bleibt nur die Obergrenze.`
|
||||
: "Einsatz als Prozent der freien Margin (1–99). "
|
||||
+ "Greift, solange links kein fester Betrag steht.";
|
||||
}
|
||||
}
|
||||
// Einblendung: der Bot hat am S/R automatisch geschlossen (Zähler stieg)
|
||||
const src = d.sr_close_count;
|
||||
if (src != null) {
|
||||
@@ -1744,7 +1729,7 @@ $("mute-btn").onclick = () => {
|
||||
_updateMuteBtn();
|
||||
|
||||
// Toggle-Buttons (AUTO/TRAIL/S-R-Close) — ohne Bestätigung
|
||||
$("btn-squeeze").onclick = () => toggle("api/autosqueeze", "Auto-Squeeze (autonom!)");
|
||||
$("btn-cb").onclick = () => toggle("api/circuit", "Tagesverlust-Stopp");
|
||||
// (🎯 SIG entfernt 2026-08-12 — s. renderOrderButtons oben)
|
||||
$("btn-trail").onclick = () => toggle("api/trail", "Trailing");
|
||||
$("srclose-btn").onclick = () => toggle("api/srclose", "Auto-S/R-Close");
|
||||
@@ -1776,73 +1761,10 @@ $("srmin-input").addEventListener("keydown", e => {
|
||||
if (e.key === "Enter") { e.preventDefault(); e.target.blur(); }
|
||||
});
|
||||
|
||||
// Feste Einsatz-Margin (User-Wunsch 2026-08-04). Leer/0 = automatisch.
|
||||
// ⚠ Wirkt auf ALLE neuen Positionen, auch die autonomen — deshalb sagt der Toast
|
||||
// ausdrücklich, was gilt, statt nur „gespeichert".
|
||||
async function setManualMargin() {
|
||||
const el = $("margin-input"); if (!el) return;
|
||||
const raw = el.value;
|
||||
const v = raw === "" ? 0 : parseFloat(raw);
|
||||
if (isNaN(v) || v < 0) { toast("Bitte Betrag ≥ 0 eingeben (0 = automatisch)", false); return; }
|
||||
const tok = await ensureToken();
|
||||
if (tok === null) return;
|
||||
el.blur();
|
||||
try {
|
||||
const r = await fetch("api/manualmargin", { 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"); }
|
||||
const j = await r.json();
|
||||
toast(v > 0 ? `Einsatz fest: ${fmt(j.value ?? v, 2)} € je Position`
|
||||
: "Einsatz wieder automatisch (95 % der freien Margin)", true);
|
||||
} catch (e) {
|
||||
toast(e.message === "401" ? "Token abgelaufen — neu eingeben" : "Netzwerkfehler", false);
|
||||
}
|
||||
}
|
||||
(() => {
|
||||
const el = $("margin-input");
|
||||
if (!el) return; // null-sicher (Cache-Regel)
|
||||
el.addEventListener("change", setManualMargin);
|
||||
el.addEventListener("keydown", e => {
|
||||
if (e.key === "Enter") { e.preventDefault(); e.target.blur(); }
|
||||
});
|
||||
})();
|
||||
|
||||
// Einsatz in PROZENT der freien Margin (User-Wunsch 2026-08-05) — das Gegenstück
|
||||
// zum festen Betrag oben. Steuert `margin_buffer_pct`, das bisher nur in der ini
|
||||
// stand. ⚠ Ein gesetzter fester Betrag hat Vorrang; darauf weist der Toast hin.
|
||||
async function setMarginPct() {
|
||||
const el = $("marginpct-input"); if (!el) return;
|
||||
const v = parseFloat(el.value);
|
||||
if (isNaN(v) || v < 1 || v > 99) {
|
||||
toast("Bitte 1–99 % eingeben (100 % ließe keinen Puffer für Spread/Swap)", false);
|
||||
return;
|
||||
}
|
||||
const tok = await ensureToken();
|
||||
if (tok === null) return;
|
||||
el.blur();
|
||||
try {
|
||||
const r = await fetch("api/marginpct", { 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"); }
|
||||
const j = await r.json();
|
||||
if (j.ok === false) { toast(j.error || "abgelehnt", false); return; }
|
||||
const fest = parseFloat(($("margin-input") || {}).value || "0") > 0;
|
||||
toast(`Einsatz: ${fmt(j.value ?? v, 0)} % der freien Margin`
|
||||
+ (fest ? " — greift erst, wenn der feste Betrag links leer ist" : ""), true);
|
||||
} catch (e) {
|
||||
toast(e.message === "401" ? "Token abgelaufen — neu eingeben" : "Netzwerkfehler", false);
|
||||
}
|
||||
}
|
||||
(() => {
|
||||
const el = $("marginpct-input");
|
||||
if (!el) return; // null-sicher (Cache-Regel)
|
||||
el.addEventListener("change", setMarginPct);
|
||||
el.addEventListener("keydown", e => {
|
||||
if (e.key === "Enter") { e.preventDefault(); e.target.blur(); }
|
||||
});
|
||||
})();
|
||||
// Einsatz-Felder ENTFERNT (User 2026-08-19). Das BACKEND bleibt vollstaendig:
|
||||
// beide Endpunkte sind weiter erreichbar, die Werte leben in
|
||||
// `runtime_state.json` UND der ini (aktuell 40 %). Ohne UI aendert man den
|
||||
// Prozentsatz also dort + Neustart -- oder per POST.
|
||||
|
||||
// Notfall-Stop: manueller Verlust-Wert, bei dem der Server sofort schließt.
|
||||
// Wieder eingeblendet 2026-07-22 (Backend/Persistenz waren die ganze Zeit aktiv).
|
||||
|
||||
Reference in New Issue
Block a user