telegram_daily: soglia di accensione generale su k flip, non il minimo fisso (#35 C3)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,31 @@ def _fmt_usd(x: float) -> str:
|
||||
return f"${x:,.2f}"
|
||||
|
||||
|
||||
def _soglia_accensione(segni: list[int], neg_refs: list[float]) -> float | None:
|
||||
"""(#35 C3) Quale riferimento, superato, accende TP01 (mean(segni) > 0)?
|
||||
|
||||
I segni sono sempre in {-1,+1}, mai 0 (trend_state li costruisce con `1 if px>refs[h]
|
||||
else -1`: nessun pareggio possibile). Con k segni negativi da far diventare positivi, la
|
||||
somma cresce di 2 per flip: serve il piu' piccolo k tale che sum(segni)+2k > 0. La soglia
|
||||
e' il k-esimo riferimento negativo piu' basso (k=1 -> il minimo, come prima del fix; k=2 ->
|
||||
il secondo, ecc.) — non sempre il minimo: con TUTTI i riferimenti negativi, superare solo il
|
||||
piu' basso lascia la media <= 0 e TP01 a 0 (bug segnalato in #35 C3).
|
||||
|
||||
None se la media e' gia' positiva (nessuna soglia da dare) o se k supera il numero di
|
||||
riferimenti negativi disponibili (non dovrebbe accadere: con n segni, flippare tutti gli n
|
||||
negativi porta comunque la somma a +n > 0, quindi k <= len(neg_refs) sempre — resta una
|
||||
guardia difensiva, non un caso noto)."""
|
||||
s = sum(segni)
|
||||
if s > 0 or not neg_refs:
|
||||
return None
|
||||
k = 0
|
||||
while s + 2 * k <= 0:
|
||||
k += 1
|
||||
if k > len(neg_refs):
|
||||
return None
|
||||
return sorted(neg_refs)[k - 1]
|
||||
|
||||
|
||||
def trend_state() -> list[str]:
|
||||
"""Stato TSMOM per asset + quanto manca all'accensione (2 orizzonti su 3 positivi).
|
||||
|
||||
@@ -59,10 +84,10 @@ def trend_state() -> list[str]:
|
||||
tgt = max(0.0, m)
|
||||
line = f" {a} {px:,.0f} · segni " + "/".join(f"{sg[h]:+d}" for h in HORIZONS) + \
|
||||
f" → TP01 {tgt:.2f}"
|
||||
neg = [(h, refs[h]) for h in HORIZONS if sg[h] < 0]
|
||||
if neg and tgt == 0.0:
|
||||
h, r = min(neg, key=lambda t: t[1])
|
||||
line += f"\n accensione a {r:,.0f} ({(r/px-1)*100:+.1f}%)"
|
||||
if tgt == 0.0:
|
||||
r = _soglia_accensione(list(sg.values()), [refs[h] for h in HORIZONS if sg[h] < 0])
|
||||
if r is not None:
|
||||
line += f"\n accensione a {r:,.0f} ({(r/px-1)*100:+.1f}%)"
|
||||
out.append(line)
|
||||
except Exception as e:
|
||||
out.append(f" {a}: stato trend non calcolabile ({type(e).__name__})")
|
||||
|
||||
Reference in New Issue
Block a user