
    	AiS                        U d Z ddlmZ ddlmZmZ ddlmZ ddddd	ddddd	d

Zde	d<   dZ
de	d<   dZde	d<    ed       G d d             Z ed       G d d             Zd ZddZddZy)uk  
APEX V16 — Price Action engine.

Extracts and scores 10 candlestick patterns from a `tech` dict produced
by the indicator pipeline. Reused by brain_tf and brain_mr (the patterns
are the same; only the *reaction rules* differ between the two Brains).

Design:
  - extract_pa_signals(tech)  -> PASignals (typed bool flags)
  - score_pa(signals, dir)    -> PAScore (bullish/bearish/dominant/strength)

Pattern weights are calibrated on V14/V15 historical performance
(stronger reversal patterns get higher weight). The dominant-vs-direction
relation is computed in score_pa() so callers don't have to repeat the
"is this pattern adverse for my direction?" mapping.

Brain code does NOT consume the raw tech keys for patterns anymore;
it always goes through PASignals (single typed source of truth, fixes
V15-pattern style "tech.get('hammer', False)" sprinkled across files).
    )annotations)	dataclassasdict)Final      ?g      ?g?g?g333333?)
hammerbull_engulfingmorning_starpiercing	doji_bullshooting_starbear_engulfingevening_star
dark_cloud	doji_bearzFinal[dict]PATTERN_WEIGHTS)r   r	   r
   r   r   zFinal[tuple]BULLISH_KEYS)r   r   r   r   r   BEARISH_KEYST)frozenc                      e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded	<   dZded
<   dZded<   dZded<   dZded<   dZded<   dZded<   ddZddZddZddZy)	PASignalsz8Typed boolean flags for the 10 PA patterns we recognize.Fboolr   r	   r
   r   r   r   r   r   r   r   volume_weakr   floatcandle_strengthc                N    t         D cg c]  }t        | |      s| c}S c c}w )z2Pretty names of bullish patterns currently active.)r   getattrselfks     ,/home/work/apex_v16/analysis/price_action.pybullish_nameszPASignals.bullish_namesO   s    '<a74+;<<<   ""c                N    t         D cg c]  }t        | |      s| c}S c c}w N)r   r   r   s     r!   bearish_nameszPASignals.bearish_namesS   s    '<a74+;<<<r#   c                    t        |       S r%   )r   )r   s    r!   to_dictzPASignals.to_dictV   s    d|    c                     d fddj                  fdt        D              }dj                  fdt        D              }d| d| S )u   
        Multi-line dump of all 10 patterns with V15 weights.
        Active patterns marked '⭐ (weight)'; inactive shown for completeness
        so the AI sees explicitly what is ABSENT (confluence reasoning).
        c                z    t        t        |             }t        j                  | d      }|  d|rdnd d|ddS )Ng        =u   ⭐   ·(z.1f))r   r   r   get)nameactivewr   s      r!   _fmtz'PASignals.render_explicit.<locals>._fmt_   sF    '$-.F##D#.AV1fU$7q3qAAr)   z, c              3  .   K   | ]  } |        y wr%    .0r    r4   s     r!   	<genexpr>z,PASignals.render_explicit.<locals>.<genexpr>c        7Qa7   c              3  .   K   | ]  } |        y wr%   r6   r7   s     r!   r9   z,PASignals.render_explicit.<locals>.<genexpr>d   r:   r;   z	Bullish: z

Bearish: )r1   strreturnr=   )joinr   r   )r   bullbearr4   s   `  @r!   render_explicitzPASignals.render_explicitY   sF    	B yy7,77yy7,774&D622r)   N)r>   	list[str])r>   dict)r>   r=   )__name__
__module____qualname____doc__r   __annotations__r	   r
   r   r   r   r   r   r   r   r   r   r"   r&   r(   rB   r6   r)   r!   r   r   <   s    B FD  ND  LD  HD  ID  MD  ND  LD  JD  ID  KD  OU ==3r)   r   c                  N    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   y)PAScorea  
    Result of scoring PASignals against a trade direction.

    bullish_score / bearish_score: weighted sums of active patterns.
    dominant: "BULLISH" | "BEARISH" | "NEUTRAL".
    strength: difference (dominant_score - opposing_score), >= 0.
    favor_direction: patterns FAVORING the trade direction (str list).
    adverse_direction: patterns ADVERSE for the trade direction (str list).
    r   bullish_scorebearish_scorer=   dominantstrengthrC   favor_directionadverse_directionN)rE   rF   rG   rH   rI   r6   r)   r!   rK   rK   h   s+     MO  r)   rK   c                    t        | |      rt        | |      }||S |S t        | t              r| j	                  ||      S |S )zFAttribute-or-key getter for TechSnapshot (attrs) or dict (test mocks).)hasattrr   
isinstancerD   r0   )srckeydefaultvals       r!   _grY      sG    sCc3os272#twwsG$$Nr)   c                d   t        t        | dd            }|r(t        t        | dd      xs d      j                         nd}|xr |dv }|xr |dv }t	        t        t        | dd            t        t        | dd            t        t        | d	d            t        t        | d
d            |t        t        | dd            t        t        | dd            t        t        | dd            t        t        | dd            |t        t        | dd            t        t        | dd                  S )a  
    Read pattern flags from a TechSnapshot (preferred) or a dict (legacy
    mock for tests).

    Doji is split into doji_bull / doji_bear via `doji_type`:
      "dragonfly" -> doji_bull
      "gravestone" -> doji_bear
      "standard" or anything else -> neither

    Fields consumed: hammer, shooting_star, bull_engulfing, bear_engulfing,
    morning_star, evening_star, piercing, dark_cloud, doji, doji_type,
    volume_weak, candle_strength.
    dojiF	doji_type )r@   	dragonfly)rA   
gravestoner   r	   r
   r   r   r   r   r   r   r   r   )r   r	   r
   r   r   r   r   r   r   r   r   r   )r   rY   r=   lowerr   r   )sourcer[   r\   is_doji_bullis_doji_bears        r!   extract_pa_signalsrd      s    665)*DBFBv{B/526<<>BI>I)>>L?I)??LBvx/0Bv'7?@"V^U;<bU342fou=>Bv'7?@"V^U;<6<78FM59:b):C@A r)   c           	         t         fdt        D              }t         fdt        D              }||kD  rd}n
||kD  rd}nd}t        ||z
        }|j	                         dk(  }|r j                         n j                         }|r j                         n j                         }t        t        |d      t        |d      |t        |d      ||      S )	a  
    Score signals against a trade `direction` ("BUY" | "SELL").

    Bullish score = sum of weights of active bullish patterns.
    Bearish score = sum of weights of active bearish patterns.
    Strength is the (signed) advantage of the dominant side.

    For BUY:  favor = bullish patterns,  adverse = bearish patterns
    For SELL: favor = bearish patterns,  adverse = bullish patterns

    Direction is case-insensitive.
    c              3  J   K   | ]  }t        |      st        |     y wr%   r   r   r8   r    signalss     r!   r9   zscore_pa.<locals>.<genexpr>        Oa77A;Nq!O   ##c              3  J   K   | ]  }t        |      st        |     y wr%   rg   rh   s     r!   r9   zscore_pa.<locals>.<genexpr>   rj   rk   BULLISHBEARISHNEUTRALBUY   )rL   rM   rN   rO   rP   rQ   )	sumr   r   absupperr"   r&   rK   round)	ri   	directionr@   rA   rN   rO   is_buyfavoradverses	   `        r!   score_parz      s     O<OODO<OODd{	4$;H__%'F'-G!!#73H3H3JE)/g##%W5J5J5LGD!nD!nx#! r)   N)r>   r   )ri   r   rv   r=   r>   rK   )rH   
__future__r   dataclassesr   r   typingr   r   rI   r   r   r   rK   rY   rd   rz   r6   r)   r!   <module>r~      s   * # )    l l  $(3 (3 (3V $! ! !, N$r)   