
    
j/                      :	   d Z ddlZddlmZ ddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZ ddlZddlmZmZmZmZ ddlmZ ddlmZ  ej        eddd	
           dZd Zd Zd Z  ej!        d ej"        d ej#         e
j$        d          d           ej#         ej%        dddd          d          g           ej&        ddd           ej"        dd           e
j'        d            e
j(        d!d"           ej)        d" ej*         e
j+        d#d$%                     ej,         ej"        d& ej#         ej-        d'           e	j.        d( e            d)*          gd	+           ej#         ej-        d,           e	j.        d-d.d/d0d1d2d0gd/d)3          gd4+           ej#         ej-        d5           ej        d6d7ej/        0                                1                    d8          9          gd:+           ej#         ej-        d;           ej        d<d=dd>?          gd4+           ej#         ej-        d@           ej        dAd=ddBdCD          gd:+           ej#         ej-        dE           ej        dFd=dddGH          gd4+           ej#         ej-        dI           ej        dJdKdLM          gd:+          g           ej"        dN ej#         ej2        dOdPddQ          d           ej#         e
j3        dRdS                    g          g          g           e
j'        dT           e
j(        dUd"           e
j'        dV           e	j4        dWdXdYiZ           e	j5        d[d\           e	j6        d]d^d_          g`          Z7 e ed[da           edRdb           edPdc           ed(dd           ed-dd           ed6dd           ed<dd           edAdd           edFdd           edJdd           ed[da          de          df             Z8 e ed!db           eddb           edWdg           edUdb           ed[da           ed]dh                    di             Z9dj Z:dk Z;dS )lu   
Página de paper trading (simulación).
Misma lógica que cartera.py pero con modo='simulacion' y capital virtual configurable.
    N)dcchtmlInputOutputStatecallback
dash_table	no_update)   añadir_transaccioneliminar_transaccionget_transaccionesget_posiciones)ACTIVOS)get_tickers_extraz/simulacionu   Simulación   )pathnameorder
simulacionc                  z    d t                      D             } i t          | }d t          |          D             S )Nc                 ,    i | ]}|d          |d         S nombreticker .0rs     */var/www/html/bolsaweb/pages/simulacion.py
<dictcomp>z$opciones_empresa.<locals>.<dictcomp>   "    CCC!Qx[!H+CCC    c                 @    g | ]}|                     d d          |dS )_ labelvalue)replace)r   ks     r   
<listcomp>z$opciones_empresa.<locals>.<listcomp>   s.    NNN1aiiS))A66NNNr"   )r   r   sorted)extratodoss     r   opciones_empresar/      sE    CC/@/B/BCCCE w % ENNuNNNNr"   c                 6   t          j        |           }	 |                    d          }|j        s t	          |d         j        d                   S n# t          $ r Y nw xY w	 |j        j        }|r|dk    rt	          |          S n# t          $ r Y nw xY wd S )N2d)periodCloser   )	yfTickerhistoryemptyfloatiloc	Exception	fast_info
last_price)r   tdfps       r   precio_actualrA      s    
	&AYYdY##x 	/G)"-...	/   K" 	Q88O   4s#   <A 
A! A!%"B	 	
BBc                  2   d t                      D             } i t          | }t          t                    }g }d}d}|D ]}|                    |d         d          }|rt          |          nd }|d         }	|d         }
|	r|
|	z  nd}|r||	z  nd }|||
z
  nd }|
|
r||
z  dz  nd }||
z  }|r||z  }|                    |d                             dd	          |	d
|dd|r|ddnd|r|ddnd||ddnd||ddndd           |||fS )Nc                 ,    i | ]}|d          |d         S r   r   r   s     r   r    z.construir_tabla_posiciones.<locals>.<dictcomp>0   r!   r"   r   empresa cantidad_netacoste_totald   r$   r%   z.0f.3f    €u   —,.2f+,.2f+.2f%)EmpresaCantidadzPrecio mediozPrecio actualValor actualu   P&L €zP&L %)r   r   r   MODOgetrA   appendr)   )r-   r.   
posicionesfilastotal_invertidototal_valorpos
ticker_sympvcantidadrG   precio_mediovalor_actualplpl_pcts                  r   construir_tabla_posicionesra   /   s   CC/@/B/BCCCE w % E%%JEOK  YYs9~r22
*4>]:&&&$'-(19@{X--q(*4rH}}-9-El[((4.0nn"{"S((SW;& 	(<'K9~--c377#))+555502=_____:FQ|66666E,.N"(((((*0*<&&&&&%
 
 	 	 	 	 /;..r"   Tz	mt-3 mb-3u   Simulación (Paper Trading)auto)widthVirtualwarningdarkzms-2 align-self-center)color
text_color	className)ri   childrenzMEsta cartera es completamente virtual. Las operaciones no tienen efecto real.zmb-3)rg   ri   zsim-resumenzmb-4 g-3)idri   zPosiciones abiertaszsim-tabla-posicioneszmb-4u   Registrar operación simuladazmb-0ri   zg-2rO   zsim-empresaF)rk   options	clearablemdTipozsim-tipoCompracomprar&   Ventaventa)rk   rm   r(   rn      Fechaz	sim-fechadatez%Y-%m-%d)rk   typer(      rP   zsim-cantidadnumber100)rk   ry   minplaceholderu   Precio (€)z
sim-preciogMbP?z5.23)rk   ry   r}   stepr~   u   Comisión (€)zsim-comisiong{Gz?)rk   ry   r}   r(   r   Notasz	sim-notastextOpcional)rk   ry   r~   zmt-3	Registrarzsim-btn-add)rk   rg   n_clickszsim-msgz!text-muted ms-3 align-self-centerz"Historial de operaciones simuladaszsim-tabla-historialu'   Evolución de la simulación vs IBEX 35zsim-grafica-evolucionheight45vh)rk   stylezsim-refresh)rk   datazsim-intervali )rk   intervaln_intervals)fluidrj   r   rj   r   r(   )prevent_initial_callc	                 z   t          |||||g          s	t          dfS d t                      D             }	i t          |	}
|
                    ||          }t          t          ||||t          |          t          |          t          |pd          |pd	  	         |pddz   d|                                 dfS )Nz&Rellena todos los campos obligatorios.c                 ,    i | ]}|d          |d         S r   r   r   s     r   r    z(registrar_simulacion.<locals>.<dictcomp>   r!   r"   r   rE   rv   u   ✓ z simulada registrada.)	allr
   r   r   rS   r   rR   r9   
capitalize)r$   rD   tipofechar\   preciocomisionnotasrefreshr-   r.   r   s               r   registrar_simulacionr      s     uh788 CBBBCC/@/B/BCCCE w % EYYw((FgvtUE(OOUSY]]\abjbono\p\prwr}{}~~~LqANdoo&7&7NNNNNr"   figurer   c           
         t                      \  }}}||z
  }|r||z  dz  nd}|dk    rdnd}t          d|ddd          t          d	|ddd          t          d
|dd|dd|          g}|rAt          j        ||rd |d         D             ng dddddddddiddddiddgd          nt	          j        dd          }	t          t                    }
|
r3t          j        d  |
D             d! d"D             dd#d$dddd%&          nt	          j        d'd          }	 t                      }n:# t          $ r- t          j                    }|                    d(d)*           Y nw xY w|	|||fS )+NrH   r   z#2E7D32z#C62828zCapital empleadorK   rJ   #E65100rQ   zP&L simuladorL   u    €  (rM   z%)c                     g | ]}||d S )r   rk   r   r   cs     r   r+   z$actualizar_vista.<locals>.<listcomp>   s     888!!1%%888r"   rightz6px 12px	monospace)	textAlignpadding
fontFamilyboldz#fff3e0)
fontWeightbackgroundColorfilter_queryu   {P&L €} contains "+")ifrg   u   {P&L €} contains "-"   )r   columns
style_cellstyle_headerstyle_data_conditional	page_sizezSin posiciones abiertas.z
text-mutedrl   c           
          g | ]d}|d          |d                              dd          |d                                         |d         |d         dd|d	         d
d|d         deS )r   rD   r$   r%   r   r\   r   rI   rJ   r   z.2frk   )rw   rO   rq   rP   Precio	   ComisiónID)r)   r   )r   r>   s     r   r+   z$actualizar_vista.<locals>.<listcomp>   s       
 	 wZAiL,@,@c,J,JfI((***8....*=W=W=W=WD'	
 
   r"   c                     g | ]}||d S r   r   r   s     r   r+   z$actualizar_vista.<locals>.<listcomp>   s     ooo!!1%%ooor"   )rw   rO   rq   rP   r   r   z5px 10px)r   r   
   )r   r   r   r   r   zSin operaciones registradas.plotly_whiteu   Sin datos de evolucióntemplatetitle)ra   _tarjetar	   	DataTabler   Pr   rR   _grafica_evolucion_vs_ibexr;   goFigureupdate_layout)r   	_intervalrV   	total_inv	total_valpl_totalr`   rg   tarjetas	tabla_postrans
tabla_histfigs                r   actualizar_vistar      s\    #=">">E9i9$H+4;X	!C''!F!QIIIE 	#	%<%<%<%<iHHI!8!8!8!8)DDH!J!J!J6!J!J!J!JERRH  

O
$<AI88uQx8888r!(Z{[[$*yII"$<=	RR"$<=	RR 
 
 
 
 
 F5NNN  d##E 
S% 
    po/nooo!(Z@@$*yII    F9\RRR T(** T T Tikk>9RSSSSST hZ//s   )D8 84E/.E/c                     t          j        t          j        t          j        t	          j        | d          t	          j        |d|i          g                    d          S )Nztext-muted mb-1 smallrl   rg   )r      ro   )dbcColCardCardBodyr   r   H5)titulovalorrg   s      r   r   r      sk    738CLv!8999gu-...*        r"   c                  
   dd l } | j                            | j                            | j                            t                              d          }d t                      D             }i t          |}t          t                    }t          j
                    }|s|                    dd           |S t          j        |          t          j        d                   d<                       d          d                                         }i }|D ]}| j                            |d	| d
          }	| j                            |	          r	 t          j        |	dddgd          }
t          j        |
j        d          |
_        d|
j        v rdnd}t          j        |
|         d                                          }|                    d                                          ||<   # t2          $ r Y w xY w|s|                    dd           |S t5           t7                      j        d |                                D                        }fd|D             }g }|D ]}d         |k             }d}|                    d          D ]\  }}||d         dk             d                                         ||d         dk             d                                         z
  }|dk    rR||v rN||         }|j        |j        |k             }t?          |          r!||tA          ||d                            z  z  }|!                    |           d         dk             "                    d d                                          |r|d         rfd|D             }n|}|#                    t          j$        ||dtK          dd           d!d"#                     | j                            |d$          }| j                            |          r	 t          j        |dddgd          }
t          j        |
j        d          |
_        d|
j        v rdnd}t          j        |
|         d                                          }||j        d         &                                k             }|j'        sX||j(        d         z  d%z  }|#                    t          j$        |j        |j        d&tK          d'd(d)*          +                     n# t2          $ r Y nw xY w|                    dd,d-tK          d.d/d0d01          2           |S )3Nr   r   c                 ,    i | ]}|d          |d         S r   r   r   s     r   r    z._grafica_evolucion_vs_ibex.<locals>.<dictcomp>   r!   r"   r   u   Sin datos de simulaciónr   r   rD   
historico_z.csvrv   rz   )	index_colskiprowsheadercoerce)errorsz	Adj Closer3   )levelu   Sin históricos disponiblesc                     g | ]	}|j         
S r   )index)r   ss     r   r+   z._grafica_evolucion_vs_ibex.<locals>.<listcomp>   s    %M%M%M!ag%M%M%Mr"   c                 P    g | ]"}|d                                           k     |#S )r   )r}   )r   ddf_ts     r   r+   z._grafica_evolucion_vs_ibex.<locals>.<listcomp>   s3    DDD1W0A0A0C0C+C+C!+C+C+Cr"   r   rs   r\   ru   r4   c                 6    | d         | d         z  | d         z   S )Nr\   r   r   r   )r   s    r   <lambda>z,_grafica_evolucion_vs_ibex.<locals>.<lambda>  s    !J-!H+-*= r"   )axisc                      g | ]
}|z  d z  S )rH   r   )r   vcoste_inicials     r   r+   z._grafica_evolucion_vs_ibex.<locals>.<listcomp>  s#    AAAA%+AAAr"   u   Simulación (base 100)r   )rg   rc   tozeroyzrgba(230,81,0,0.07))xyr   linefill	fillcolorzhistorico_IBEX_35.csvrH   zIBEX 35 (base 100)z#1565C0g      ?dash)rg   rc   r   )r   r   r   r   z	x unifiedzRendimiento (base 100)(   r      )lr   r>   b)r   	hovermodeyaxis_titlemargin))osr   joindirname__file__r   r   r   rR   r   r   r   pd	DataFrameto_datetimesort_valuesuniqueexistsread_csvr   r   
to_numericdropnagroupbylastr;   r,   setunionvaluessumlenr9   rT   apply	add_traceScatterdictr}   r8   r:   )r   DATA_DIRr-   r.   r   r   empresasprecios_histemprutadhcolr   
idx_globalvalor_serier   	ops_hasta	valor_diagrpr\   serieidx_dispsim_norm	ruta_ibexibex	ibex_normr   r   s                             @@r   r   r      s   IIIw||BGOOBGOOH,E,EFFOOHCC/@/B/BCCCE w % Ed##E
)++C >9STTT
<DN4=11DMG$$DI%%''HL 
 
w||H&<3&<&<&<==7>>$ 	[aVANNN>"(8DDD%0BJ%>%>kkGM"S'(;;;BBDD$%IIAI$6$6$;$;$=$=S!!   	  >9VWWW
%M%M|7J7J7L7L%M%M%MNOOJDDDDZDDDJK & &g%/0		!)))44 		G 		GHCCK8+,Z8<<>>c&kW,-j9==??@  !||| 3 3$S) ;u{e';<x== GE%2E,F,F!FFI9%%%%f1288==A 9  	cee 
  {1~ AAAA[AAAMM"*
%	+++"7	      X'>??I	w~~i   	Y!q!fQOOOB~bhx@@@BH!,
!:!:++C=C:::AACCD
d7m&7&7&9&99:D:  49Q</#5	bjo)9-ISvFFF     
  	 	 	D	 ,bB"+++	     Js&   B G==
H
	H
6C=T4 4
U U)<__doc__pandasr   plotly.graph_objectsgraph_objectsr   yfinancer5   r   r   r   r   r   r   r   r	   r
   dash_bootstrap_componentsr   databaser   r   r   r   activosr   r   register_page__name__rR   r/   rA   ra   	ContainerRowr   H4BadgeAlertr   Divr   
CardHeaderH6r   LabelDropdown	TimestamptodaystrftimeButtonSpanGraphStoreIntervallayoutr   r   r   r   r   r"   r   <module>r=     s        ! ! ! ! ! !      Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ' ' ' '                  & & & & & &  8-m1 M M M MO O O  " /  /  /F 
TCGk566fEEE		)9Skllltz{{{-   
 CIW6  
 CG}
333DG!""DH&&999CHvwtw>&QQQRRCGe9--|s|}VfVfVhVhty/z/z/z{  AB  C  C  C6**LCLJ[cnvQwQw  DK  V]  z^  z^  Q_  go  {@  -A  -A  -A  B  GH  I  I  I7++YSY+FZ\ZfZlZlZnZnZwZw  yC  [D  [D  .E  .E  .E  F  KL  M  M  M:..		^RZ`aot0u0u0uv{|}}}>22ICIT\bcjo  ~D  5E  5E  5E  F  KL  M  M  M#455ysyNYaghpqx|7}7}7}~  DE  F  F  F7++YSY+F`j-k-k-klqrsss/    CGf

;=	\]^^^flmmm		Y:]^^^__0   
 	 	)   & DG011DH%888DG566CI(60BCCCCIQ'''CLNYAFFFU+- +
 +
 +
\ 

F=&!!
F9j!!	E-$$	E-!!	E*g	E+w	E.'""	E,  	E.'""	E+w	E-    O O O 

F!:..
F=*%%
F"H--
F *--	E-  	E.-(( -0 -0 -0`  ` ` ` ` `r"   