o
    Hi<                     @   s  d dl mZmZmZmZ d dlmZ d dlmZ d dl	Z
d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlZd dl m Z  d dl!m"Z" d dl#Z#d dlZe Z$e%e&Z'G dd de(e"Z)dd Z*dd Z+de,de(de(fddZ-de,de,fddZ.eej/eefdefddZ0e$j1dd d!eej/eeee0fd"efd#d$Z2e$1d%eej/eeee0fd&e(d"efd'd(Z3e$4d)eej/eefd*e,fd+d,Z5e$4d-d*e,fd.d/Z6e$1d0eej/eefd1d2Z7e$1d3eej/eeee0ee)j8d4d5fd"ed6e)fd7d8Z9e$j1d9d:d!ed;d<d5ed=d>d5eej/eeee0fd6e(d?e:fd@dAZ;e$4dBeej/fdCe(d*e,fdDdEZ<dS )F    )	APIRouterDependsHTTPExceptionQuery)jsonable_encoder)ObjectIdN)ListOptional)database)ZerodhaClient)TradingEngine)MongoDBManager)get_current_userdetails)BearishDivergenceStrategy)BearishSellDivergenceStrategy)get_top_gainer_symbolsget_top_loser_symbols)datetime)Enumc                   @   s   e Zd ZdZdZdS )	MoverTypegainerslosersN)__name__
__module____qualname__r   r    r   r   8/var/www/html/Trade-python/app/v1/routers/tradeengine.pyr      s    r   c                  C   s0   t dd} t dd}t dd}t| ||S )NZERODHA_API_KEY ZERODHA_API_SECRETZERODHA_ACCESS_TOKEN)osgetenvr   api_key
api_secretaccess_tokenr   r   r   get_zerodha_client   s   r'   c                 C   s   t | trdd |  D S t | trdd | D S t | tjtjtjfr)t| S t | tj	tj
tjfr8t| S t | trAt| S | S )Nc                 S   s   i | ]	\}}|t |qS r   sanitize_numpy).0kvr   r   r   
<dictcomp>%   s    z"sanitize_numpy.<locals>.<dictcomp>c                 S   s   g | ]}t |qS r   r(   r*   ir   r   r   
<listcomp>'   s    z"sanitize_numpy.<locals>.<listcomp>)
isinstancedictitemslistnpintegerint32int64intfloatingfloat32float64floatr   str)objr   r   r   r)   #   s   


r)   signal_data	timeframereturnc                    s~   |  di   s
dS g d} fdd|D tfddttd D r*d	S tfd
dttd D r=dS dS )z1
    Get EMA status for a specific timeframe
    	ema_stackzNo EMA data)   	            7   d      c                    s   g | ]}  d | dqS )ema_N)get)r*   period)rC   r   r   r0   :   s    z"get_ema_status.<locals>.<listcomp>c                 3   s$    | ]} |  |d   kV  qdS    Nr   r.   
ema_valuesr   r   	<genexpr><      " z!get_ema_status.<locals>.<genexpr>rP   Bullishc                 3   s$    | ]} |  |d   k V  qdS rO   r   r.   rQ   r   r   rS   >   rT   BearishMixed)rM   allrangelen)r@   rA   ema_periodsr   )rC   rR   r   get_ema_status0   s   ""r\   c                 C   s   | d | d | d | d  di t| dd| d  di t| dd| d  di t| dd| d  d	i t| d	dd
|  dd|  dd|  dd|  dddd|  dd| d dS )z'Enhance signal data for UI presentationsymboldecisionconfidence_scorepivots30min)pivot
ema_statusdayweekmonth)ra   dailyweeklymonthlyyearly_highr   
yearly_low)upperlower)rj   rk   circuit_limitsreasonr   	timestamp)r]   r^   
confidence
timeframes
key_levelsro   rp   )rM   r\   )r@   r   r   r   format_ui_signalC   s2   




rt   c                 C   sV   t |d}| d d|i}t| |stdddt|d |d |d	d
dS )N_idzerodha_settingsuser_id  z#Zerodha settings not found for userstatus_codedetailr$   r%   r&   r   r#   )r>   rM   find_oneprintr   r   )dbcurrent_userrw   settingsr   r   r   get_zerodha_client_from_dbg   s   
r   z/signalsz#Get signals for all user portfolios)summaryzerodhac              
      s   z;t |d}t| }t||}| d d|i}g }|D ]}|d}	|	r2||	}
||
 qd|t||dW S  tyP } zt	dt |dd }~ww )	Nru   	portfoliorw   r]   success)statusrw   signals_generatedsignals  ry   )
r>   rM   r   r   findanalyze_symbolappendrZ   	Exceptionr   )r~   r   r   rw   
db_managerengine
portfoliosr   r   r]   signaler   r   r   get_all_portfolio_signalsy   s,   



r   z/signals/{portfolio}r   c           
   
      s   z5t |d}t|}t||}td| d|  | }||}td| d|  d| |t|dW S  tyJ }	 ztdt |	d	d }	~	ww )
Nru   zFetching signal for portfolio: z for user: zSignal for : r   )r   r   r]   r   r   ry   )	r>   rM   r   r   r}   r   r)   r   r   )
r   r~   r   r   rw   r   r   r]   r   r   r   r   r   get_single_portfolio_signal   s$   

r   z	/callbackpayloadc                 C   s   |  d}t| d}|stddd|d d|i}|s%tdd	dt|d
 |d }||}|d d|idd|d ii ddiS )Nrequest_tokenru   i  zMissing request tokenry   rv   rw   rx   zZerodha settings not foundr$   r%   $setr&   r   	connected)rM   r>   r   r|   r   generate_session
update_one)r   r~   r   r   rw   r   clientsessionr   r   r   post_callback   s   

r   z	/postbackc              
      sT   zt d|  t d |  ddiW S  ty) } ztdt|dd }~ww )NzZerodha postback received: %szerodha_postbacksr   receivedr   ry   )logginginfor
   get_mongo_db
insert_oner   r   r>   )r   r   r   r   r   kite_postback   s   
r   z/profilec                 C   s|   | d  dt|d i}|r|dstdddt|d |d	 |d }z
| }d
|dW S  ty=   tdddw )Nrv   rw   ru   r&   i  zNot authenticated with Zerodhary   r$   r%   ok)r   profilez$Invalid/expired Zerodha access token)r|   r>   rM   r   r   get_profiler   )r~   r   r   r   r   r   r   r   get_zerodha_profile   s   r   z/livez:Which top movers to run the strategy on: gainers or losers)descriptionmoverc                    s  | d}td| d|  |tjkrt| }nt| }|s,td ddg dS zt|j|j	|j
| d}||}g }|D ]9}	|t ||	d |	d	 |	d
 |	d |	d |	d |	d d|	d |	d |	d d|	d |	d dd d d d	 qAg }
|r| d |}|j}
g }t|
|D ]>\}}	|t||	d |	d |	d	 |	d
 |	d |	d |	d |	d |	d |	d |	d |	d |	d d|	d |	d dd qdt||dW S  ty } ztjd| d | d!d" td#d$d%d }~ww )&Nru   z	Running  z  live strategy for user: zNo valid symbols foundr   r   messageresults)r$   r%   r&   r~   r]   volume_dropema5_gapdivergence_confirmeddivergence_bullnear_resistancenear_support)r   r   bear_divergencebull_divergencer   r   
bear_score
bull_scorer^   )r   r   r^   entry_pricetarget_price)entryexit)	rp   rw   r]   featuresmetricstargetsoutcome
predictionuser_feedbackstreaminstrument_tokenvolume_riseema5_gap_bull)r   ema_gap
divergencer   r   r   ema_gap_bullr   r   r   r^   )idr]   r   r   r   r   scannedr   z#Strategy execution failed for user r   Texc_infor   zStrategy execution failedry   )rM   loggerr   r   r   r   r   r   r$   r%   r&   run_strategyr   r   utcnowinsert_manyinserted_idszipr>   rZ   r   errorr   )r~   r   r   r   rw   symbolsstrategyrawanalytics_docsridsinsertedr   idxr   r   r   r   run_live_strategy   s   




	

r   z/shortsellsz Run intraday short-sell strategyr   z!Run on 'gainers' or 'losers' listg     j@u   Base capital in ₹capitalc                    s  | dkr	t |nt|}|sddg dS t|j|j|j||d}||}g }t|ddD ]\}	}
zpt|
d }t|
d	 }t	|
d
 }t
|| | d}|
dd}t|
dd}t|
dd}t|
dd}t|
dd}|||t|
ddt|
dd||d}||	|
d |
d ||||||
dg d	 W q. ty } ztjd|
d d| dd W Y d }~q.d }~ww dt||dS ) Nr   r   zNo symbols to scanr   )r$   r%   r&   r~   r   rP   )startr   r   quantity   pivot_levelr   near_upper_circuitFvolume_drop_pctg        momentum_drop_pctema5_gap_pctrsi_divergencerising_wedge)r   momentum_dropr   r   wedger   r   r]   r   skip_reasons)	rankr]   r   
sell_entrycover_targetr   expected_profitr   r   zError shaping result for r   Tr   r   )r   r   r   r$   r%   r&   r   	enumerater=   r9   roundrM   boolr   r   r   r   rZ   )r   r   r~   r   r   r   r   r   r   r   r   r   r   qtyexpected_pnlnearestupper_okr   r   r   r   r   r   r   r   run_intraday_shortsQ  sn   

 r   z/stream/feedback/{id}r   c                 C   s2   | d}|d dt| idd|ii ddiS )Nfeedbackr   ru   r   r   r   r   )rM   r   r   )r   r   r~   fbr   r   r   r     s   


r   )=fastapir   r   r   r   fastapi.encodersr   bsonr   numpyr5   typingr   r	   app.dbr
   app.v1.services.zerodha.clientr   app.v1.services.zerodha.enginer   "app.v1.services.zerodha.db_managerr   app.v1.dependencies.authr   !app.v1.services.zerolive.strategyr    app.v1.services.zerolive.bearishr   app.v1.services.zerolive.listr   r   r   r   enumr   r!   router	getLoggerr   r   r>   r   r'   r)   r2   r\   rt   r   r   rM   r   r   postr   r   r   r   r   r=   r   r   r   r   r   r   <module>   s    
%

i

O"