
    Aj2P              
          d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3  edg      Z4 e       Z5e4jm                  de(       ee      fdedefd       Z7e4jm                  de8e-          ee      dfdedede9fd       Z:e4jm                  de8e*          ee      dfdedede9fd       Z;e4jm                  de8e+          ee      fdedefd       Z<e4j{                  d        ee      fd!e)d"e	dedefd#       Z>e4j                  d$       ee      fd!e,d"e	dedefd%       Z@e4jm                  d&       ee      dfdedede9fd'       ZAe4jm                  d(       ee      d)fdeded*e9fd+       ZBe4jm                  d,       ee      fdedefd-       ZCe4jm                  d.       ee      fdedefd/       ZDe4jm                  d0       ee      d1fdeded*e9fd2       ZEe4jm                  d3       ee      d4d)fdeded5e9d6e9fd7       ZFe4jm                  d8       ee      fdedefd9       ZGe4jm                  d:       ee      fdedefd;       ZHe4j{                  d<       ee      fdedefd=       ZIy>)?z!Trading and dashboard API routes.    )dateDecimal)	APIRouterDependsHTTPExceptionRequest)casedescfuncselect)AsyncSession)RequireAdmin2FARequireAnalystRequireViewer)get_settings)get_db)is_emergency_stop_activeset_emergency_stop)
	BotConfigDailyRiskStateDecisionLogOrderPositionPositionStatusRiskProfileSignalSymbolStrategy)DashboardStatsEmergencyStopRequestOrderResponsePositionResponseRiskConfigUpdateSignalResponse)record_audit_event)binance_service)portfolio_serviceTrading)tagsz/dashboard/stats)response_modeluserdbc                   K   t        j                         }|j                  t        t              j                  t        j                  |k(               d {   }|j                         }t        j                  ||       d {   }|r\|j                  |_        |j                  |_        |j                  |_        |j                  |_        |j#                          d {    |j                  t        t$              j'                  d             d {   }|j                         }t)                d {   }|j                  t        t+        j,                               j/                  t0              j                  t0        j2                  t4        j6                  k(               d {   }	t9        j:                          d {   }
t=        |r|j>                  nt@        j>                  |xs |r|jB                  nd|j                  |j                  |j                  |jD                  |	jG                         xs d|j                  |jH                  tK        tM        |jH                              nd d |
|r|jN                  nd|r'|jP                  r|jP                  jR                        S d       S 7 d7 97 7 7 7 7 w)N   Fr   )trading_modeemergency_stopcapital	daily_pnldaily_pnl_pct	total_pnlopen_positionstrades_todaywin_ratemax_drawdownbinance_connected	is_lockedlock_reason)*r   todayexecuter   r   wheretrading_datescalar_one_or_noner(   get_equity_summary_asyncr2   current_capitalr3   r4   daily_loss_pctr7   trades_countcommitr   limitr   r   countselect_fromr   statusr   OPENr'   pingr    r0   settingsr1   r5   scalarr8   r   strr;   r<   value)r,   r-   r=   risk_result
risk_stateequityconfig_resultconfig	emergencyr6   
binance_oks              @C:\xampp\htdocs\tradingbinance\backend\app\api\routes\trading.pyget_dashboard_statsrY   *   s-    
 JJLE

6.#9#?#?@[@[_d@d#effK//1J$==b%HHF%+^^
"%//
$*$8$8
!"("5"5
iik**VI%6%<%<Q%?@@M--/F.00I::tzz|((288NL_L_9_` N '++--J,2V((8M8M PfV%:%:%""**""%,,.3!((28//2MV__-.SW$*4*&&%4>:CYCYJ**00  `d + g I 	@0 .s   AKJ<-KJ?AK$K%4KK!K;K<A4K0K1KKC0K?KKKKKKz/signals   rG   c                 H  K   |j                  t        t        t        j                  t
        j                        j                  t        t        j                  t        j                  k(        j                  t
        t        j                  t
        j                  k(        j                  t        t        j                              j                  |             d {   }|j                         }|D cg c]  \  }}}t!        |j                  |||j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j4                  |j                         c}}}S 7 c c}}}w w)N)idsymbolstrategy_nameaction
confidence
risk_levelsuggested_size	stop_losstake_profitsupporting_indicatorscontradicting_indicatorsmathematical_reasonensemble_score
created_at)r>   r   r   r   r]   r   namejoin	symbol_idr\   strategy_idorder_byr   ri   rG   allr%   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   )r,   r-   rG   resultrowsssym
strat_names           rX   list_signalsru   V   s0     ::vv}}hmm4	ff&&&))3	4	h**hkk9	:	$v(()	*	u F ::<D$ #'#" #'AsJ! 	tt$88||||++kk"#"9"9%&%?%? ! 5 5++||	
  #'# s%   CF"FF"8BFF"F"z/orders2   c                   K   |j                  t        t        t        j                        j                  t        t        j                  t        j                  k(        j                  t        t        j                              j                  |             d {   }|j                         D cg c]  \  }}t        |j                  ||j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j                  |j,                         c}}S 7 c c}}w w)N)r\   r]   siderJ   r0   quantitypricefilled_pricerc   rd   ri   	filled_at)r>   r   r   r   r]   rk   rl   r\   rn   r   ri   rG   ro   r"   rx   rJ   r0   ry   rz   r{   rc   rd   r|   )r,   r-   rG   rp   ors   s         rX   list_ordersr~   y   s     ::ufmm$	feoo2	3	$u''(	)	u	 F* jjl #FAs 	tt88ZZ''kk||kk	
 # s%   BEEE3BEEEz
/positionsc                 |  K   |j                  t        t        t        j                        j                  t        t        j                  t        j                  k(        j                  t        j                  t        j                  k(               d {   }|j                         D cg c]  \  }}t        |j                  ||j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  |j*                         c}}S 7 c c}}w w)N)r\   r]   rJ   entry_pricery   rc   rd   unrealized_pnlrealized_pnl	opened_at	closed_at)r>   r   r   r   r]   rk   rl   r\   r?   rJ   r   rK   ro   r#   r   ry   rc   rd   r   r   r   r   )r,   r-   rp   prs   s        rX   list_positionsr      s     ::x'	fh((FII5	6	x."5"55	6 F& jjl #FAs 	tt88ZZkk++kkkk	
 # 
s%   BD<D4D<,BD60D<6D<z/emergency-stopdatarequestc                   K   t        | j                         d {    |j                  t        t              j                  d             d {   }|j                         }|rd|j                  ind }|r| j                  |_        t        ||j                  dd|r|j                  nd || j                  | j                  d|       d {    | j                  | j                  dS 7 7 7 !w)Nr/   r1   EMERGENCY_STOP_UPDATEDr   )r1   reasonuser_idr_   entity_type	entity_id	old_value	new_valuer   )r   activer>   r   r   rG   rA   r1   r&   r\   r   )r   r   r,   r-   rT   rU   r   s          rX   r1   r1      s      T[[
)))**VI%6%<%<Q%?@@M--/F=C!6#8#89I $

'%&))4%)[[DKKH	 	 	 #kkT[[AA! *@
	s4   C3C-4C3C/A>C3C1C3/C31C3z/risk/configc                 x  K   |j                  t        t              j                  t        j                  dk(               d {   }|j                         }|st        dd      | j                  d      }|D ci c]  }|t        t        ||             }}|j                         D ]  \  }}	t        |||	        t        ||j                  dd|j                  ||j                         D 	ci c]  \  }}	|t        |	       c}	}|       d {    d	|j                  d
S 7 c c}w c c}	}w 7  w)NTi  zDefault risk profile not found)status_codedetail)exclude_unsetRISK_CONFIG_UPDATEDr   r   zRisk configuration updated)messageprofile)r>   r   r   r?   
is_defaultrA   r   
model_dumprO   getattritemssetattrr&   r\   rj   )
r   r   r,   r-   rp   r   update_datakeyr   rP   s
             rX   update_risk_configr      s,     ::f[1778N8NRV8VWXXF'')G4TUU///5K<GHKSc''3/00KIH!'')
Ue$ *

$!**5@5F5F5HI5HzsE3E
?5HI	 	 	 4MM' Y I J	s=   AD:D+9D:>D-AD:4D2
D:D8D:-D:z/decisions/logsc                   K   |j                  t        t              j                  t	        t        j
                              j                  |             d {   }|j                         j                         }|D cg c]  }t        |j                        |j                  |j                  j                  |j                  |j                  j                  |j                   |j"                  |j$                  |j&                  r|j&                  j                  nd |j
                  j)                         d
 c}S 7 c c}w w)N)
r\   r]   r_   r`   ra   was_executedblock_reasonr   market_regimeri   )r>   r   r   rn   r   ri   rG   scalarsro   rO   r\   r]   r_   rP   r`   ra   r   r   rg   r   	isoformat)r,   r-   rG   rp   logsls         rX   list_decision_logsr      s     ::f[1::4@V@V;WX^^_deffF>>!D  A add)hhhhnn,,,,,,NNNN++67ooQ__224,,002	
   gs%   AED>&E B;E ;E Ez/analytics/equity   daysc                 \  K   ddl m} t        t        |d      d      }|j	                  t        t              j                  t        t        j                              j                  |             d{   }t        t        |j                         j                                     }t        t!        t"        j$                              }|j	                  t        t&              j)                  t&        j*                  t,        j.                  k(               d{   } |d       }	|j                         j                         D ]>  }
|
j0                  s|	|
j0                  j3                         xx   |
j4                  z  cc<   @ |}g }|D ]  }||	j7                  |j                  t        d            z  }|j9                  |j                  j;                         t!        |j<                        t!        |      t!        |	j7                  |j                  t        d                  t!        |j<                  r5|	j7                  |j                  t        d            |j<                  z  dz  nd      |j>                  d	        |rptA        jB                  |       d{   }t!        |jD                        |d
   d<   t!        |jF                        |d
   d<   t!        |jH                        |d
   d<   |S |r	 |S tA        jB                  |       d{   }|j9                  t3        jJ                         j;                         t!        |      t!        |jD                        t!        |jF                        t!        |jH                        |jL                  d	       |S 7 ,7 7 7 w)z3Daily capital and PnL history for the equity curve.r   defaultdictr/   im  Nc                      t        d      S N0r        rX   <lambda>zequity_curve.<locals>.<lambda>  s    73<r   r   d   )r   starting_capitalrC   r3   r4   rE   rC   r3   r4   )'collectionsr   minmaxr>   r   r   rn   r   r@   rG   listreversedr   ro   r   rO   rM   paper_initial_capitalr   r?   rJ   r   CLOSEDr   r   r   getappendr   r   rE   r(   rB   r2   r3   r4   r=   r7   )r,   r-   r   r   	safe_daysrp   rq   initialclosed_resultpnl_by_datepos
cumulativecurverlives                  rX   equity_curver      s     (CaL#&I::~''^-H-H(IJPPQZ[ F )--/01Dc(889:G**xx.2G2GGH M (33G'HK$$&**,==**,-1A1AA- - JEkooanngclCC
NN,,. #A$6$6 7":[__Q^^WS\JK %% >ASASSVYY
 NN
 	  &??CC'*4<<'8b	#$!$T^^!4b	+%(););%<b	/" L 
 L '??CCJJL**, #G"4<<0T^^, !3!34 --
 	 Lc4 D DsR   A3N,5N!6B%N,N$:N,E
N,!N'"A4N,N*BN,$N,'N,*N,z/analytics/trades-by-symbolc                   K   t        t        j                  t        j                  k(  dfd      }|j                  t        t        j                  t        j                  t        j                        t        j                  t        j                  t        j                        d      t        j                  t        j                  |      d            j                  t        t        j                   t        j                  k(        j#                  t        j                        j%                  t'        t        j                  t        j                                           d{   }|j)                         D cg c]5  \  }}}}|t+        |xs d      t-        |xs d      t+        |xs d      d7 c}}}}S 7 Yc c}}}}w w)z,Aggregated position stats grouped by symbol.r/   r   else_N)r]   total_positionsr   r6   )r
   r   rJ   r   rK   r>   r   r   r]   r   rH   r\   coalescesumr   rk   rl   group_byrn   r   ro   intrO   )r,   r-   	open_caserp   rs   totalpnl
open_counts           rX   trades_by_symbolr   3  s;     hoo)<)<<a@JI::MMJJx{{#MM$((8#8#891=MM$((9-q1		
 
fh((FII5	6	&--	 	$tzz(++./	0
 
F$ ,2::< ,8'CZ "5:AqM!*/2		
 ,8 
s$   E#G	%F?&G	?:G
9G	G	z/analytics/symbol-statsc                   K   t        t        j                  dkD  dfd      }t        t        j                  dk  dfd      }t        t        j                  dkD  t        j                  fd      }t        t        j                  dk  t        j                  fd      }|j                  t	        t
        j                  t        j                  t        j                  |      d      t        j                  t        j                  |      d      t        j                  t        j                  t        j                        d      t        j                  |      t        j                  |            j                  t
        t        j                  t
        j                  k(        j                  t        j                  t         j"                  k(        j%                  t
        j                        j'                  t)        t        j                  t        j                  t        j                        d                         d{   }|j                  t	        t
        j                  t        j*                  t        j                              j                  t
        t        j                  t
        j                  k(        j                  t        j                  t         j,                  k(        j%                  t
        j                               d{   }|j/                         D 	ci c]  \  }}	|t1        |	       }
}}	g }|j/                         D ]  \  }}}}}t1        |xs d      }t1        |xs d      }||z   }|j3                  ||||rt5        ||z  dz  d      ndt7        |xs d      |t7        |      nd|t7        |      nd|
j9                  d      d	        |
j;                         D ]5  \  }t=        fd|D              r|j3                  ddddddd|d	       7 |j?                  d	 d
       |S 7 7 9c c}	}w w)z,Win/loss breakdown and PnL stats per symbol.r   r/   r   Nr   )	r]   winslossesclosed_tradesr8   r   avg_winavg_lossr6   c              3   .   K   | ]  }|d    k(    yw)r]   Nr   ).0rr   rs   s     rX   	<genexpr>zsymbol_stats.<locals>.<genexpr>~  s     5u!1X;#%us   r   c                     t        | d         S )Nr   r   )xs    rX   r   zsymbol_stats.<locals>.<lambda>  s    WQ~%67r   T)r   reverse) r
   r   r   r>   r   r   r]   r   r   r   avgrk   rl   r\   r?   rJ   r   r   r   rn   r   rH   rK   ro   r   r   roundrO   r   r   anysort)r,   r-   win_case	loss_caser   r   r   open_resultrs   cntopen_by_symbolstatsr   r   r5   avg_wavg_lwins_ilosses_iclosedr   s           `            rX   symbol_statsr   M  sI     X**Q.2!<Hh++q0!4A>IH))A-x/D/DETRGX**a/1F1FGtTH**MMMM$((8,a0MM$((9-q1MM$((8#8#891=HHWHHX	
 
fh((FII5	6	x."7"77	8	&--	 	$t}}TXXh.C.C%DaHI	J M 

v}}djj56	fh((FII5	6	x."5"55	6	&--	 	 K 5@OO4EF4ESc3s8m4ENFE6C6G6G6I2T69eUTYQv{#("#;Afvo3Q7t	Q/%*%6s5zD&+&7E
T,00a8

 
		 7J  *//1Z5u55LL!"  # ",
 
 2 
JJ7JFLo Gs>   IQQ
CQQQ,QCQ4QQQz/analytics/pnl-by-symbol-day   c                   K   ddl m t        t        |d      d      }|j	                  t        t        j                  t        j                  t        j                        j                  t        t        j                  t        j                  k(        j                  t        j                  t         j"                  k(  t        j                  j%                  d            j'                  t)        t        j                                     d{   } fd      }t+               }|j-                         D ]7  \  }}}	|	j/                         }
||
   |xx   |z  cc<   |j1                  |       9 t3        |j5                         d      d| }t7        t9        |            }t3        |      }g }|D ]  }
||
   }t;        |j=                         t?        d	            }|jA                  |
jC                         tE        |      |D ci c]F  }|jG                  |t?        d	            dk7  s"|tE        |jG                  |t?        d	                  H c}d
        ||dS 7 Sc c}w w)z)Daily realized PnL broken down by symbol.r   r   r/   Z   Nc                        d       S )Nc                      t        d      S r   r   r   r   rX   r   z5pnl_by_symbol_day.<locals>.<lambda>.<locals>.<lambda>  s    V]^aVbr   r   r   s   rX   r   z#pnl_by_symbol_day.<locals>.<lambda>  s    +NbBcr   T)r   r   )r   r   	by_symbol)symbolsrq   )$r   r   r   r   r>   r   r   r]   r   r   r   rk   rl   r\   r?   rJ   r   r   isnotrn   r   setro   r   addsortedkeysr   r   r   valuesr   r   r   rO   r   )r,   r-   r   r   rp   by_dateall_symbolsrs   r   r   dsorted_datesr   rq   sym_pnl	day_totalrr   r   s                    @rX   pnl_by_symbol_dayr    s     (CaL"%I::v}}h33X5G5GH	fh((FII5	6	OO~444$$T*

 
$x))*	+ F /::c.dGEK%zz|S)NN
33  ,
 ',,.$7
CL./L[!GD!*('#,7	KKM^HOu1SZS^S^_`bijmbnSostSt!SQ!=>>u
 	  --?8 vs+   DI)I!C7I)#I$*'I$I)$I)z/analytics/closed-tradesr/   page	page_sizec                   K   t        |d      }t        t        |d      d      }|dz
  |z  }|j                  t        t	        j
                               j                  t              j                  t        j                  t        j                  k(               d{   }t        |j                         xs d      }|rt        d||z   dz
  |z        nd}	|j                  t        t        t        j                        j!                  t        t        j"                  t        j$                  k(        j                  t        j                  t        j                  k(        j'                  t)        t        j*                              j-                  |      j/                  |             d{   }
g }|
j1                         D ]m  \  }}d}|j2                  r?|j*                  r3t        |j*                  |j2                  z
  j5                         dz        }|j7                  t9        |j$                        |t9        |j:                        t9        |j<                        t9        |j>                        t9        |j@                        t9        |jB                        |j2                  r|j2                  jE                         nd|j*                  r|j*                  jE                         nd|tG        |jH                  d      r|jH                  jJ                  nt9        |jH                        d       p |||||r|	dS ddS 7 7 w)	z.Closed positions with PnL details (paginated).r/   r   Nr   <   rP   )r\   r]   r   ry   r   rc   rd   r   r   duration_minutesr0   )r   r   r	  r
  total_pages)&r   r   r>   r   r   rH   rI   r   r?   rJ   r   r   r   rN   r   r]   rk   rl   r\   rn   r   r   offsetrG   ro   r   total_secondsr   rO   r   ry   r   rc   rd   r   hasattrr0   rP   )r,   r-   r	  r
  	safe_pagesafe_page_sizer  total_resultr   r  rp   r   r   rs   duration_mins                  rX   r   r     sx     D!IY*C0N!m~-Ftzz|	X		x."7"77	8 L
 ##%*+ELQ#a%.014GHWXK::x'	fh((FII5	6	x."7"77	8	$x))*	+		~	 F EJJLS==S]] =LLNQSSTLcff+s/CLL) 0 01S]]+s/69mm00269mm002 ,6=c>N>NPW6XC,,22^abebrbr^s
 		 !& #&+{ 
 23 Is&   BM	MDM	-M.FM	M	z/symbols/monitorc                 T  K   |j                  t        t              j                  d             d{   }|j	                         }|r|j
                  r|j
                  nt        j                  }g }|D ]  }|j                  t        t              j                  t        j                  |k(        j                  t        t        j                              j                  d             d{   }|j	                         }|r|j                  r|j                  ni }	|j                  ||r|j                   j"                  nd|r|j$                  nd|r"|j&                  r|j&                  j"                  nd|r|j(                  nd|r|j*                  nd|r|j,                  nd|	j/                  d      |	j/                  d      |	j/                  d      |	j/                  d      |	j/                  d      d	|r|j                  j1                         ndd
	        |S 7 7 5w)z=Latest decision snapshot per active symbol for live tracking.r/   NFrz   rsiadxema_crossoverrelative_volume)rz   r  r  r  r  )	r]   r_   r`   r   r   r   r   
indicators
updated_at)r>   r   r   rG   rA   active_symbolsrM   default_symbolsr   r?   r]   rn   r   ri   indicators_snapshotr   r_   rP   r`   r   r   r   rg   r   r   )
r,   r-   rT   rU   r   monitorrs   rp   lastsnapshots
             rX   symbols_monitorr#    s     **VI%6%<%<Q%?@@M--/F'-&2G2Gf##XMeMeGGzz;U;%%,-Xd;1123U1X	
 
 ((*/38P8P4++VX+/dkk''T-1$//t9=$BTBTT//55Z^15D--415D--526d..D!g.||E*||E*!)o!>#+<<0A#B :>$//3354
 	 4 N? A
s#   1H(H"B<H(0H%1D2H(%H(z/symbols/scannerc                   K   |j                  t        t              j                  d             d{   }|j	                         }|r |j
                  xs i j                  di       ni }t        j                  t        j                  t        j                  t        j                  t        j                  |r|j                  r|j                  |dS t        j                  |dS 7 w)z3Last symbol scanner run and current rotation picks.r/   Nsymbol_scanner)enabledinterval_hourscore_symbolsrotation_poolrotation_slotsr  	last_scan)r>   r   r   rG   rA   strategy_flagsr   rM   symbol_scanner_enabledsymbol_scanner_interval_hourssymbol_scanner_core_symbolssymbol_scanner_rotation_poolsymbol_scanner_rotation_slotsr  r  )r,   r-   rT   rU   scanners        rX   symbols_scanner_statusr3    s      **VI%6%<%<Q%?@@M--/FIOv$$*//0@"EUWG22"@@ <<!>>"@@39f>S>S&//  ZbYqYq  As   1C)C'B4C)z/symbols/scanner/runc                 .  K   ddl m} ddlm}  |       }	  ||d       d{   }|j	                          |j
                  |j                  |j                  |j                  |j                  |j                  dS 7 Y# |j	                          w xY ww)z)Manually trigger symbol scanner rotation.r   )SyncSessionLocal)run_symbol_scanT)forceN)changedr  rotation_pickspinned_symbols
candidates
scanned_at)app.core.databaser5  !app.services.symbol_scanner_applyr6  closer8  r  r9  r:  r;  r<  )r,   r-   r5  r6  sessionrp   s         rX   symbols_scanner_runrA  &  s      3A G&wd;; >> // // //'''' 	 <s,   BB  A>B  AB>B   BBN)J__doc__datetimer   decimalr   fastapir   r   r   r	   
sqlalchemyr
   r   r   r   sqlalchemy.ext.asyncior   app.api.depsr   r   r   app.core.configr   r=  r   app.core.redis_clientr   r   
app.modelsr   r   r   r   r   r   r   r   r   r   app.schemasr    r!   r"   r#   r$   r%   app.services.audit_servicer&   app.services.binance_servicer'   app.services.portfolio_servicer(   routerrM   r   rY   r   r   ru   r~   r   postr1   putr   r   r   r   r   r  r   r#  r3  rA  r   r   rX   <module>rS     s    '   > > / / / G G ( $ N    : 8 <		$> ~> v(
(( ?(V JtN';< v
  =D Id=&9:>Efo\^ M | VY  ;4 L.>)?@AH } ,  A0 
 v	B
BB B 		B  B2 N
 v	N
NN N 		N N8 FMfodf > | ^a  (  ?Fv\^ 6] 6 6VY 6 !6r )*CJ6?  L  +2 %&?Fv >] > > '>B *+DKFOac $.- $.\ $.[^ $. ,$.N &' v	5
55 5 	5 (5p BI&/ ! !< !  !H IPQW } ,     #$GNv N   %r   