
    bAjS                     n   d 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	 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mZmZmZmZ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/  ee0      Z1 e	       Z2ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  dZ9de:e   fdZ;de<de=e>e<f   fdZ?de-fdZ@ e/j                  d      d        ZB e/j                  d      d        ZC e/j                  d      de<de<de<de<d e<d!e<fd"       ZD e/j                  d#      d$        ZE e/j                  d%      d&e<de<d'e<d(e<fd)       ZF e/j                  d*      d+        ZG e/j                  d,      d-        ZHy.)/zCelery worker tasks.    )datedatetimetimezone)Decimal)UUID)get_settings)SyncSessionLocal)
get_logger)acquire_lockrelease_lock)	BotConfigCandleCandleIntervalDailyRiskStateDecisionLogOrder	OrderSideOrderStatusPositionPositionStatusRiskProfileSignalSignalActionStrategySymbolTradingMode)backtesting_engine)binance_service)decision_engine)notification_service)paper_trading_service)RiskContext)
celery_app1m5m15m1h4h1dreturnc                     | j                  t              j                  t        j                  t        j
                  k(        j                         S N)queryr   filterstatusr   OPENall)sessions    ;C:\xampp\htdocs\tradingbinance\backend\app\workers\tasks.py_get_open_positionsr5   2   s4    =="))(//^=P=P*PQUUWW    symbolc                 P   | j                  t              j                  t        j                  |k(        j	                         sdd| dfS t        |       }t        |      t        j                  k\  rddt        j                   dfS t        fd|D              rdd| fS y)	z>Block duplicate symbol entries and enforce max open positions.FzSymbol z
 not foundzMax open positions (z	) reachedc              3   P   K   | ]  }|j                   j                  k(    y wr-   )	symbol_idid).0possyms     r4   	<genexpr>z#_portfolio_guard.<locals>.<genexpr>@   s     
=ns3==CFF"ns   #&zAlready have open position on )T )
r.   r   r/   r7   firstr5   lensettingsmax_open_positionsany)r3   r7   open_positionsr>   s      @r4   _portfolio_guardrG   6   s    
--

&
&v}}'>
?
E
E
GCxz222(1N
>h999,X-H-H,ISSS

=n
==6vh???r6   c           
         t        j                         }ddlm} |j	                  | |      }|j                  | |       | j                          | j                  t              j                  t        j                  |k(        j                         }| j                  t              j                  t        j                  dk(        j                         }|sQt        t        t         j"                              }t        |||      }| j%                  |       | j'                          t)        di d|j*                  d|j,                  d|j,                  dk  rt/        |j0                        n
t        d      d	|j2                  d
|j4                  d|j6                  d|j8                  r|j8                  j:                  nd dt        d      ddddddddd|r|j<                  n!t        t        t         j<                              d|r|j>                  n!t        t        t         j>                              d|r|j@                  nt         j@                  d|r|jB                  nt         jB                  d|r|jD                  nt         jD                  d|r|jF                  nt         jF                  d|r|jH                  S t        t        t         jH                              S )Nr   portfolio_serviceTtrading_datestarting_capitalcurrent_capitalcapital	daily_pnldaily_loss_pct0trades_todayconsecutive_losses	is_lockedlock_reason
spread_pctz0.05relative_volumeg      ?historical_volatilityg333333?has_api_errorsFdata_sufficientmax_risk_per_trade_pctmax_daily_loss_pctmax_trades_per_daymax_consecutive_lossesmin_confidence_buyensemble_sell_threshold	kelly_cap )%r   todayapp.services.portfolio_servicerJ   get_equity_summarysync_daily_risk_stateflushr.   r   r/   rL   rA   r   
is_defaultr   strrC   paper_initial_capitaladdcommitr"   rO   rP   absdaily_pnl_pctrS   rT   rU   rV   valuer\   r]   r^   r_   r`   ra   rb   )r3   rd   rJ   summary
risk_stateprofilerO   s          r4   _get_risk_contextrt   F   s   JJLE@227EBG++GW=MMO~.55n6Q6QUZ6Z[aacJmmK(//0F0F$0NOUUWG#h<<=>#$#


 	J ## 6=5F5F5Js7001PWX[P\ ))	
 &88 && 5?4J4JJ**00PT 6?  "   BIw==gVYZbZyZyVzN{ :A755gcRZRmRmNnFo :A755hFaFa  BIw==hNmNm!" :A755hFaFa#$ DK ? ?PXPpPp%& (/'##' & 5<C@R@R<S4T' r6   z"app.workers.tasks.sync_market_data)namec                  D    ddl } d }| j                   |              ddiS )z+Fetch and persist market data from Binance.r   Nc                    K   t               } 	 | j                  t              j                         }|r|j                  r|j                  nt
        j                  }|D ]{  }| j                  t              j                  t        j                  |k(        j                         }|sJdD ],  }	 t        j                  ||d       d {   }|dd  D ]  }| j                  t              j                  t        j                  |j                  k(  t        j                  t         |   k(  t        j"                  |d   k(        j                         }|r| j%                  t        |j                  t         |   |d   |d   |d   |d   |d	   |d
   |j'                  dt)        d            |j'                  dd      
              | j+                          / ~ 	 | j5                          ddlm}
 |
j;                  d       d {    y 7 D# t,        $ r-}	t.        j1                  d||t3        |	             Y d }	~	d }	~	ww xY w# | j5                          w xY w7 Vw)Nr$   d   limiti	open_timeopenhighlowclosevolumequote_volumerR   trades_countr   )
r:   intervalr{   r|   r}   r~   r   r   r   r   sync_candles_failed)r7   r   error)circuit_breakermarket)r	   r.   r   rA   active_symbolsrC   default_symbolsr   r/   r7   r   
get_klinesr   r:   r;   r   INTERVAL_MAPr{   rl   getr   rm   	Exceptionloggerr   rj   r   app.services.circuit_breakerr   record_heartbeat)r3   configsymbolssym_namer7   r   candlescexistinger   s              r4   _synczsync_market_data.<locals>._syncw   s    "$)	]]9-335F/5&:O:Of++U]UmUmG# v.55fmmx6OPVVX EHn(7(B(B8X]`(a"a!(A 'f 5!'$*$4$4		$A$*OO|H7M$M$*$4$4+$F""
 "' % $, '$*28))1=h1G23K.-.vY-.vY,-eH./j/0{56UU>7SV<5X56UU>15M%&!" "/2  (9 !F $J MMO@..x888A #b6 % n%:8V^fijkflmmn MMO8sm   I BI	 .H	H
B	HBHI	 *I II H	I"I;I	 II	 	II r0   	completedasynciorun)r   r   s     r4   sync_market_datar   r   s(     -9^ KKk""r6   z)app.workers.tasks.evaluate_all_strategiesc                  D    ddl } d }| j                   |              ddiS )z2Evaluate ensemble strategy for all active symbols.r   Nc                    K   t               } 	 | j                  t              j                         }|r!|j                  rddd| j                          S |r|j                  r|j                  nt        j                  }t        |       }|D ]  }d| }t        |d       d {   s	 t        j                  }t        j                  ||d       d {   }|D cg c]-  }|d   |j                  d	      |d
   |d   |d   |d   |d   d/ }	}t        j                  |       d {   }
|
d   |_        |	d   j                  d      }|rt#        |j%                               nd}ddlm}m}  ||d|       d {   r	 t-        |       d {    t/        j0                  ||	d||
d   |       d {   \  }} ||d|       d {    ddlm} |j                  d      }| j7                  t9        ||j:                  |j<                  |j>                  |j@                  |jB                  |jD                  xs i |jF                  xs i |jH                  |j                  d      xs i |r ||      nd |j                  d                   | jK                          |j@                  rG|j:                  tL        jN                  k(  r)tQ        | |      \  }}|s| j                  t8              jS                  t8        jT                  |k(        jW                  t8        jX                  j[                               j                         }|rd|_.        ||_!        | jK                          t^        ja                  d||       nqtb        je                  ||j:                  jf                  ti        |jj                        ti        |jl                        ti        |jn                        |jH                         t-        |       d {     	 | j                          y 7 7 Pc c}w 7 7 7 7 {7 i7 3# t-        |       d {  7   w xY w# | j                          w xY ww)Nstoppedemergency_stop)r0   reasonzeval:7      ry   r{   
close_timer|   r}   r~   r   r   )r{   r   r|   r}   r~   r   r   rW   r   )is_signal_processedmark_signal_processedensemble)rW   r   )MarketRegimemarket_regime
indicatorscorrelation_id)r7   action
confidence
risk_levelwas_executedblock_reasonsupporting_indicatorscontradicting_indicatorsmathematical_reasonindicators_snapshotr   r   Fbuy_blocked_portfolior7   r   )8r	   r.   r   rA   r   r   r   rC   r   rt   r   evaluation_intervalr   r   r   get_orderbookrW   int	timestampapp.core.idempotencyr   r   r   r   evaluate
app.modelsr   rl   r   r   r   r   approvedr   
supportingcontradictingr   rm   r   BUYrG   r/   r7   order_by
created_atdescr   r   infoexecute_order_taskdelayrp   rj   position_size	stop_losstake_profit)r3   r   r   risk_ctxr   lock_keyeval_intervalcandles_rawr   r   book
last_close	candle_tsr   r   decisionmetar   regimecan_openr   decision_logs                         r4   	_evaluatez*evaluate_all_strategies.<locals>._evaluate   s    "$`	]]9-335F&//"+7GHz MMOw 06&:O:Of++U]UmUmG(1H#"8*-)(B777Q1$,$@$@M(7(B(B8]be(f"fK "- "-A *+;*+%%*=$%fI$%fI#$U8%&wZ&'k "-   "1!>!>x!HHD*.|*<H'!(!=J?IJ$8$8$: ;qI_0:yQQQ r 'x000o ,;+C+C " #'#5!., &NHd 0*iPPP7!XXo6FKK##+#+??'/':':'/':':)1):):)1)>)>2:2E2E2K5=5K5K5Qr08040F0L"BH,v*>d+/884D+E  NN$((X__@P@P-P1A'81T.,' 'k :!'(:(:h(F!G!)+*@*@*E*E*G!H!&	 )  ,<A 9<H 9 ' 0"KK(?YeKf.44 ( ( 5 5 #H$:$: ; #H$6$6 7 #H$8$8 9 ( 'x000m $p MMOm 8
 #g I Rt 1o& Q^ 1,x000MMOs   Q,5Q Q,AQ #P"$Q *+P>P%P>2P(P>*P-+AP>?P0 P>Q P3Q !P>;P6<P>P9H)P>:Q P<	Q Q,"Q %P>(P>0P>3Q 6P>9P><Q >QQ
QQ Q))Q,r0   r   r   )r   r   s     r4   evaluate_all_strategiesr      s)     bH KK	k""r6   z$app.workers.tasks.execute_order_taskr   sizer   r   r   c                 X     ddl } fd}|j                   |              y)z$Execute order in paper/testnet mode.r   Nc                  L  K   t               } 	 | j                  t              j                  t        j                  k(        j                         }|s%	 | j                          t               d {    y t        |       \  }}|s=t        j                  d|       	 | j                          t               d {    y d d }t        |d       d {   s%	 | j                          t        |       d {    y t        j                         d {   }| j                  t              j                         }|r|j                  nt         j                  }|t"        j$                  k(  rt'        j(                  t*        j,                  t/              |t/              t/                    }t1        |j2                  t*        j,                  t4        j6                  t"        j$                  t/              |t/        t9        |d               t/              t/              |d   t;        j<                  t>        j@                              }	| jC                  |	       | jE                          | jC                  tG        |j2                  |	j2                  tH        jJ                  t"        j$                  t/        t9        |d               t/              t/              t/              	             d
dl&m'}
 |
jQ                  |       }|
jS                  | |       | jU                          tW        jX                  t9        |      t[        |d      r|j\                  n
t9        |             d {    n;|t"        j^                  k(  r(t        j`                  dt/                     d {    | j                          t        |       d {    y 7 s7 (7 7 7 7 s7 97 # | j                          t               d {  7   w xY ww)Norder_blocked_portfolior   zorder::x   filled_priceexchange_order_id)r:   sider0   trading_modequantityexpected_pricer   r   r   r   	filled_at)r:   entry_order_idr0   r   entry_pricer   r   r   r   rI   rp   )r   r   r   moder   )1r	   r.   r   r/   r7   rA   r   r   rG   r   r   r   r   get_ticker_pricer   r   rC   r   PAPERr!   simulate_orderr   r   r   r   r;   r   FILLEDrj   r   nowr   utcrl   rh   r   r   r1   re   rJ   rf   rg   rm   r    send_trade_openedhasattrrp   TESTNETcreate_order)r3   r>   r   r   r   pricer   r   resultorderrJ   rq   r   r   r   r   r7   r   s               r4   _executez$execute_order_task.<locals>._execute  sT    "$J	)--'..v}}/FGMMOCL MMOx(((K &6gv%F"Hl5f\ZB MMOx(((A  xq1H%h444z MMOx(((y *::6BBE]]9-335F*06&&h6K6KD{(((.==MMDMI&K( !ff"&--!,!2!2$T]#(!(VN-C)D!E%i0 ' 4&,-@&A&ll8<<8 E""%&&',xx-22%0%6%6$+C~0F,G$H!("))"4$+K$8	 M+>>wG!77I *<<J' +!'.tW'=3t9	 	 	 ,,,%2265'$-PPPMMOx(((( 5~ )y C\	 Q ) MMOx(((s   P$AO; P$3O&4P$9)O; #P$O)P$O; O,O; $P$O/P$O;  O2!I O; O5;O; =O7>O; P$ O9!P$)P$,O; /P$2O; 5O; 7O; 9P$;P!PP!!P$r   )r7   r   r   r   r   r   r   r   s   ``````  r4   r   r     s%     L) L)\ KK
r6   z&app.workers.tasks.check_open_positionsc                  >    ddl } d }| j                   |              y)z*Monitor open positions for SL/TP triggers.r   Nc                    K   t               } 	 | j                  t              j                  t        j                  t
        j                  k(        j                         }|D ]  }| j                  t              j                  t        j                  |j                  k(        j                         }|sTt        j                  |j                         d {   }||j                  z
  |j                   z  |_        d }||j$                  k  rd}n||j&                  k\  rd}|st
        j(                  |_        t+        j,                  t.        j0                        |_        |j"                  |_        t7        j8                  |j                  t;        |j4                        |t;        |j                        t;        |      t=        |j>                  d      r|j>                  j@                  nt;        |j>                               d {     ddl!m"} |jG                  |       }|jI                  | |       | jK                          | jM                          y 7 7 T# | jM                          w xY ww)Nr   r   rp   )r   
exit_pricer   r   rI   )'r	   r.   r   r/   r0   r   r1   r2   r   r;   r:   rA   r   r   r7   r   r   unrealized_pnlr   r   CLOSEDr   r   r   r   	closed_atrealized_pnlr    send_trade_closedrj   r   r   rp   re   rJ   rf   rg   rm   r   )r3   	positionsr=   r>   r   exit_reasonrJ   rq   s           r4   _checkz$check_open_positions.<locals>._checkr  s    "$"	h/66x.J]J]7]^bbdI mmF+226993MNTTV->>szzJJ&+coo&=%M""CMM)"-Kcoo-"/K!/!6!6CJ$,LL$>CM'*'9'9C$.@@

C,,-#$'$8#&u:7>s?O?OQX7YS--33_bcfcscs_t  # !4 I'::7CG33GWENNMMO9 K MMOsJ   I5C	I  IAI  %C$I  	I
A I  
I5I  I   I22I5r   )r   r  s     r4   check_open_positionsr  m  s     $L KKr6   z#app.workers.tasks.run_backtest_taskbacktest_idstrategy_typer   c                 p     ddl }ddlmmm  fd}|j                   |              y)zRun backtest asynchronously.r   N)BacktestRunBacktestStatusBacktestTradec                    K   t               } d }	 | j                  	      j                  	j                  t	              k(        j                         }|s	 | j                          y 
j                  |_        | j                          t        j                  d       d {   }|D cg c]J  }|d   t        |d         t        |d         t        |d         t        |d         t        |d         d	L }}t        j                  |t        |j                              }t!        t#        |j$                  d
               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        t!        t#        |j$                  d               |_        |j$                  |_        
j6                  |_        t9        j:                  t<        j>                        |_         |jB                  D ]  }| jE                   |j                  |jF                  t!        t#        |jH                              t!        t#        |jJ                              t!        t#        |jL                              t!        t#        |jN                              t!        t#        |jP                              t!        t#        |jR                              |jT                  |jV                  |jX                                | j                          | j                          y 7 -c c}w # tZ        $ r]}|r1
j\                  |_        t#        |      |_/        | j                          t`        jc                  dt#        |             Y d }~zd }~ww xY w# | j                          w xY ww)Ni  ry   r{   r|   r}   r~   r   r   )r{   r|   r}   r~   r   r   final_capitaltotal_return_pctmax_drawdownsharpe_ratiosortino_ratiowin_rateprofit_factorbuy_hold_return)backtest_run_idr   r   r   r   pnlpnl_pct
commission
entry_time	exit_timer  backtest_failed)r   )2r	   r.   r/   r;   r   rA   r   RUNNINGr0   rm   r   r   floatr   r   initial_capitalr   rj   metricsr  r  r  r  r  r  r  r  	COMPLETEDr   r   r   r   completed_attradesrl   r   r   r   r   r  r  r  r  r  r  r   FAILEDerror_messager   r   )r3   r   r   r   r   r   tr   BTModelr  r	  r  r   r  r7   s           r4   _runzrun_backtest_task.<locals>._run  sE    "$;	--,33KNNd;FW4WX^^`Cp MMOm (//CJNN / : :68SW XXK %
 %A "#;!!F),!!F), 5?"1W:.#AhK0 %  
 (++G]E#J]J]D^_F 'FNN?,K(L MC#*3v~~>P/Q+R#SC &s6>>.+I'JKC&s6>>.+I'JKC 'FNN?,K(L MC"3v~~j'A#BCCL 'FNN?,K(L MC")#fnn=N.O*P"QC ..CK'11CJ'||HLL9C]](+VV$+C,>$?#*3q||+<#=!(QZZ!9#CJ/ 'AII 7#*3q||+<#=#$<<"#++$%MM #  NN MMOg Y
V  	:+22
$'F! LL*#a&L99	: MMOsn   QAO Q)<O %O&O .AO=KO QO O 	Q #AP;6Q ;Q  Q QQ)r   r   r  r	  r
  r   )	r  r7   r  r   r   r&  r%  r  r	  s	   ````  @@@r4   run_backtest_taskr'    s)     PP> >@ KKr6   z)app.workers.tasks.scan_and_rotate_symbolsc                  N    ddl } ddlm fd}| j                   |             S )z<Scan Binance 24h activity and rotate active trading symbols.r   N)run_symbol_scanc                     K   t               } 	  |        d {   }d|j                  |j                  |j                  |j                  d| j                          S 7 D# | j                          w xY ww)Nr   )r0   changedr   rotation_pickspinned_symbols)r	   r+  r   r,  r-  r   )r3   r   r)  s     r4   _scanz&scan_and_rotate_symbols.<locals>._scan  sg     "$
	*733F%!>>"("7"7"("7"7"("7"7 MMO 4 MMOs,   A6A! A3A! A6A! !A33A6)r   !app.services.symbol_scanner_applyr)  r   )r   r.  r)  s     @r4   scan_and_rotate_symbolsr0    s#     A ;;uwr6   z"app.workers.tasks.reset_daily_riskc                     t               } 	 t        j                         }| j                  t              j                  t        j                  |k(        j                         }|r	 | j                          y | j                  t              j                  t        j                  j                               j                         }|r|j                  n!t        t        t        j                              }| j!                  t	        |||             | j#                          | j                          y # | j                          w xY w)NrK   )r	   r   rd   r.   r   r/   rL   rA   r   r   r   rN   r   rj   rC   rk   rl   rm   )r3   rd   r   	yesterdayrO   s        r4   reset_daily_riskr3    s     G

==0778S8SW\8\]cce 	 MM.1::>;V;V;[;[;]^ddf	/8)++gc(JhJhFi>j"!( '	
 	s   AD3 7B+D3 3EN)I__doc__r   r   r   decimalr   uuidr   app.core.configr   app.core.databaser	   app.core.loggingr
   app.core.redis_clientr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    app.services.backtesting_servicer   app.services.binance_servicer   app.services.decision_enginer   !app.services.notification_servicer    "app.services.paper_trading_servicer!   app.services.risk_managerr"   app.workers.celery_appr#   __name__r   rC   M1M5M15H1H4D1r   listr5   rj   tupleboolrG   rt   taskr   r   r   r  r'  r0  r3  rc   r6   r4   <module>rM     s    - -   ( . ' <    $ @ 8 8 B D 1 -	H	> 













XDN Xc eD#I.>  )+ )X :;4# <4#n ABi# Ci#X <=Rs RC Rs Rs RY\ Rfi R >Rj >?* @*Z ;<E3 E EC ESV E =EP AB  C . :; <r6   