+
    i                     H   R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIt^ RI	t
^ RIt]P                  ! R4       . ROtRtRtRt^<tRR ltR tR	 tR
 tR R ltR tR tR!R ltR tR"R ltR#R ltR tR$tR t R t!R t"R t#Rt$R t%R t&R t'R t(R t)]*R8X  d
   ])! 4        R# R# )%u  
swing_trader.py — EWT + DeMark Swing Trading Agent
Eligio Peraza / Karina AI — VPR Capital

Modes:
  scan              — Scan watchlist, print only ACTIONABLE setups with entry/exit
  analyze TICKER    — Deep single-asset analysis
  backtest TICKER [YEARS] — Historical stress test with accuracy metrics

Data: Yahoo Finance (yfinance)
Timeframes: Weekly (trend), Daily (signal), 4H (execution)
N)datetime	timedeltaignoregQ?      @gS?c                     \         P                  ! WVR RR7      p\        VP                  \        P
                  4      '       d!   VP                  P                  ^ 4      Vn        VP                  RR7       V# )FT)periodintervalprogressauto_adjustinplace)yfdownload
isinstancecolumnspd
MultiIndexget_level_valuesdropna)tickerr   r   dfs   &&& 6/Users/vpragent/.openclaw/swing-trader/swing_trader.pyfetchr   $   sU    	VX[_	`B"**bmm,,ZZ003
IIdII    c                     \        V R R4      # )2y1wkr   ts   &r   fetch_weeklyr    +   s    E!T511r   c                     \        V R R4      # 1y1dr   r   s   &r   fetch_dailyr%   ,   s    E!T400r   c                     \        V R R4      pVP                  '       d   V# VP                  R4      P                  RRRRRRR	R
RR/4      P	                  4       pV# )60d1h4hOpenfirstHighmaxLowminCloselastVolumesum)r   emptyresampleaggr   )r   r   s   & r   fetch_4hr7   -   s\    	q%	B	xxx	T			wveE%PVW_`ef	g	n	n	pBIr   c                     V R ,          V R,          V R,          rCp\         P                  ! W#,
          W$P                  4       ,
          P                  4       W4P                  4       ,
          P                  4       .^R7      P	                  ^R7      pVP                  V4      P                  4       P                  R,          p\         P                  ! V4      '       d5   V R ,          V R,          ,
          P                  V4      P                  4       p\        V4      #   \         d2    \        T R ,          T R,          ,
          P                  4       4      u # i ; i)r,   r.   r0   axis)r   concatshiftabsr-   rollingmeanilocisnatailfloat	Exception)r   r   hlctrvals   &&     r   atrrK   6   s    	6V*biGaYYGGI224q779}6I6I6KLSTUYY_`Yajj %%',,R0773<<f:5	)//7<<>CSz 6bj2e9,224556s   DD 9EEc                 N    V R ,          P                  V4      P                  4       # )r0   )r?   r@   )r   ns   &&r   smarN   B   s     g;q!&&((r   c                V   V R,          P                   p\        V4      p^ p^ pRpRp. p. p^ ;r\        ^V4       F  pW,          W^,
          ,          8  d   V	^,          p	^ p
M>W,          W^,
          ,          8  d   V
^,          p
^ p	M\        ^ V	4      p	\        ^ V
4      p
VP	                  V	4       VP	                  V
4       K  	  V'       d
   VR,          M^ pV'       d
   VR,          M^ p\        V4      ^8  d   VRR MTp\        V4      ^8  d   VRR MTp\
        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      p\
        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      p\
        ;QJ d    R VRR  4       F  '       g   K   RM	  RM! R VRR  4       4      p\
        ;QJ d    R VRR  4       F  '       g   K   RM	  RM! R VRR  4       4      pV^8  ;'       g    V^8  pR	\        V4      R
\        V4      RVRVRVRVRV/# )z
Calculate TD Sequential buy/sell setup counts.
Returns: (buy_count, sell_count, completed_9_buy, completed_9_sell,
          completed_13_buy, completed_13_sell, recycled)
r0   FNc              3   *   "   T F	  q^	8  x  K  	  R# 5i	   N .0vs   & r   	<genexpr> td_sequential.<locals>.<genexpr>f   s     6:a6:   Tc              3   *   "   T F	  q^	8  x  K  	  R# 5irQ   rS   rT   s   & r   rW   rX   g   s     7;a6;rY   c              3   *   "   T F	  q^8  x  K  	  R# 5i   NrS   rT   s   & r   rW   rX   j   s     >-=G-=rY   c              3   *   "   T F	  q^8  x  K  	  R# 5ir\   rS   rT   s   & r   rW   rX   k   s     ?->G->rY   	buy_count
sell_countcompleted_9_buycompleted_9_sellcompleted_13_buycompleted_13_sellrecycledr;   i)valueslenranger-   appendanyint)r   closerM   r_   r`   ra   rb   
buy_countssell_countsbcsci
recent_buyrecent_sellrc   rd   re   s   &                r   td_sequentialru   E   s    wKEE
AIJO JKKB1a[8eaCj !GB!RXc
"!GB!RQB#a*R"2  %/BQI$/RQJ '**o&:*RS/
J&)+&6!&;+bc"Ks6:6sss6:66Os7;7sss7;77 >Z-=>>Z-=>>?[->??[->?? 2~00bH 	S^c*o_--.H r   c                    V R,          P                   V) ^,
          R p\        V4      V^,           8  d   R# \        ^\        V4      4       Uu. uF!  q2V,          W#^,
          ,          8  d   ^MRNK#  	  ppV^ ,          VR,          8g  # u upi )z4Check if price direction flipped in the last N bars.r0   NFr;   )rg   rh   ri   )r   barsrH   rr   dirss   &&   r   
price_flipry   z   s|    
7D578$A
1vQu05aQ0@A0@11A#AB&0@DA7d2h Bs   'Bc                
   \        V ^4      P                  R,          p\        V ^24      P                  R,          p\        V^4      P                  R,          p\        V^24      P                  R,          p\        V^4      P                  R,          pV R,          P                  R,          pVR,          P                  R,          pYru;8  d   V8  d   M MRp	M%Yru;8  d   V8  d   M MRp	MW#8  d
   Wr8  d   Rp	MRp	V'       d   WF,
          V,          ^d,          M^ p
Yu;8  d   V8  d   M MRpM*Yu;8  d   V8  d   M MRpMV
R8  d   R	pMV
R8  d   R
pMRpV	R9   d   VR9   d   RpMV	R8X  d   VR9   d   RpMRpWV3# )zL
Simplified EWT phase detection.
Returns: (weekly_phase, daily_phase, bias)
r0   
impulse_upimpulse_downcorrection_in_uptrend
transitionuptrend	downtrend皙?accumulationdistributionsidewaysBULLISHBEARISHNEUTRALr;   rf   gr{   r}   )r   r   )r   r   )rN   rA   )	df_weeklydf_dailywma20wma50dma20dma50
dma20_prevw_closed_closew_phased_sloped_phasebiass   &&           r   trend_phaser      si   
 	2##B'E	2##B'E"""2&E"""2&EXr"''+J %%b)Gw$$R(G 		 5	  	7?) :Du!Z/#5G		 5	 	3 	4  99gId>d	N	"w2O'OT!!r   c                   V P                  V4      pVR,          P                  4       pVR,          P                  4       pWC,
          pV^ 8X  d   W4W3V3# VRV,          ,
          pVRV,          ,
          pV\        V,          ,           pW4WgV3# )z
Identify swing high/low in lookback window and compute Fibonacci levels.
Returns: (swing_low, swing_high, fib_50, fib_618, fib_1618_ext)
r.   r,         ?-?)rC   r/   r-   FIB_EXT)	r   lookbacksubset	swing_low
swing_highrngfib_50fib_618fib_exts	   &&       r   fibonacci_levelsr      s    
 WWXF""$I##%J

 C
axiJFF53;&F53;&G7S=(G&7::r   c                ~   V P                  V4      pVR,          P                  ^RR7      P                  4       P                  4       pVR,          P                  ^RR7      P	                  4       P                  4       pVP                  ^4      P                  4       pVP                  ^4      P                  4       pWe3# )zSimple pivot-based S/R.r,   T)centerr.   )rC   r?   r-   r   r/   nlargestr@   	nsmallest)r   r   r   
resistancesupportkey_resistancekey_supports   &&     r   support_resistancer      s    WWXF''$'7;;=DDFJ&&q&6::<CCEG((+002N&&q)..0K&&r   c                n
   VP                   '       g   VP                   '       d   R# \        VR,          P                  R6,          4      p\        V4      p\	        W4      w  rxp	\        V4      p
VP                   '       g   \        V4      MT
p\        V4      w  rrp\        V4      w  pp\        V4      pRpRVP                  9   dz   VR,          P                  4       ^ 8  d^   VR,          P                  ^4      P                  4       P                  R6,          pVR,          P                  R6,          pVVR,          8  pRp^ pV	R8H  VR79   V
R,          ;'       g
    VR,          W_R,          8*  VVR	,          8  T;'       g    T.pV	R
8H  VR89   V
R,          ;'       g
    VR,          W^R	,          8  VVR,          8*  T;'       g    T.p\        V4      p\        V4      pVR8H  ;'       d    \        V4      R,          pVR99   pW_R,          8*  pW^R	,          8  p V^8  d   V'       g   V'       d   V'       d   RpTpM#V^8  d   V'       g   V '       d   V'       d   RpTpVf-   RT RRRRRTRT	RT
RV
R,          ;'       g
    VR,          RVRV/	# VR8X  dw   \        V^4      p!\        \        WVR,          ,
          4      ^4      p"\        V!V",
          4      p#\        V!V#R,          ,           ^4      p$\        V!V#R,          ,           ^4      p%Mu\        V^4      p!\        \!        WVR,          ,           4      ^4      p"\        V"V!,
          4      p#\        V!V#R,          ,
          ^4      p$\        V!V#R,          ,
          ^4      p%\        V!V",
          4      p#\        V$V!,
          4      p&V#^ 8  d   \        V&V#,          ^4      M^ p'V'\"        8  d    RV RRRRRVRV	RV
RV
R,          RRRV'RVRV/# R V 9   g   R!V 9   d   RM
R"V 9   d   R#MR$p(V#V(,          p)V)'       d   \%        V\&        ,          V),          4      M^ p*\        V*V!,          ^4      p+^(V^
,          ,           p,V'       d
   V,^,          p,V
R,          '       g
   V,^,          p,\        V,^_4      p,V
R,          ;'       g
    VR,          p-/ RV bRVbRV,\(        8  bRVbRV	bRVbRVbR%\        V^4      bRV
bR&VbR'VbR(\        V^4      bR)\        V^4      bR*\        V^4      bR+\        V^4      bR,\        V^4      bR-V!bR.V"R/V$R0V%RV'R1V*R2V+R3V,RV-R4R5/	C# ):z?
Apply all logic gates and return a trade idea dict (or None).
Nr0   Tr2   g?r   ra   RQ?g\(\?r   rb   r{   rc   LONGSHORTr   	directionr   
actionableFcurrent_pricer   td_dailyre   r   r   g      ?r   g      @rr_rejectedrrBTCETHUSDg333333?      ?rK   td_4hry   r   r   r   r   r   entry	stop_losstake_profit_1take_profit_2sharesposition_sizeprobabilityholding_days_targetz2-8 daysr;   )r   r   r   )r   r   r   r   )r4   rD   rA   rK   r   ru   r   r   ry   r   r3   r?   r@   roundr/   r>   r-   RR_MINrl   RISK_PCTPROB_THRESHOLD).r   r   r   df_4haccountr   atr14r   r   r   td_dr   r   r   r   r   r   r   r   flip
has_volumeavg_vollast_volr   entry_score	long_cond
short_cond
long_scoreshort_scoreweekly_exhaustedweekly_impulse_upfib_confluence_longfib_confluence_shortr   slrisktp1tp2rewardr   volatility_multrisk_adjr   pos_sizeprobre   s.   &&&&&                                         r   build_signalr      s    ~~~(7+0045MME )=Gd (#D(-M% E 7Gx6P3I6G"4X">K hD J8###(:(>(>(@1(D8$,,R0557<<R@H%**2.3.
 IK 		::;;5):#;4't++
I 		<< ==E*<$=$&$..
J i.Jj/K ,.aaM)4LM_4`  #JJ )dN:(TM9 Q/4GD	 		"38LQU	!&+y,D*d:.>.S.S%
BS7Iw8 	8 F}a(s9eck&ABAFURZutcz)1-utcz)1-}a(s:us{'BCQGR%Zutcz)1-utcz)1-_DuF(,qU6D=!$aB 
F{&+y,D*d:.>tT27Iw	8 	8 #f_cUV\_cbeOo%H7?sGh&(23QFVe^Q'H b  D4194
TQYTtR=DJ445#4H	 	. 		
 	 	 	 	eQ 	 	 	 	k1- 	%2 	fa( 	gq)  	gq)!" 	#$ 	z5 r   c                 R    R V9   d   V R # RV9   d   RV9  d   RV9  d   V R # V R # )JPYz.3fr   r   r   z.4f.2frS   )pr   s   &&r   	fmt_pricer   d  s=    !C)5.53FRSTWQXHYWr   c           	         V R ,          pV R,          pV P                  R/ 4      p\        R\         24       \        RRR RV 24       \        \         4       \        R4       \        R\        W24       24       \        R	V P                  R
R4       24       \        RV P                  RR4       24       \        RV P                  RR4       24       \        RV P                  RR4       24       \        R\        V P                  R^ 4      V4       24       \        R\        V P                  R^ 4      V4       24       \        R\        V P                  R^ 4      V4       24       \        R\        V P                  R^ 4      V4       24       \        RVP                  R^ 4       RVP                  R^ 4       24       \        RVP                  RR 4       RVP                  R!R 4       24       \        R"V P                  R#R 4       24       V P                  R$4      '       d   \        R%4       V P                  R&R'4      p\        R(4       VR'8X  dL   \        R)4       V P                  R*4      '       d(   \        R+V P                  R,^ 4      R- R.\        R/ 24       EMEVR08X  d   R1MR2p\        R3V 24       \        R44       \        R5\        V R6,          V4       24       \        R7\        V R8,          V4       R924       \        R:\        V R;,          V4       24       \        R<\        V R=,          V4       24       \        R44       \        R>V R,,          R- R?V R,,          \        8  d   R@MRA RB24       \        RCV RD,           REV RF,          RG RB24       \        RHV\
        ,          RG RIVRG RB24       \        RJV RK,           24       \        RLV RM,           RN24       \        \         R24       RO# )Pr   r   r   
  u   📊 ANALYSIS uv   
  ── CURRENT MARKET FACTS ─────────────────────────────z  Price:          z  ATR(14):        rK   N/Az  Overall Bias:   r   z  Weekly Trend:   r   z  Daily Trend:    r   z  Key Support:    r   z  Key Resistance: r   z  Fib 50%:        r   z  Fib 61.8%:      r   z  TD Daily:       Buy=r_   z  Sell=r`   z  Completed 9:    Buy=ra   Frb   z  Price Flip:     ry   re   u>     ⚠️  RECYCLED COUNT RISK — momentum may override signalr   r   uJ   
  ── PROJECTED OUTCOME  [Possible Outcome — Not a Guarantee] ──z#  No actionable setup at this time.r   u     ❌ R:R of r   r   z is below minimum .1fr   	   🟢 LONG
   🔴 SHORTz  Signal:         u     ────────────────────────────────────────────────────u     🎯 ENTRY:       r   u     🛑 STOP LOSS:   r   u     ← Wave invalidationu"     💰 TAKE PROFIT 1 (1.618 Fib): r   u#     💰 TAKE PROFIT 2 (TD-13 zone): r   z  R:R Ratio:      z:1  (u   ✅ PASSu   ❌ FAIL)z  Position Size:  r   z
 units  ($r   ,.0fz  Risk Amount:    $z  (1.5% of $z  Holding Target: r   z  Probability:    r   %N)getprintSEPr   r   r   )sigr   r   r   tddarrows   &&     r   print_signalr   i  s   HAOA	R	 B	Bse*	Ba 1#
&'	SEO	  D  F	y/
01	swwue45
67	swwvu56
78	swwy%89
:;	swwy%89
:;	y)BAFG
HI	y1A1)EqIJ
KL	y1)=qAB
CD	yA)>BC
DE	"266+a#8"9UVAW@X
YZ	"266*;E#B"C7266RdejKkJl
mn	sww|U;<
=>
wwzNPY'A	WYI~3577=!!M#''$"23!77I&QTVW F{"5'*+  o  	q$Ys7|Q%?$@AB$Ys;/?%C$DD[\]29S=QST3U2VWX3Ic/>RTU4V3WXY  o  	q"3t9S/SYRXEXz^h6iijkl"3x=/C<PQU;VVWXY#Gh$6t#<LQUVWXY"3'<#=">?@"3}#5"6a89	SE*r   c                 F   \         P                  ! 4       p\        R \         24       \        R4       \        RVP	                  R4       RV R 24       \        \        4       . p\
         EF  p\        P                  P                  RV R24       \        P                  P                  4         \        V\        V4      \        V4      \        V4      V 4      pV'       dK   VR,          '       d<   \        VR	,          R
8X  d   RMR RVR,           R24       VP                  V4       K  V'       d   VP                  RR4      MRpV'       d   VP                  R4      '       d   RMRp\        RV 24       EK  	  \        R \         24       V'       g   \        R4       \        \        4       R# \        R\#        V4       R24       \        \        4       V EF  pVR,          pVR	,          R
8X  d   RMRp\        RV RV R\%        VR ,          V4       24       \        R!\%        VR ,          V4       24       \        R"\%        VR#,          V4       24       \        R$\%        VR%,          V4       24       \        R&\%        VR',          V4       24       \        R(VR),          R* R+VR,           R,VR-,           R.24       VP                  R4      '       g   EK  \        R/4       EK  	  \        R \         24        \'        R0R14      ;_uu_ 4       p	\(        P*                  ! R2VP-                  4       R3V/V	^\.        R47       RRR4       R#   \          d   p\        RT 24        Rp?EK
  Rp?ii ; i  + '       g   i     R# ; i  \          d     R# i ; i)5r   u     SWING TRADER — SCAN MODEr   %Y-%m-%d %H:%M  |  Account: $r     Scanning ... r   r   r   u   LONG ✅u
   SHORT 🔴u    — r   r   r   r   ERRre   z  [!RECYCLED]r   neutralzerror: Nz*  No actionable setups found at this time.z ACTIONABLE SETUP(S) FOUND:r   r   r   z
    @  r          🎯 Entry:          🛑 SL:      r          💰 TP1:     r          💰 TP2:     r   	    R:R: r   r   :1  |  Prob: %  |  Size: r   z unitsu       ⚠️  RECYCLED COUNT RISK/tmp/swing_analysis.jsonw	scan_timeresultsindentdefault)r   nowr   r   strftime	WATCHLISTsysstdoutwriteflushr   r    r%   r7   rj   r   rE   rh   r   openjsondump	isoformatstr)
r   r  r   r   r   r   recycled_flager   fs
   &         r   	mode_scanr     s   
,,.C	Bse*	(*	Bs||,-.ogd^
LM	#JJY

;qc./


	!q,q/;q>8A;PWXCs<((s;'7'?\RRWX[\iXjWkklmn!!#&14swwvu-%36377:;N;NTV/0  
Bse*:;c
	Bs::
;<	#JM{+V3KQCr!E)CL!"<!=>?"9S\1#=">?@"9S-=q#A"BCD"9S-A1#E"FGH"9S-A1#E"FGH	#d)Cc-6H5IVYZbVcUddjkl77:35  
Bse*,c22aII{CMMOY
KQWXbef 32/  	!GA3-  	!. 322 sg   1A M29M-M5MM(MN 1M=N M: M55M:=N	N N N N c           	      \   V P                  4       p \        R \         24       \        RV  24       \        R\        P                  ! 4       P                  R4       RVR 24       \        \        4        \        V \        V 4      \        V 4      \        V 4      V4      p\        W!4       \        RR4      ;_uu_ 4       p\        P                  ! W#^\        R7       R	R	R	4       \        R
4       R	#   + '       g   i     L; i  \         d   p\        RT  RT 24        R	p?R	# R	p?ii ; i)r   u     SWING TRADER — ANALYZE: r   r   r   r   r
  r  r  Nz*  Output saved to /tmp/swing_analysis.jsonz  Error analyzing z: )upperr   r   r   r  r  r   r    r%   r7   r   r  r  r  r  rE   )r   r   r   r  r  s   &&   r   mode_analyzer#    s    \\^F	Bse*	(
12	Bx||~&&'789QU
WX	#J26<#7V9LhW]N^`ghS",c22aIIcQ4 3:; 32  2"6("QC0112s1   5A	D >C1D 1D	<D D+D&&D+z
2020-01-01c                    V P                  4       p \        R \         24       \        RV  R\         R24       \        R4       \        \        4       \        P
                  ! 4       P                  R4      p\        P                  ! V \        VRRRR	7      p\        P                  ! V R
VRRRR	7      pWE3 F_  p\        VP                  \        P                  4      '       d!   VP                  P                  ^ 4      Vn
        VP                  RR7       Ka  	  VP                  '       d   \        RV  24       R# \        RVP                   ^ ,          P#                  4        RVP                   R,          P#                  4        24       \        R\%        V4       24       \        R4       . pRpRp	^Pp
\'        V
\%        V4      4       EF  pVP(                  RV pWUP                   VP                   R,          8*  ,          pV'       Ed   V	'       Ed   VP(                  R,          pWR,          ,
          pV	R,          R8X  d   VR,          V	R,          8*  MVR,          V	R,          8  pV	R,          R8X  d   VR,          V	R,          8  MVR,          V	R,          8*  pV^-8  pV'       g   V'       g	   V'       d   V'       d
   V	R,          M"V'       d
   V	R,          M\+        VR,          4      pVV	R,          ,
          V	R,          ,          pV	R,          R8X  d   V) pT	P-                  R\/        V^4      RVP                   R,          RTR \/        V^d,          ^4      R!TR"V'       d   R#MV'       d   R$MR%R&V^8*  /4       VP1                  V	4       RpRp	EK  V'       d   EK  \%        V4      ^8  g   EK   \3        WV\        P4                  ! 4       V4      pV'       Ed    VP7                  R'4      '       d   RTR(VP                   R,          RVR,          RVR,          RVR,          RVR,          R)VR),          R*VR*,          R+VP7                  R+R4      R,VR,          P(                  R,          VR-,          R.,          8*  R/VR0,          R18g  R2VR3,          P7                  R44      ;'       g    VR3,          P7                  R54      R6VP7                  R6R4      /p	RpEK  EK  EK  	  V'       g   \        R74       R# V Uu. uF  pVR!,          '       g   K  VNK  	  ppV Uu. uF  pVR!,          '       d   K  VNK  	  ppV Uu. uF  pVP7                  R&R4      '       g   K  VNK!  	  ppV'       d#   \%        V4      \%        V4      ,          ^d,          M^ pV'       d.   \:        P<                  ! V Uu. uF  pVR ,          NK  	  up4      M^ pV'       d.   \:        P<                  ! V Uu. uF  pVR ,          NK  	  up4      M^ p\?        R8 V 4       4      p\A        \?        R9 V 4       4      4      pV'       d
   VV,          MR:pV'       d.   \:        P<                  ! V Uu. uF  pVR,          NK  	  up4      M^ p R;.p!V F7  pV!P1                  V!R,          ^VR ,          ^d,          ,           ,          4       K9  	  V!^ ,          p"^ p#V! F2  p$\C        V"V$4      p"V"V$,
          V",          ^d,          p%\C        V#V%4      p#K4  	  V#'       d   V!R,          V!^ ,          ,
          V#,          MR:p&\        PD                  ! \        4      p'VP                   R,          p(\C        V(V',
          PF                  R<,          R=4      p)V!R,          R;,          p*V*^V),          ,          ^,
          ^d,          p+VV+^d,          ,          p,\+        VR,          P(                  ^ ,          4      p-\+        VR,          P(                  R,          4      p.V.V-,          p/V/^V),          ,          ^,
          ^d,          p0VV0^d,          ,          p1V+V0,
          p2\        PH                  ! V Uu. uF  pVR ,          NK  	  up4      p3\%        V34      ^8  d   V3PK                  4       \:        PL                  ! ^\C        \:        P<                  ! V Uu. uF  pVR,          NK  	  up4      ^4      ,          4      ,          p4V4^ 8  d   V+R>,
          V4,          MR?p5MR?p5V Uu. uF  pVP7                  R/4      '       g   K  VNK   	  p6pV Uu. uF  pVP7                  R,4      '       g   K  VNK   	  p7pV Uu. uF  pVP7                  R24      '       g   K  VNK   	  p8pV Uu. uF  pVP7                  R64      '       g   K  VNK   	  p9pV Uu. uF  pVP7                  R+4      '       g   K  VNK   	  p:pR@ p;RRA lp<\        RB4       \        RCRDRE RFRGRH RFRIRH RFRJ 24       \        RCR RFR RFR RFR 24       \        RCRKRE RFRLRH RFVRM RN2RH RFV<! V^7^A4       24       \        RCRORE RFRPRH RFVRQ RH RFV<! VRR4       24       \        RCRSRE RFRTRH RFV RM RU2RH RFV<! V ^^4       24       \        RCRVRE RFRWRH RFV#RM RN2RH RFV<! V#^
RRX7       24       \        RCRYRE RFRZRH RFV&RM RH RFV<! V&R[4       24       V+R\ R]V,R^ R2p=\        RCR_RE RFR`RH RFV=RH RFV<! V+^4       24       V0R\ R]V1R^ R2p>V2^ 8  d   RaMRbp?\        RCRcRE RFRdRH RFV>RH RFRe 24       \        RCRfRE RFRgRH RFV2R\ Rh2RH RFV? 24       \        RCRiRE RFRjRH RFV5RQ RH RFV<! V5Rk4       24       \        Rl\%        V4       Rm\%        V4       Rn\%        V4       24       \        Ro\%        V4       Rp\%        V4      \%        V4      ,          ^d,          Rq Rr24       \        RsVRM RtVRM Ru24       \        Rv4       \        Rw\%        V64       RxV;! V64       24       \        Ry\%        V74       RxV;! V74       24       \        Rz\%        V84       RxV;! V84       24       \        R{\%        V94       RxV;! V94       24       \        R|\%        V:4       RxV;! V:4       24       \        R \         24        R}V R~VRVRVRV RV#RV&R\%        V4      RV/	p@\O        RR4      ;_uu_ 4       pA\P        PR                  ! V@VA^\T        R7       RRR4       \        R4       R#   \8         d     EKL  i ; iu upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi u upi   + '       g   i     Lq; i  \8         d     R# i ; i)r   u     BACKTEST — z (desde r   z<  Strategy: EWT Phase + TD Sequential 9/13 + Fibonacci 1.618z%Y-%m-%dr$   FT)startendr   r	   r
   z
2019-01-01r   r   z  No data for Nz  Data range: u    → z  Total bars: z  Scanning for setups...
bar_inr   r   r.   r   r,   r   r0   r   r   
exit_price	exit_date	bars_heldpnl_pctwinexit_reasonTPSLTIMEOUTswing_trader   
entry_dater   r   re   fib_confluencer   r   with_weekly_trendr   r   
td9_maturer   ra   rb   ry   z)  No trades were executed in this period.c              3   2   "   T F  qR ,          x  K  	  R# 5ir+  NrS   rU   r   s   & r   rW    mode_backtest.<locals>.<genexpr><  s     2T||T   c              3   2   "   T F  qR ,          x  K  	  R# 5ir7  rS   r8  s   & r   rW   r9  =  s     8AY<<r:  g     8@g      Y@g     v@r   g      @g        c                     V  Uu. uF  qR ,          '       g   K  VNK  	  ppV '       d'   \        V4      \        V 4      ,          ^d,          R R2# R# u upi )r,  .0fr   r   )rh   )r   r   r  s   &  r   win_pctmode_backtest.<locals>.win_pcto  sL    +1E((QQ+39#a&V$S(-Q/DuD ,s
   AAc                 v    V'       d   Yu;8*  ;'       d    V8*  Mu pMV'       d   W8  MW8*  pV'       d   R # R# )   ✅   ⚠️ rS   )rJ   goal_logoal_hihigher_betteroks   &&&& r   statusmode_backtest.<locals>.statust  s/    **7*B#0cnBu)	)r   ur   
  ══ STRATEGY ACCURACY METRICS ══════════════════════════r   Metricz<22 Goalz<14ResultStatuszWin Rateu   55–65%r   r   zProfit Factorz> 2.0r   g       @zAvg Win Durationu
   5–8 Daysz dayszMax Drawdownz< 10%)rE  zRecovery Factorz> 3.0r   z+.1fz%/yr  ($z+,.0fzRendimiento Anualiz.z> 8%/yrrA  rB  zBuy & Hold (CAGR)	benchmarku   —zAlpha vs. B&Hz> 0%z%/yrzSharpe Ratioz> 1.0r   z
  Total trades:   z  |  Wins: z  |  Losses: u     Swing trades (≤15d): z (r=  z%)z  Avg win: +z%   Avg loss: z%
u|     ── QUALITATIVE BREAKDOWN ───────────────────────────────z  With Weekly Trend:    u    trades → Win rate: z  Fib Confluence:       z  Mature TD-9 Signal:   z  Price Flip Confirm:   z  Recycled Count Risk:  r   yearswin_rateprofit_factoravg_duration_daysmax_drawdownrecovery_factortotal_tradestradesz/tmp/swing_backtest.jsonr  r  z,  Results saved to /tmp/swing_backtest.json
r;   )NTz----------------------z--------------------)+r"  r   r   BACKTEST_STARTr   r  r  r   r   r   r   r   r   r   r   r4   indexdaterh   ri   rA   rD   updater   rj   r   	DataFramer   rE   npr@   r3   r>   r-   	TimestampdaysSeriesstdsqrtr  r  r  r  )Br   rO  r   end_dater   r   r   rV  in_positionentry_tradeMIN_BARSrr   
hist_dailyhist_weeklycurrr*  hit_slhit_tptimeoutr(  r+  r   r   winslossesswing_tradesrP  avg_winavg_lossgross_profit
gross_lossrQ  avg_durationequitypeakmax_ddr  ddrT  
start_dateend_date_tsyears_elapsedtotal_returnannualized_returnannualized_dollarbh_start_pricebh_end_pricebh_totalbh_cagr	bh_dollaralpha
pnl_seriesvolsharpe
with_trend
fib_tradesmature_9flip_tradesrecycled_tradesr>  rG  ann_strbh_str
alpha_iconresultr  sB   &&&                                                               r   mode_backtestr    s   \\^F	Bse*	OF88N+;1
=>	HJ	#J ||~&&z2HF.hQU`eswxHF,hQVaftxyI#bjj"--0044Q7BJ
		$	 $
 ~~~vh'(	N8>>!,1134E(..:L:Q:Q:S9T
UV	N3x=/
*+	&(FKKH8S]+mmBQ'
:3C3CB3G GH;;;??2&D11I DO{C[_eCeT%[[%==kopvkw  |G  HS  |T  lTFEPQ\E]agEgT&\[%AAmqrwmx  ~I  JY  ~Z  nZF"nG79?[5flkRaFbrwx|  ~E  yF  sG
%G(<<G@TT{+w6&hG"" %
A"6*"2"22"6)%#q"9&!64I!9?$  k*#" {s;/25"6
BLLNT[\3377<00 $
(8(8(<G#K(8'_)=#K(8D	%M(:"
E(B(*W*=*B*B2*F#i.[_J_*_+S[I-E$J(;(;<M(N(y(yRUV`RaReRefxRy$e(D#K #'K! 13I ,p 9: #/FqahhFD/"3Fq!E((FF3%Dv!}d)CAAvLD17D	CK'#-QH;?t4t!9t45qG;Av6v!9v67qH2T22Ls8889J1;L:-M ?C277D9DqAkNND9:L WFfRjA)s(:$:;< !9DF4|Qh$$VR 
 <BvbzF1I-7uO n-J..$Kz177&@#FM2J&L%!m*;<q@CG#4s#:; 8G,11!45N8G,11"56L"^3H1}#459S@G#.I&0E &9&QAiLL&9:J
:nns277TZ;[TZqAkNNTZ;[3\^_/`)`!aa47!G#c)S0 $BVquu-@'A!!VJB#?Vquu-='>!!VJ?#;Vquu\':!!VH;$<fl(;11fK<"(>&QAEE*,=qq&O>E
* 
  B	BxnAfS\8C.(
DE	Bvhaxq%
12	Bz#a
3/qHS>1CC0H&QY[]_aJbIc
de	Bs#1WSMmC5H#2NaPVWdfiPjOk
lm	B!#&aS'9l3=Ou;UVY:ZZ[\bcoqrtu\v[w
xy	B~c"!GC=VCL2B31GqPVXZjoIpHq
rs	B %Qwsm17Lc4RRSTZ[jloTpSq
rs"4(1B50IKG	B%c*!Ic?!GC=&QbdeJfIg
hihy&7q9F1*)J	B"3'qS(96#,aw
OP	Bs#1VCLU4L2Ec1J!J<
XY	B~c"!GC=VCL#1FavWZH[G\
]^	 V[T=QTU[Q\P]
^_	%c,&7%83|;LSQW[;XY\;\]`:aac
de	L^HS>
EF	  I  K	$S_$55KGT^L_K`
ab	$S_$55KGT^L_K`
ab	$S]O3I'RZJ[I\
]^	$S%5$66LWU`MaLb
cd	$S%9$::PQXYhQiPj
kl	Bse*fgu/=~vFf
 ,c22aIIfa37 3=>g   03D 56 :@ :;[ C?;<>b 32  s   7A t8B3t,.t>tt t6tt#!t#1t((t-t2t70t<>uu(uuu0u<uu&uu!1u- u1u- ttu*	%u- -u<;u<c                    ^ RI p ^ RIpRpRR/p VP                  P                  W#R7      pVP                  P	                  V^R7      ;_uu_ 4       pVP                  4       pRRR4       \        P                  ! V P                  X4      4      pV^ ,          R,          P                  4       pV U	u. uF  p	\        V	4      P                  RR	4      NK   	  pp	V#   + '       g   i     L; iu up	i   \         d     Mi ; i R
p
TP                  P                  YR7      pTP                  P	                  T^R7      ;_uu_ 4       p\        P                  ! T P                  TP                  4       4      4      pRRR4       M  + '       g   i     M; iXR,          P                  4       pT U	u. uF  p	\        T	4      P                  RR	4      NK   	  Mu up	i pp	T#   \         d   p\        RT 24       . u Rp?# Rp?ii ; i)zLFetch S&P 500 tickers from Wikipedia via requests-style URL or fallback CSV.Nz9https://en.wikipedia.org/wiki/List_of_S%26P_500_companiesz
User-Agentz)Mozilla/5.0 (compatible; SwingTrader/1.0))headers)rl  Symbol.-z[https://raw.githubusercontent.com/datasets/s-and-p-500-companies/main/data/constituents.csvu(     ⚠️  Could not fetch S&P 500 list: )iourllib.requestrequestRequesturlopenreadr   	read_htmlBytesIOtolistr  replacerE   read_csvr   )r  urlliburlr  reqresp
html_bytestablestickersr   csv_urlreq2resp2r   r  s                  r   get_sp500_tickersr    s   
ECHIG	nn$$S$:^^##C#44J 5bjj45)H%,,.5<=W3q6>>#s+W= 54 > 
o~~%%g%?^^##D"#55RZZ

56B 6555X,%%'5<=W3q6>>#s+W== 8<=	sz   AC1 C"AC1 1$C,C1 C)	$C1 1C?>C?AG 4F:	G F	#G 1$G	G H*G?9H?Hc                    \        R\         24       \        R4       \        R\        P                  ! 4       P	                  R4       RV  R24       \        \        4       \        RRR	7       \        4       pV'       g   R
# \        R\        V4       R2RR	7       \        P                  ! VRRRRRRR7      p. p^ pV EFP  p \        VP                  \        P                  4      '       dB   WcP                  P                  ^ 4      9  d   V^,          pKY  W6,          P                  4       pMVP                  4       p\        V4      ^8  d   V^,          pK  VR,          P                  pRVP                  9   d   VR,          P                  MR
p	VR,          P                  p
VR,          P                  p^ pV	eY   V	RM,          ^ 8  dK   \         P"                  ! V	RNR
 4      pV^ 8  d+   V	RM,          V,          pVR8  d   \%        VR,
          R4      p\         P$                  ! VRNR
 4      p\         P&                  ! V
RNR
 4      pVV,
          pV^ 8X  d   V^,          pEK  VRV,          ,
          pVRM,          pVVR,          8*  pVV,
          V,          ^d,          p\        V4      ^8  d&   VRM,          VRO,          ,          ^,
          ^d,          M^ pRPTu;8*  ;'       d    R8*  Mu p\        P(                  ! R\        P*                  ! W,
          4      R\        P*                  ! \         P,                  ! V
R,          VR
RM ,
          4      \/        ^\        V4      4      R7      R\        P*                  ! \         P,                  ! VR,          VR
RM ,
          4      \/        ^\        V4      4      R7      /4      P'                  ^R7      pVP1                  ^4      P#                  4       P2                  RM,          pVV,          ^d,          pRTu;8*  ;'       d    R 8*  Mu p^ pV'       d
   V^,          pV'       d
   V^,          pV'       d
   V^,          pV^ 8  d
   V^,          pV^8  d   VP5                  RVR!\7        \9        V4      ^4      R"\7        \9        V4      ^4      R#\7        \9        V4      ^4      R$\7        \9        V4      ^4      R%\7        \9        VR,           4      ^4      R&\7        \9        V4      ^4      R'V/4       EKP  EKS  	  VP=                  R( R)7       VR
V  p\        R*4       \        R+\        V4       R,\        V4       R-\        V4       24       \        R.V R24       V'       g   \        R/4       M\        RR0R1 R2R3R4 R2R5R6 R2R7R8 R2R9R6 R2R:R; R2R<R= R2R>R; 24       \        RRQ R2RR R2RR R2RS R2RR R2RT R2RU R2RT 24       \?        V^4       Fb  w  pp\        RVR1 R2VR,          R4 R2VR!,          R? R2VR",          R@ R2VR#,          RA RBVR$,          RC RBVR%,          RD REVR',          R; 24       Kd  	  \        R\         24        \A        RFRG4      ;_uu_ 4       p \B        PD                  ! RH\        P                  ! 4       PG                  4       RIV/V ^RJ7       R
R
R
4       \        RK4       \        RL4       R
#   \:         d    T^,          p EK(  i ; i  + '       g   i     LD; i  \:         d     R
# i ; i)Vu  
Stage 1: Quick pre-filter of all S&P 500 stocks.
Uses batch download — fast. Filters by:
  1. Volume surge (last bar > 1.1x 20-day avg)
  2. Price near recent swing low / Fib support (within 5%)
  3. Short-term momentum shift (3-day return > -3% and < +1% — pullback zone)
  4. ATR volatility filter (not too quiet, not too wild)
Outputs top candidates for Stage 2 full analysis.
r   u     S&P 500 PREFILTER — Stage 1r   r   z  |  Target: top z candidatesz!  Fetching S&P 500 ticker list...T)r  Nz$ tickers loaded. Downloading data...3mor$   Fr   )r   r   r	   r
   group_bythreadsr0   r2   r,   r.   g?r   r   g?hlhc:   NN)rY  lcr9   r   g      @pricefib618ret_3datr_pct	vol_ratiopct_from_lowscorec                 (    V R ,          ) V R,          3# )r  r  rS   )xs   &r   <lambda>mode_sp500.<locals>.<lambda>*  s    AgJ;.0A"Br   )keyu   
  ── PRE-FILTER RESULTS ──────────────────────────────────z  Scanned: z | Candidates: z | Showing top z  Skipped (no data): z,  No candidates passed the pre-filter today.#z<3rJ  Tickerz<8Pricez>8zFib61.8z>9z3D RetzATR%z>6Volz>5Scorez>8.2fz>9.2fz>+7.1fz% z>5.1fz>4.1fzx /tmp/sp500_candidates.jsonr  	timestamp
candidates)r  z0  Candidates saved to /tmp/sp500_candidates.jsonzG  Run: python3 swing_trader.py sp500scan  to run Stage 2 full analysis
r;   ig       z---z--------z	---------rW  z-----)$r   r   r   r  r  r  rh   r   r   r   r   r   r   r   r   rg   r]  r@   r/   r-   r\  r`  r>   ri   r?   rA   rj   r   rD   rE   sort	enumerater  r  r  r  )!top_nr   r  rawr  skippedr   r   rm   volumehighlow	vol_scorer   r  
recent_lowrecent_highr   r   	price_nownear_supportr  r  pullback_zonerI   	atr14_valr  vol_okr  toprr   rH   r  s!   &&                               r   
mode_sp500r    sY    
Bse*	+-	Bx||~&&'7899J5'Q\
]^	#J	
-T:!G	Bs7|n@
AN ++ged$$"$C JGG	#++r}}55!=!=a!@@qLG(['')ZZ\2w|1h[''E,4

,BR\((FZ&&DY%%C I!fRj1n''&,/Q; &r
W 4I C'$'	C$=	 &&ST+J&&cd,K
*Cax1h!ECK/Gb	I$$6L%
2j@3FL ;>e*/eBi%)+a/36qF F11c1M bii
+biitBx%*'< =U1cRWjEYZbiis2ws'; <U1cRWjEYZ  ss{	 
 

2++-2226I!I-3Gw--#-F Eeqjeeqjeeqje1}eqjez!!65y)91#=5w#;5v#:5w#;5y3)?#C"E%*=q$A5	# 	 w V OOBOC
Ve
C	  Q  S	KG~_S_4E_UXY\U]T^
_`	!'"
-.<=3r(!HR='"QynAhr]RSTZ[]S^^_`efh_iijkrsujvwx5'5'5'5'5'5'5'5'RSc1%DAqBqfAak"-Qqz%.@!H+eATTUx[(1Y<*>b;PU@VVXYZ[bYcdfXgi j & 
Bse*.44II{HLLN$<$<$>cRTU^_` 5@BXZ9  	qLG	2 54  se   A[A [D[%G
[0[[B:[[> 0?[+/[> [('[(+[;	6[> >\\c                ,    \        R4      ;_uu_ 4       p\        P                  ! V4      pRRR4       XR,           Uu. uF  q3R,          NK  	  ppVP                  RR4      p\	        R\
         24       \	        R4       \	        R	VR
,           24       \	        R\        V4       R24       \	        \
        4       \        R,          p^ RI	pYGn        . pT F  p	 \        T	4      p
\        T	4      p\        T	4      p\        YYT 4      pT'       dR   TP                  R4      '       d;   TP                  T4       TR,          R8X  d   RTR,           R2MRTR,           R2pMRpT'       d   TP                  R4      '       d   RMRp\	        RT	 RT T 24       K  	  \	        R\
         24       T'       g   \	        R4       M\	        R\        T4       R\
         R24       T F  pTR,          pTR8X  d   R MR!p\	        RT R"T RTR,           R#TR$,           24       \	        R%TR&,           24       \	        R'TR(,           24       \	        R)TR*,           24       \	        R+TR,,           24       \	        R-TR.,           R/TR,           R0TP                  R1R24       R324       K  	  \	        \
        4       R#   + '       g   i     EL; iu upi   \         d    \	        R4        R# i ; i  \         d    \	        RT	 R24        EK:  i ; i)4z8Stage 2: Full EWT+DeMark analysis on Stage 1 candidates.r  Nr  r   r  unknownr   u     S&P 500 FULL SCAN — Stage 2z  Pre-filter from: :N   Nz  Analyzing z candidates...u1     ⚠️  No candidates found. Run 'sp500' first.:NNNr   r   r   u   LONG ✅ — r   r   u   SHORT 🔴 — r  re   z [!RECYCLED]r   r   r   z	... errorz5  No actionable setups from S&P 500 candidates today.r   z# ACTIONABLE SETUP(S) FROM S&P 500:
u   🟢u   🔴rJ  r  r   r  r   r  r   r  r   r  r   r  r   r  r	  r   ?z units
)r  r  loadr   r   r   rh   FileNotFoundErrorr  swing_traderr    r%   r7   r   rj   rE   )r   r  datarH   r  tsoriginal_watchlist_selfr   r   df_wdf_ddf_4r   
status_strr  r   icons   &                 r   mode_sp500scanr  F  s   .//199Q<D 0+/+=>+=akk+=
>XXk9-3%j/1#BsG9-.S_-^<=c
 #1  O J	3'Dv&DF#Dd'BCsww|,,!!#&FI+FVZ`F`}S-?,@Bhwx{  }J  yK  xL  LM  gN
&
.1cggj6I6INrMKxtJ<GH   
Bse*EF3z?##GuBOPCK A&[6fDBtfAaS3x=/s?7K6LMN&s7|n56&s;'7&89:&s?';&<=>&s?';&<=>Ic$i[c-6H5IVYV]V]^mnqVrUss{|}  
#Je 0//>  AB0  	3Kxy122	3sY   K J>K KA-K AK4)AK4-K4K4>K		K K10K14LLc                     \         P                  ! R R7      p V P                  RRR7      pVP                  R4      pVP	                  R\
        RR7       VP                  R	4      pVP	                  R
\        ^RR7       VP	                  R\
        RR7       VP                  R4      pVP	                  R\
        RR7       VP                  R4      pVP	                  R4       VP	                  R\
        RR7       VP                  R4      pVP	                  R4       VP	                  R\        R^R7       VP	                  R\
        RR7       V P                  4       pVP                  R8X  d   \        VP                  4       R# VP                  R	8X  d#   \        VP                  VP                  4       R# VP                  R8X  d   \        VP                  4       R# VP                  R8X  d#   \        VP                  VP                  4       R# VP                  R8X  d.   \!        VP                  VP"                  VP                  4       R# R# )u   Swing Trader — EWT + DeMark)descriptionmodeT)destrequiredscanz	--accountg     j@)typer  sp500z--topz&Max candidates to output (default: 30))r  r  help	sp500scananalyzer   backtestrO  r  )r  nargsr  N)argparseArgumentParseradd_subparsers
add_parseradd_argumentrD   rl   
parse_argsr  r   r   r  r  r  r#  r   r  rO  )parsersubsps5s5sapbpargss           r   mainr    s   $$1PQF


Vd

;C		BOOKeXO>		 BOOG#r8`OaOOKeXO>
..
%C[uh?			"BOOHOOKeXO>	
	#BOOHOOG#S!O<OOKeXO>DyyF$,,	g	488T\\*	k	!t||$	i	T[[$,,/	j	 dkk4::t||< 
!r   __main__)	SPYQQQIWBIWMzBTC-USDzETH-USDzEURUSD=XzGBPUSD=XzJPY=Xr"   )   )   )<   )   u   ══════════════════════════════════════════════════════════════)+__doc__r  r  r  warningsr   r   numpyr]  pandasr   yfinancer   filterwarningsr  r   r   r   r   r   r    r%   r7   rK   rN   ru   ry   r   r   r   r   r   r   r   r   r#  rX  r  r  r  r  r  __name__rS   r   r   <module>r     s      
  (       ! `	 2 0
6)3j-"^; 'Sn 
+^-^2" HX8AH5t"=H zF r   