o
    9li;_                     @   sv  d dl m Z  d dlmZ d dlZd dlZd dlmZmZm	Z	 d dl
m
Z
 d dlZd dlZd dlmZ d dlZd dlmZ d dlZd dlmZ d dlmZ ed	ed
dZdZdedededejfddZdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd  Z%ej&d!d"gd#ed$d% Z'd&d' Z(ej&d(d)gd#ed*d+ Z)ej&d,d)gd#ed-d. Z*ej&d/d"gd#d0d1 Z+dS )2    )
celery_app)AsyncResultN)	Blueprintjsonifyrequest)datetime)	lru_cache)login_requiredrun_backtesting_ideabacktestingIdea2	templates)template_folderz/var/www/html/flask_project/symbolfechabasereturnc              	   C   s   t j|d}| dv rdnd}t j|d| |  d| d}t j|r-t| }nt S |d |d	  d
 |d< |d |d  d
 |d< |j	ddgdd |S )Nchains)SPXRUTXSP$ optionChain__z.parquetbid_callask_call   avg_callbid_putask_putavg_put	timestampstrikeT)inplace)
ospathjoinexistspq
read_table	to_pandaspd	DataFrame	set_index)r   r   r   folderprefixpq_pathdf r3   3/var/www/html/backtestingmarket/backtestingIdea2.py_load_chain   s    r5   c                 C   s6  zt j| tdd}t |d |d< ||d |k }|jr!W dS ||d ||g }|dkr7|g d }n
|dkrA|g d	 }||d |k jd
 }||d |k jd
 }	|dkrp|d |d  d }
|	d |	d  d }n|dkr|d |d  d }
|	d |	d  d }|
| }|d }||fW S    Y dS )N	   )usecolsr"   r   Nr#   PUT)r#   r   r    underlying_priceCALL)r#   r   r   r:   r   r   r    r   r   r   r:   )r,   read_csvrangeto_datetimeemptyisiniloc)archivo_option_chainstrike1strike2option_typetimeHouroption_chain_dffiltered_chainstrikes_datastrike1_datastrike2_datastrike1_avgstrike2_avgcredit_receivedr:   r3   r3   r4   /calcular_credito_y_underlying_desde_archivo_csv1   s0   
rO   c                    s  dd l }g }| d jd }t| d | d< | | d t|k| d t|k@   } | j fdddd| d< | j fd	ddd| d
< i }|  D ]S\}	}
t|
d d}|
d }t|
d  d| }|
d }|
d
 }|
d }||vrz
t|||||< W n
   t	 ||< Y || }t
|||||\}}|d u s|d u rtd| d| d| d|  qLt|}t|| }|d ur |dkr|t||kr|| d }nJ|t||k r|d }n>|t|| d }|d | }n.|t||k r|| d }n|t||kr|d }nt||| d }|d | }nd }|d ur^|dkrE|t||kr7d}n)|t||k rBd}nd}n|t||k rPd}n|t||kr[d}nd}nd}|||| d| |t|d d|||d ur}t|dnd |rt|| dnd ||
d |
d d ||v r||= |  qLt	|}||d  |d  @   }tdt| dt|t|   |d  jd!d"}||d  dk jd }||d  dk  jd }||||fS )#Nr   SymbolDayc                    $   | d dkr| d   S | d   S )NOption_Typer;   Strike1r3   rowdesplazamientor3   r4   <lambda>_      $ z-calcular_precios_verticales.<locals>.<lambda>   )axisStrike1_Desplazadoc                    rR   )NrS   r;   Strike2r3   rU   rW   r3   r4   rY   b   rZ   Strike2_Desplazado%Y-%m-%dHour rS   [SKIP] u.    - Strikes faltantes o underlying vacío para /r;   d   ITMOTMITM PERRORr   movimiento_esperadoscore_30min)rQ   TimeStrikesOptionCreditPriceCloseP/LDiffitmOtmrj   rk   ro   rp      [INFO] Ideas válidas:  / Descartadas: rr   Tskipna)gcrA   r,   r>   copyapplyiterrowsstrftimer5   r-   &calcular_credito_y_underlying_desde_dfprint(obtener_ultimo_underlying_price_desde_dfabsmaxminappendroundcollectnotnulllensumshape)vertical_strikes_dfpath_csv_baserX   desdehastary   
resultadosr   df_cacher   rV   r   horaspecific_timerC   rD   rE   df_chaincredit_resultunderlying_price_specific_timeunderlying_price_16
spreadDiffganancia_dia	valor_itmrt   df_resultadosprofit_total	positivos	negativosr3   rW   r4   calcular_precios_verticalesQ   s   




 








$r   c              
   C   s  zg|j ddd}|  }||d |k }||d ||g }|js,t|d  dk r3td W dS ||d |k jd }||d |k jd }	|d	|   }
|	d	|   }|
| }|d
 }||fW S  t	y } ztd|  W Y d }~dS d }~ww )N   r   )secondmicrosecondr"   r#   r   u.   [WARNING] → No se encontraron ambos strikes.r8   avg_r:   z2[ERROR] calcular_credito_y_underlying_desde_df(): NN)
replacereset_indexr@   r?   r   uniquer   rA   lower	Exception)r2   rC   rD   rE   rF   df_debugrH   rI   rJ   rK   avg1avg2rN   r:   er3   r3   r4   r~      s(   
r~   c                 C   s&   z| j ddd jd W S    Y d S Nr"   )byr:   )sort_valuesrA   )r2   r3   r3   r4   r      s   r   c                 C   s   |d u s| d u r
d S |d |d  }|d |d  }||d k s&||d kr/| t || d S |d |  kr@|d krA| d S  |d |  krO|d k r^n n| t|d | | d S |d |  k rl|d kr|n d S | t||d  | d S d S )NPut_Strike1Put_Strike2Call_Strike2Call_Strike1re   )r   r   )r   r   strikesdiff_put	diff_callr3   r3   r4   )calcular_ganancia_perdida_dia_iron_condor   s    r   c                 C   s  dd l }g }| d jd }t| d | d< | | d t|k| d t|k@   } i }|  D ]\}	}
|
d d}|
d }t| d| }|
d | |
d | |
d	 | |
d
 | d}||vr|z
t|||||< W n
   t ||< Y || }t	|||\}}}	}	|d u s|d u rt
d| d| d q2t|}t|||}|d ur||d
 k s||d krd}n|d	 |  kr|d krn nd}nd}nd}|r||d  dnd }|r||d	  dnd }||||d
  d|d	  d|d  d|d  ||t|d dt|ttfrt|dnd | d| d||
dd |
dd d ||= |  q2t|}||d  |d  @   }t
dt| dt|t|   |d jd d!}||d dk jd }||d dk  jd }||||fS )"Nr   rP   rQ   r`   ra   rb   r   r   r   r   )r   r   r   r   rc   u)    - Strikes faltantes o underlying vacío.rf   rg   rh   zN/Az.2frd   re   r   z(P) / z(C)rj   rk   )rQ   rl   rm   rp   rq   ro   rr   Difrt   rj   rk   ro   rp   ru   rv   rr   Trw   )ry   rA   r,   r>   rz   r|   r}   r5   r-   ,calcular_credito_y_underlying_iron_condor_dfr   r   r   r   r   
isinstanceintfloatgetr   r   r   r   r   )r2   r   rX   r   r   ry   r   r   r   r   rV   r   r   r   r   r   r   r:   r   r   rt   dif_calldif_putr   r   r   r   r3   r3   r4   calcular_precios_iron_condor  s   ,



 (





$r   c              
   C   sZ  z|   }||d |k }|jrtd W dS ||d |d |d |d |d g }i }| D ],\}}||d |k }	|	jrFd ||< q2|d	rU|	d
 jd ||< q2|	d jd ||< q2tdd | D rqtd W dS |d |d  }
|d |d  }|
| }|d jd }|||
|fW S  t	y } ztd|  W Y d }~dS d }~ww )Nr"   u,   [WARNING] No hay datos después del timeHour)NNNNr#   r   r   r   r   Callr   r   r!   c                 s   s    | ]}|d u V  qd S )Nr3   ).0vr3   r3   r4   	<genexpr>  s    z?calcular_credito_y_underlying_iron_condor_df.<locals>.<genexpr>u;   [WARNING] Faltan strikes necesarios para calcular crédito.r:   z8[ERROR] calcular_credito_y_underlying_iron_condor_df(): )
r   r?   r   r@   items
startswithrA   anyvaluesr   )r2   r   rF   r   rH   rI   strike_valueskeyr#   rV   credit_callscredit_putsrN   r:   r   r3   r3   r4   r   h  s>   


r   z/get_backtesting_ideaGET)methodsc            	   	   C   s   ddl m}  tjd}tjd}tjdd}tjdd}tjd	d
}tjdd }d| d| d| d| d	}tj|sMt	ddidfS | j
t||||||ddd}t	d|jdS )Nr   r
   r   r   r   r   
estrategiaVerticalr   1340risk
Intermedioz7/var/www/html/backtestingmarket/predictor_data/makekos/rd   r   	_strikes_z.csverrorz Archivo de strikes no encontradoi  )r   r   r   r   rF   r   backtesting_idea2)kwargsqueuequeued)statustask_id)tasks_backtestingidea2r   r   argsr   r   r%   r&   r(   r   apply_asyncdictid)	r   r   r   r   r   rF   r   archivojobr3   r3   r4   get_backtesting_idea  s2   r   c                 C   sV   z$t | }t |d |d< |jdd}d|jv r"|d jd W S d W S    Y d S r   )r,   r<   r>   r   columnsrA   )rB   rG   r3   r3   r4   obtener_ultimo_underlying_price  s   
 r   z/procesar_fila_verticalPOSTc               
   C   sp  t  } z| d}| d}| d}| d}t| td| td| td| | dd	}d
d |dD \}}|dkrL||k rL||}}|dkrY||krY||}}t||t}|jrltddddfW S t	
| d| }	t|||||	\}
}t|
ttfstddddfW S g }| }||d |	k }|dD ]^\}}zU||d |k d|   jd }||d |k d|   jd }|d jd }|| }|
| d }||dtt|d dtt|dtt|dd W q   Y qtd||| d| |t|
d d|dW S  ty7 } ztdt|dd fW  Y d }~S d }~ww )!Nr   rQ   rl   rn   u&   📌 [DEBUG] Day recibido del cliente:zsimbolo:zfecha:rm   r   c                 S      g | ]}t |qS r3   r   r   sr3   r3   r4   
<listcomp>      z*procesar_fila_vertical.<locals>.<listcomp>rd   r9   r;   r   No se pudo cargar option chainr   message  rb   '   No se pudo calcular el crédito inicialr"   r#   r   r   r:   re   %Y-%m-%d %H:%M:%Sr   r"   creditprofit_lossr:   success)r   r   r   r   tipoinitial_credit	evolution  )r   get_jsonr   r   splitr5   PATH_UBUNTU_CHAINSr?   r   r,   r>   r~   r   r   r   r   groupbyr   rA   r   r}   r   r   str)datar   r   r   r   strikes_rawrC   rD   r   time_objcredit_inicialr   r   df_filteredtsgroupr   r   r:   credit_actualr   r   r3   r3   r4   procesar_fila_vertical  sl   








$$
"r	  z/procesar_fila_ironcondorc                     s  t  } zB| d}| d}| d}| dd }z7|d\}}dd |d	D \}}d
d |d	D \}	}
t||t||t|	|
t|	|
 W n tyj   tdd| ddf Y W S w t	||t
}|jr~tddddfW S t| d| }| }||d |k } fdd}|||\}}|d u rtddddfW S g }|dD ]r\}}zi||d k d jd }||d  k d jd }||d k d jd }||d k d jd }|d jd }|| ||  }|| d }||dtt|d dtt|dtt|dd W q   Y qtd|| d	 d d	  t|d d|dW S  tye } ztdt|ddfW  Y d }~S d }~ww ) Nr   rQ   rl   rm   r   rb   c                 S   r   r3   r   r   r3   r3   r4   r     r   z,procesar_fila_ironcondor.<locals>.<listcomp>rd   c                 S   r   r3   r   r   r3   r3   r4   r     r   r   u   Strikes inválidos: r   r   r   r"   c           
   
      s   zU| | d |k }|d   }| | d |k }||d k d jd }||d  k d jd }||d k d jd }||d k d jd }|| ||  |fW S  tyo }	 ztd|	  W Y d }	~	dS d }	~	ww )Nr"   r#   r   r   r!   u   [ERROR crédito inicial]: r   )r   rA   r   r   )
r2   r  
df_momento
ts_primerodf_tsc1c2p1p2r   buy_callbuy_put	sell_callsell_putr3   r4   obtener_credito  s   z1procesar_fila_ironcondor.<locals>.obtener_creditor   r#   r   r   r!   r:   re   r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   stripr   r   r   r   r   r5   r   r?   r,   r>   r   r   rA   r   r}   r   r   r   )r  r   r   r   r  	put_block
call_blockput1put2call1call2r   r  r  r  r  timestamp_inicialr   r  r  r  r  r  r  r:   r  r   r   r3   r  r4   procesar_fila_ironcondor  sn   




"r  z/task_result/<task_id>c                 C   sN   t | td}| st|jddS | r"tdt|jddfS t|jS )N)appF)stateresult_readyFAILURE)r!  r   r   )r   r   readyr   r!  failedr   result)r   taskr3   r3   r4   task_resultW  s   
r(  ),r   celery.resultr   r%   pandasr,   flaskr   r   r   r   mathry   	functoolsr   pyarrowpapyarrow.parquetparquetr)   sysflask_loginr	   r   r   __name__backtestingIdea2_bpr   r   r-   r5   rO   r   r~   r   r   r   r   router   r   r	  r  r(  r3   r3   r3   r4   <module>   sJ      !	Z( 
CT