
    =_j)                     6   d Z ddlmZ ddlmZ  G d dee      Zdej                  ddd	d
dej                  ddddej                  dddd
dej                  dddd
dej                  ddddej                  ddddej                  dddd ej                  d!d"d#d$d%d&ej                  d'd(dd)ej                  d*d+dd,ej                  d-d.d/d
d0ej                  d1d2dd3ej                  d4d5d6d
d7ej                  d8d9dgZd:efd;Zd<ed=ed:efd>Zd:efd?Zy@)Aap  
paletti
=======

I "paletti" di Mattia: l'elenco delle regole business hard del Charter
che il bot DEVE rispettare in ogni situazione. Ogni paletto e' una
condizione che, se violata, indica un bug o un comportamento anomalo.

Convenzioni:
  - Ogni paletto ha: id, category, description, hard_rule, examples
  - "hard" significa che non c'e' eccezione: se violato, il bot deve
    abortire o rifiutare l'operazione (NO fallback, NO retry, NO override)
  - Le violazioni sono incidenti di business (NON bug di codice) e vanno
    loggate in modo speciale nel verifier

Lista paletti consolidata (fonte: charter_bot_report.html sez. 1-15 +
memory Mattia 2026-07-04):
  - No media-up (no re-entry se posizione gia' aperta)
  - No double-buy su stesso symbol
  - Fee Pine IMPLICITA = 0.06% per lato (mai 0.1% Bybit std)
  - Leva Charter = 3x per TUTTI gli asset (mai simbolo-default)
  - TP 50/50 split (TP1 50% +3%, TP2 50% +5%)
  - SL ATR 2x clamp -3% (mai meno, mai piu')
  - Regime filter EMA50+ADX>20 obbligatorio
  - Max 5 posizioni aperte (deroga 12/07 Mattia)
  - Anti-doppia candela (state.last_signal_bar check)
  - Candela [-2] SEMPRE (mai [-1] in formazione)
  - set_leverage PRIMA di create_market_order
  - Charter primary = AI Enhancer NON riduce size
  - SL nativo Bybit V5 (mark price trigger, sopravvive se bot offline)
  - no upfront leverage override (Bypass solo se gia' 3x)
    )Enum)Optionalc                   (    e Zd ZdZdZdZdZdZdZdZ	y)	PalettiCategoryz4Categoria del paletto (per organizzazione e report).position_sizingrisk_managementsignal_generation	executionstate_management
complianceN)
__name__
__module____qualname____doc__POSITION_SIZINGRISK_MANAGEMENTSIGNAL_GENERATION	EXECUTIONSTATE_MANAGEMENT
COMPLIANCE     )/opt/charter-live/charter_core/paletti.pyr   r   &   s%    >'O'O+I)Jr   r   zP001-NO_MEDIA_UPzNo media-up: se esiste GIA' una posizione aperta su Bybit per il simbolo, NON aprire una nuova entry. NON toccare i TP/SL esistenti (Mattia potrebbe averli messi a mano). Bot in MONITOR mode read-only su quella posizione.zlive_engine.py:391-402z(BUG post 12/07 (no double-buy hard rule))idcategorydescriptionfile_ref
bug_originzP002-NO_DOUBLE_BUYzNo double-buy: non possono esistere 2 entry live attive sullo stesso simbolo via il bot. Anti-doppia candela + check Bybit pre-exec obbligatori.zlive_engine.py:414-424)r   r   r   r   zP003-FEE_PINE_IMPLICITAzFee Pine IMPLICITA = 0.06% per lato (0.0006 in decimale). NON usare 0.1% Bybit standard, NON 0.075% taker ridotto. Fonte: scoperta BUG_003 chiusura vera 16:20 (gap PF 1.4% replica Pine fedele).z+web_solver_v6.py:34 (commission_pct=0.0006)z"BUG_003 (Pine<>Solver replica gap)zP004-LEVA_3X_CHARTERzLeva Charter = 3x per TUTTI gli asset, sempre. Mai usare la leva di default del simbolo (es. ZEC default 3x OK, ma AERO default 1x VIOLA Charter). set_leverage(3) PRIMA di create_market_order, con bypass solo se gia' a 3x.z=live_engine.py:297 + bybit_demo_client.py set_leverage bypasszBUG_004 (ordine senza leva)zP005-TP_50_50zTP 50/50 split: TP1 a +3% (50% size), TP2 a +5% (50% size). Safety: se divisione perde troppo (qty=1, step=1), fallback su TP singolo a TP1 (qty_tp2=0). Mai TP singolo a TP2.z.live_engine.py:237-337 (place_entry_with_tpsl)zP006-SL_ATR_2X_CLAMPzSL ATR 2x clampato a -3% (sl_clamp_min == sl_clamp_max == -0.03). Formula: sl_pct = max(-sl_atr_mult * atr / entry_price, sl_clamp_min), poi min(sl_pct, sl_clamp_max). Hard: mai meno del -3%, mai piu' del -3%.z0live_engine.py:237-280 + SETUPS Charter sl_clampzP007-REGIME_FILTER_EMA50_ADXzRegime filter Pine-faithful obbligatorio: ADX > 20 AND (LONG richiede close[-2] > EMA50[-2]) AND (SHORT richiede close[-2] < EMA50[-2]). SKIP-REGIME se fallisce. Rivalidazione pre-exec al CHECK 5 (riga 427).z"live_engine.py:215-233 + 406 + 427zP008-MAX_5_POSITIONSzDISATTIVATO 2026-07-20 19:58u  MAX_OPEN_TRADES_PORTFOLIO = 5 (deroga Mattia 12/07, regola base era 3). Oltre = SKIP-MAX-OPEN. Charter primary hanno priorita', secondary sono skippate prima. DISATTIVATO 2026-07-20 19:58: Mattia ha chiesto di togliere il limite per massimizzare la casistica entro 1° Agosto 2026. Webhook check rimosso (vedi webhook_receiver.py). La costante resta in charter_config.py per compatibilità import.z9live_deploy/webhook_receiver.py (DISATTIVATO 20/07 19:58)zCDeroga Mattia 2026-07-12 10:20; DISATTIVATO 2026-07-20 19:58 Mattia)r   r   statusr   r   r   zP009-ANTI_DOPPIA_CANDELAzAnti-doppia candela: prima di processare un setup, confronta state.last_signal_bar[setup_name] con timestamp candela [-2]. Se uguale -> SKIP-DUP (gia' processata, no nuova entry).zlive_engine.py:354-359zP010-CANDELA_-2zhSegnale sempre su candela [-2] (chiusa), MAI [-1] (in formazione). Pine-faithful, evita look-ahead bias.z9live_engine.py:151-189 compute_indicators + detect_signalzP011-SET_LEVERAGE_PRIMAzset_leverage(symbol, leverage, side) SEMPRE PRIMA di create_market_order. Charter target 3x. Bypass solo se gia' a 3x (ritorna {retCode: 0, retMsg: 'bypassed ...'}). Se fallisce -> NON procedere con entry.zElive_engine.py:297 (ordine set_leverage prima di create_market_order)zBUG_004 fixz!P012-CHARTER_PRIMARY_NO_AI_REDUCEzSetup Charter primary (is_primary=True): AI Signal Enhancer NON viene chiamato e NON riduce size. Size sempre piena (500/250/250 USDT). Solo secondary hanno MIL dynamic sizing + AI verdict (GO/CAUTELA 50%/SKIP).zlive_engine.py:433-435 + 447zP013-SL_NATIVO_BYBITa%  SL nativo Bybit V5 via set_trading_stop (mark price trigger), eseguito dall'exchange anche se bot offline. Mai SL Python locale (sparisce se bot muore). Fix parziale BUG_005 in bybit_demo_client.py:129-159. Fix completo pending: usare set_trading_stop anche per primo TP invece di limit order.z-bybit_demo_client.py:129-159 set_trading_stopz7BUG_005 (Charter TP/SL non Bybit V5 nativi, OPEN 18:26)zP014-NO_FRONT_LEVERAGE_OVERRIDEzset_leverage bypass: solo se l'asset e' GIA' a 3x su Bybit. Bybit ritorna errore 110043 'leverage not modified' se bypass e' False e leva e' gia' 3x (gestito come OK = non procedere). Mai sovrascrivere leva 3x con un altro valore runtime.z1bybit_demo_client.py set_leverage con bypass flagreturnc                       t        t              S )z0Ritorna il numero totale di paletti documentati.)lenPALETTIr   r   r   total_paletti_countr$      s    w<r   
paletto_idcontextc                      y)a  
    Stub di validazione paletto. NB: la logica di validazione vera
    vive nei sub-repo (live_engine, bybit_demo_client) perche' dipende
    dallo state runtime. Questa funzione ritorna sempre False
    (placeholder) e serve solo come hook per tooling futuro.

    Args:
        paletto_id: ID paletto (es. 'P001-NO_MEDIA_UP')
        context: dict con chiavi dipendenti dal paletto

    Returns:
        True se il paletto e' violato, False altrimenti.
    Fr   )r%   r&   s     r   is_paletto_violatedr(      s      r   c            
      @   dg} | j                  dt                d       | j                  d       i }t        D ]0  }|j                  |d   j                  g       j                  |       2 t        |j                               D ]  \  }}| j                  d| dt        |       d       |D ][  }| j                  d	|d
    d|d   dd  d       d|v r| j                  d|d    d       d|v sE| j                  d|d           ]  dj                  |       S )z=Ritorna un report markdown con l'elenco completo dei paletti.z# Paletti Charter - Report
zTotale paletti: **z**
z
## Per categoria
r   z
### z (z
 paletti)
z- **r   z**: r   NP   z...r   z  - File: ``r   z  - Origine: 
)	appendr$   r#   
setdefaultvaluesorteditemsr"   join)linesby_catpcatr1   s        r   format_paletto_reportr7      s8   +,E	LL%&9&;%<DAB	LL'(F =!J---r299!<=V\\^, @
UvcU"SZL<= 	@ALL4$yQ}-=cr-B,C3GHQ{1Z=/;<q }Q|_,=>?	@@ 99Ur   N)r   enumr   typingr   strr   r   r   r   r   r   r#   intr$   dictboolr(   r7   r   r   r   <module>r>      s  B  c4 $ !#33A
 -@ ##330 -	 (#33$
 B: %#33D
 T3 #33E E	 %#33W G	 -#55<
 9
 %#330D P[" )#44G -	  #55A P (#--6
 \# 2#332
 3
 %#--I DO 0#--E
 H
k`FS 
C $ 4 &s r   