Charts-Tab komplett entfernt (User-Vorgabe)
Entfernt: Tab-Button, #view-charts, der gesamte app.js-Chart-Block (Kartenaufbau, renderChart, loadCharts, 20-s-Refresh, Resize-Handler), die Chart-CSS-Regeln, die vendorte Bibliothek web/lightweight-charts.standalone.production.js (164 KB) samt script-Tag - und die Backend-Kette dahinter: /api/bars und engine.get_bars (60 Zeilen). Beide existierten ausschliesslich fuer dieses Tab; geprueft, dass es keinen anderen Aufrufer gibt. Nicht betroffen (sahen nur aehnlich aus): die Chartmuster-Karte (Verdict-Gewicht 0,25, im Tab "SIG Live"), der MQL5-Indikator samt sr_levels.csv-Export (eigener Pfad ueber _write_levels_file) und die Analyse-Module structure/patterns/cone - die speisen den Snapshot, nicht das Chart. Der MT5-Chart bleibt voll bedient. Ein veralteter Kommentar in trader.py, der auf engine.get_bars verwies, wurde auf core/gaps.py umgehaengt. Verifiziert am laufenden Server: /api/bars -> 404, Bibliothek -> 404, data-view="charts" und id="view-charts" nicht mehr im ausgelieferten HTML, 6 Tabs zu 6 Views paarig, keine verwaisten JS-Referenzen, Klammern-Balance ok, keine Fehler im Log. v=142. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
6ff3c15b1d
commit
a1a5d560b9
@@ -757,66 +757,6 @@ class TradingEngine:
|
||||
self._save_emergency_state() # Handeingabe neustart-fest (Fix 2026-07-17)
|
||||
return self._takeprofit
|
||||
|
||||
def get_bars(self, tf_label: str, n: int = 90) -> dict:
|
||||
"""OHLC-Bars + EMA12/50 + Trend je Timeframe für den Charts-Tab. Läuft unter
|
||||
`mt5_lock`. Trend = EMA12 vs EMA50 mit Totband (_TREND_DEADBAND×ATR)."""
|
||||
import MetaTrader5 as mt5
|
||||
from core.mt5_utils import mt5_lock
|
||||
from core.wave_rec import _ema_series, _atr, _EMA_FAST, _EMA_SLOW, _TREND_DEADBAND
|
||||
tf_map = {"M1": mt5.TIMEFRAME_M1, "M5": mt5.TIMEFRAME_M5, "M15": mt5.TIMEFRAME_M15,
|
||||
"M30": mt5.TIMEFRAME_M30, "H1": mt5.TIMEFRAME_H1}
|
||||
tf = tf_map.get(tf_label); sym = self.data.symbol
|
||||
if tf is None or not sym:
|
||||
return {"tf": tf_label, "bars": [], "error": "kein TF/Symbol"}
|
||||
n = max(30, min(int(n), 200))
|
||||
try:
|
||||
with mt5_lock(timeout=5) as got:
|
||||
if not got:
|
||||
return {"tf": tf_label, "bars": [], "error": "busy"}
|
||||
rates = mt5.copy_rates_from_pos(sym, tf, 0, n + _EMA_SLOW)
|
||||
except Exception as e:
|
||||
return {"tf": tf_label, "bars": [], "error": str(e)}
|
||||
if rates is None or len(rates) == 0:
|
||||
return {"tf": tf_label, "bars": [], "error": "keine Daten"}
|
||||
closes = [float(b["close"]) for b in rates]
|
||||
highs = [float(b["high"]) for b in rates]
|
||||
lows = [float(b["low"]) for b in rates]
|
||||
e12 = _ema_series(closes, _EMA_FAST); e50 = _ema_series(closes, _EMA_SLOW)
|
||||
atr = _atr(highs, lows, closes) or 0.0
|
||||
d = e12[-1] - e50[-1]
|
||||
dead = _TREND_DEADBAND * atr if atr else 0.0
|
||||
trend = "flat" if abs(d) <= dead else ("up" if d > 0 else "down")
|
||||
k = min(n, len(rates))
|
||||
bars = [{"t": int(b["time"]), "o": float(b["open"]), "h": float(b["high"]),
|
||||
"l": float(b["low"]), "c": float(b["close"])} for b in rates[-k:]]
|
||||
# S/R-Linien fürs Chart-Overlay: echte Pivot-Struktur (`_draw_levels`,
|
||||
# identisch zum Auto-Close-System) — NICHT mehr die stale [zones]-Config.
|
||||
try:
|
||||
dl = self._draw_levels()
|
||||
levels = {"res": dl.get("res", []), "sup": dl.get("sup", []), "zones": []}
|
||||
except Exception:
|
||||
levels = {"res": [], "sup": [], "zones": []}
|
||||
# Regressionskanal — nur M30 (dort ist die Marktstruktur berechnet), als
|
||||
# Linien-Arrays deckungsgleich mit den Bars (Overlay im Charts-Tab).
|
||||
channel = None
|
||||
patterns = []
|
||||
if tf_label == "M30":
|
||||
try:
|
||||
from core.structure import channel_series
|
||||
channel = channel_series(closes, atr, k)
|
||||
except Exception:
|
||||
channel = None
|
||||
# Visuelle Chartmuster (M30) fürs Overlay — Trigger-/Ziel-Preislinien.
|
||||
try:
|
||||
patterns = (self.patterns.snapshot() or {}).get("patterns") or []
|
||||
except Exception:
|
||||
patterns = []
|
||||
return {"tf": tf_label, "symbol": sym, "trend": trend, "bars": bars,
|
||||
"ema12": [round(x, 3) for x in e12[-k:]],
|
||||
"ema50": [round(x, 3) for x in e50[-k:]],
|
||||
"levels": levels, "channel": channel, "patterns": patterns,
|
||||
"broker_utc_offset": 3 * 3600}
|
||||
|
||||
def _in_startup_grace(self) -> bool:
|
||||
"""True in den ersten `_startup_grace_s` s nach Bot-Start — dann schließt der
|
||||
Bot keinen laufenden Trade selbst (Daten noch nicht stabil nach Neustart)."""
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ def _retcode_msg(res) -> str:
|
||||
|
||||
# ── Broker-Zeitzone ───────────────────────────────────────────────────────────
|
||||
# Pepperstone liefert Broker-Zeit UTC+3 (ganzjährig) — dieselbe Konstante nutzt
|
||||
# `engine.get_bars` bereits für die Chart-Umrechnung (`broker_utc_offset`).
|
||||
# `core/gaps.py` nutzt dieselbe Konstante fuer die Datums-Zuordnung.
|
||||
_BROKER_OFF_DEFAULT_S = 3 * 3600
|
||||
# Nur ein FRISCHER Tick darf den Offset (neu) bestimmen. Begründung s.
|
||||
# `_broker_offset_s` — die Schwelle liegt unter dem halben Rundungsraster
|
||||
|
||||
Reference in New Issue
Block a user