
    /L_js<                        d Z ddlmZmZmZ ddededefdZddededefdZddededefdZ	d	ed
ede
defdZddedede
dedef
dZ	 	 d dedee   dededededee   fdZd!dedee   dedefdZ	 d!dee   dee   dedee   fdZy)"a  
Strategia del RETTANGOLO - BREAKOUT + RETEST.
Logica (da video 'Diari di Trading' + conferma Mattia):
1. Range = high/low candela daily precedente (ieri, 24h)
2. MAI LONG sul TOP del range (li' ci sono venditori)
3. MAI SHORT sul BOTTOM del range (li' ci sono compratori)
4. MAI tradare nel MID del range (zona caotica)
5. Aspetta che una candela intraday chiuda OLTRE il range (breakout)
6. Aspetta che la candela successiva torni a toccare il livello rotto (retest)
7. Sul retest: pattern 2 candele (prima opposta al segnale, poi Doji/Hammer nella direzione del segnale)
8. ENTRY: limite al TOP (per SHORT) o al BOTTOM (per LONG)
9. SL: leggermente sopra il max candela Hammer (per SHORT) / sotto il min (per LONG)
10. TP: MID range (opzionale: min/max corrente per trailing)
    )ListDictOptionalk
body_ratioreturnc                 \    t        | d   | d   z
        }| d   | d   z
  }|dk(  ry||z  |k  S )Ncloseopenhighlowr   F)abs)r   r   bodyrngs       4/opt/charter-live/live_deploy/rettangolo_strategy.pyis_dojir      sD    qzAfI%&D
F)ah
C
ax#:##    c                     t        | d   | d   z
        }| d   | d   z
  }|dk(  ryt        | d   | d         | d   z
  }|d|z  k\  xr ||z  |k  xr | d   | d   k\  S Nr
   r   r   r   r   F   )r   min)r   r   r   r   lower_shadows        r   has_hammer_bullishr      s    qzAfI%&D
F)ah
C
axqy!G*-%8LAH$`4#:+C`7WXY_W`I``r   c                     t        | d   | d   z
        }| d   | d   z
  }|dk(  ry| d   t        | d   | d         z
  }|d|z  k\  xr ||z  |k  xr | d   | d   k  S r   )r   max)r   r   r   r   upper_shadows        r   has_hammer_bearishr   #   s    qzAfI%&D
F)ah
C
axV9s1V9aj99LAH$`4#:+C`7WXY_W`I``r   curprevsidec                     |dk(  r8|d   |d   k\  }| d   | d   k  }t        |       xs t        |       xs |}|xr |S |d   |d   k  }| d   | d   k\  }t        |       xs t        |       xs |}|xr |S )a  Pattern 2 candele del video 'Diari di Trading':
    - SHORT: candela verde (oppure rialzista) + candela rossa con Doji/Hammer ribassista
    - LONG:  candela rossa (oppure ribassista) + candela verde con Doji/Hammer rialzista
    Returns: True se il pattern e' confermato.
    SHORTr
   r   )r   r   r   )r   r   r    prev_bullishcur_bearishcur_patternprev_bearishcur_bullishs           r   _is_two_candle_patternr(   ,   s     wG}V4'lS[0clL&8&=L++ G}tF|3'lc&k1clL&8&=L++r   spintamartellobody_ratio_minc                 X   |dk(  rSt        |      sy| d   | d   k\  }t        | d   | d   z
        }t        |d   |d   z
        }|dk  ry||z  }|xr ||k\  S t        |      sy| d   | d   k  }t        | d   | d   z
        }t        |d   |d   z
        }|dk  ry||z  }|xr ||k\  S )u{  Pattern 'MARTELLO + SPINTA' (rilassato v3.7, Mavis handoff 2026-07-20 PATTERN_RELAXED).
    - martello: candela con hammer bullish (per LONG) / hammer bearish (per SHORT) — segnale di inversione.
    - spinta: candela successiva con body >= body_ratio_min * body martello, stessa direzione (bullish per LONG).
    Differenza vs pattern 2 candele classico: richiede martello ESPLICITO (non solo bearish) e body ratio minimo.
    Use case: ZEC rompe d1_low, scende a LL, risale con martello UP, candela di spinta → continuazione rialzista.
    Pattern classico NON scatterebbe (manca retest d1_low), ma pattern visivo e' valido.
    LONGFr
   r   r   )r   r   r   )	r)   r*   r    r+   r'   cur_body	prev_bodyr   r$   s	            r   _is_martello_spintar0   B   s     v~!(+Wo7vg78)HV,<<=	>	)
;z^;;!(+Wov6vg78)HV,<<=	>	)
;z^;;r   
prev_dailyintraday_historyidxsl_buffer_pctrequire_two_candlesallow_martello_spintac                    |dk  s|t        |      k\  ry| d   }| d   }||z   dz  }||z
  }	|	dk  ryt        d|      }
d}d}t        ||
z
  |      D ]#  }||   }|d   |kD  rd	}|} n|d   |k  sd
}|} n |y||   }||dz
     }|r|d
k(  rt        |dz   |      D ]  }||   }t        |      s|d   ||   d   kD  r#|dz   |k\  r,||dz      }t	        ||d      sB|d   }|d   }|d|z
  z  }|}dt        |d      t        |d      t        |d      t        |d      t        |d   d      d||   d    d|d    d|d    ddc S  |r|d	k(  rt        |dz   |      D ]  }||   }t        |      s|d   ||   d   k  r#|dz   |k\  r,||dz      }t	        ||d      sB|d   }|d   }|d|z   z  }|}dt        |d      t        |d      t        |d      t        |d      t        |d   d      d||   d    d|d    d|d    ddc S  |d	k(  r|d   |k  r|d   |k  rd}|rt        ||d      }n%t        |      xs t        |      xs |d   |d   k  }|rf|}|d   }|d|z   z  }|}d|t        |d      t        |d      t        |d      t        |d   d      dt        ||   d         z   dz   |rdz   dS dz   dS y|d   |k\  r|d   |k\  rd}|rt        ||d      }n%t        |      xs t        |      xs |d   |d   kD  }|rf|}|d   }|d|z
  z  }|}d|t        |d      t        |d      t        |d      t        |d   d      dt        ||   d         z   dz   |rdz   dS dz   dS y)a  
    Calcola il segnale per la candela intraday corrente (idx in intraday_history).
    prev_daily: candela daily precedente (range di riferimento)
    intraday_history: lista di candele intraday (es. 2H) ordinate cronologicamente
    idx: indice della candela corrente da valutare
    sl_buffer_pct: buffer SL sopra/sotto max/min candela Hammer (default 0.5% se None)
    require_two_candles: True = pattern 2 candele (default video), False = 1 candela (legacy)
    allow_martello_spinta: True = accetta pattern MARTELLO+SPINTA rilassato (v3.7), False = solo pattern classico

    Ritorna None se nessun segnale, altrimenti dict con {signal, sl, tp, entry, reason, sl_ref}.
       Nr   r   r   r   
   r
   updownr-      zbreakout DOWN @ ts=tsz + MARTELLO bullish @ ts=z + SPINTA @ ts=z (pattern rilassato v3.7))signalentryslsl_reftptp_altreasonr"   zbreakout UP @ ts=z + MARTELLO bearish @ ts=Fr   z, retest su TOP, pattern z	2 candelez	1 candelaz, retest su BOTTOM, pattern )
lenr   ranger   r0   roundr   r(   r   str)r1   r2   r3   r4   r5   r6   rng_toprng_botrng_midrng_sizelookbackbreakout_dirbreakout_idxjbarr   prev_barmcand_martellocand_spintar?   rA   r@   rB   
pattern_oks                            r   compute_signalrW   `   s}    Qw#-.. GG A%G H1} 2s|HLL3>3' 	q!w<'!LLw<'!!LL	 
3
Ca(H !7|a'- 	A,Q/M%m4U#&6|&DU&KK1u|*1q51K";vF%e,&u-q=01$"5!_A,#FA.A,#M&$91= 34D\4RSW4X3YYr  tA  BF  tG  sH  HW  Xc  dh  Xi  Wj  jC  D #	4 !5|a'- 	A,Q/M%m4V$'7'Ef'MM1u|*1q51K";wG%f-&v.q=01%"5!_A,#FA.A,#M%$8!< 12B<2PQU2V1WWpq~  @D  rE  qF  FU  Va  bf  Vg  Uh  hA  B 	2 tu: S\W%<J"3C7K
 %S\b-?-DbGWZ[aWbHb
Vq=01%"A,#FA.A,#CJ21C8H8VW[8\4]]9:L_[r	 	 fqr	 	D - v;'!c'lg&=J"3C6J
$S\b-?-DbGWZ[aWbHb
Uq=01$"A,#FA.A,#CK33c:J<:XY]:^6__<=Obu	 	 itu	 	 r   c                     g }t        dt        |            D ]7  }t        | |||      }|s||   d   |d<   |d   |d<   |j                  |       9 |S )zJScansiona tutte le candele intraday e ritorna la lista di segnali storici.r8   dater?   )rF   rE   rW   append)r1   r2   r4   signalsisigs         r   scan_signalsr^      sj    G1c*+,  Z)91mL*1-f5CKw<CLNN3  Nr   klines_dailyklines_intradayc                    g }t        dt        |             D ][  }| |dz
     }| |   }|d   }|dz   }|D 	cg c]  }	||	d   cxk  r|k  sn n|	 }
}	t        |
      dk  rKt        dt        |
            D ]  }t        ||
||      }|s|dz   t        |
      k  r|
|dz      n|
|   }|d   }|d   }|d   }d}|
d	   d
   }t        |dz   t        |
            D ]H  }|
|   }|d   dk(  r|d   |k  rd}|} n-|d   |k\  s'd}|} n|d   |k\  rd}|} n|d   |k  sDd}|} n |d   dk(  r||z
  |z  dz  }n||z
  |z  dz  }|j                  |
|   d   |d   |||||t	        |d      d        ^ |S c c}	w )z
    Backtest della strategia: per ogni candela daily 'ieri', calcola segnali
    sulle candele intraday fino alla prossima daily.
    r8   r=   i \&r   r?   r@   rB   OPENr
   r>   r-   r   SLr   TPd   rY   )rY   r>   r?   r@   rB   outcomeexitpnl_pct)rF   rE   rW   rZ   rG   )r_   r`   r4   tradesdprev_daycur_day	day_startday_endr   	day_intrar\   r]   	entry_barr?   r@   rB   rg   
exit_pricerP   rQ   ri   s                         r   backtestrs     s    F1c,'( .A&q/DM	.. /R19$3Q'3QQR	Ry>A q#i.) #	A 9aGC,-EC	N,B	!a%(	RSILETBTBG"2w/J1q5#i.1 ?lx=F*5zR'"&R
6{b("&R
6{b("&R
5zR'"&R
? 8}&%-6< :-6<MM!!V,h-"" !,	 	5#	.^ MS Ss   E9E9N)g?)g333333?)g      ?){Gz?TT)rt   )__doc__typingr   r   r   floatboolr   r   r   rH   r(   r0   intrW   listr^   rs    r   r   <module>r|      sc   ( '$t $ $ $a$ aE aD aa$ aE aD a, ,D , , ,,< < <C <QV <ae <> MQ15]t ]tDz ] ]"']EI]*.]:B4.]@	T 	T$Z 	PU 	ae 	 %)74: 7T
 7!7-1$Z7r   