S/R als ZONE statt Linie (RZ/SZ, Indikator v1.37)

User-Wunsch nach einem TradingView-Bild: Resistance Zone und eine untere Zone
als farbige Baender. Neu RZ;lo;hi und SZ;lo;hi, im Indikator als OBJ_RECTANGLE
mit Beschriftung, nach rechts verlaengert.

DIE BREITE IST ECHT: sie ist die Spanne der M30-Pivots, die den Cluster gebildet
haben (sr_levels.zonen(), additiv -- cluster() bleibt unveraendert, weil es den
S/R-Auto-Close speist). Live verifiziert: R;82.786 liegt in RZ;82.776;82.797,
S;82.15 in SZ;82.14;82.16. Einzel-Pivot bekommt 0,10xATR Mindestbreite.

ZWEI ABWEICHUNGEN VOM VORBILD, beide begruendet:
(1) KEIN Fibonacci. Das Bild leitet seine Zone aus 0,618/0,658 ab. Fib ist hier
    gemessen und verworfen (04.08.): 54,3/54,5 % Haltequote gegen 55,7/53,8 %
    einer Zufallslinie gleicher Distanz, und schlechter als M30-Pivots.
(2) Die untere Zone heisst SUPPORT, nicht "Cumulative Long Liquidation". Echte
    Liquidationsdaten hat das Projekt nicht; die HL-Waende sind am 17.08. als
    reaktiv gemessen. Bricht die Support-Zone, liegen dort die Long-Stops --
    dieselbe Stelle, ehrlich benannt.

Abschaltbar InpShowZonen. Kompiliert ins richtige Terminal (0/0), deployt,
verifiziert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-17 18:27:26 +02:00
co-authored by Claude Opus 5
parent 8d17cf08e0
commit ca61cf1498
4 changed files with 141 additions and 1 deletions
+21
View File
@@ -89,3 +89,24 @@ def halten(neu, alt, px: float, atr: float, is_res: bool,
and abs(neu - px) < abs(alt - px) - naeher * atr):
return neu # alte Linie veraltet/weit weg → näheres Level
return alt # sonst: HALTEN (kein Springen)
def zonen(vals, atr: float, toleranz: float = TOLERANZ_STD) -> list:
"""Wie `cluster`, gibt aber je Cluster (mittel, lo, hi) statt nur den Mittelwert.
⚠⚠ ADDITIV — `cluster()` bleibt unveraendert. Es speist `_draw_levels` und
damit den S/R-Auto-Close; jede Aenderung dort waere ein Strategie-Eingriff.
Hier geht es nur um die ANZEIGE: eine Zone hat eine Breite, eine Linie nicht.
Die Breite ist NICHT erfunden — sie ist die Spanne der Pivots, die den
Cluster gebildet haben. Ein Cluster aus einem einzigen Pivot hat folglich
die Breite 0; der Aufrufer entscheidet, ob er ihm eine Mindestbreite gibt.
"""
out: list[list[float]] = []
for v in sorted(vals):
if out and v - out[-1][-1] <= toleranz * atr:
out[-1].append(v)
else:
out.append([v])
return [(round(sum(g) / len(g), 3), round(min(g), 3), round(max(g), 3))
for g in out]