
    #iu              	          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
mZmZmZ ddlZddlZddlZddlZddlZddlZddlmZ 	 ddlZ ej.                  dd	      j1                         d
k(  Z ej.                  dd
      j1                         d
k(  Zeres	 ed       n ederdnd        ej8                  j;                  ej8                  j=                  ej8                  j=                  ej8                  j?                  e                           ejB                  ejD                          ejF                  e$      Z%d Z&	 ddl'm(Z(  e(       Z)e%jU                  d       	 ddl-m-Z- e-j\                  Z/e/re%jU                  d       ne%ja                  d        eddd      Z1e1je                  eddgd d!gd!g"       dXd#e3d$e4fd%Z5dYd#e3fd&Z6d' Z7 G d( d)e      Z8 G d* d+e      Z9i Z: G d, d-      Z; G d. d/      Z<e1j{                  d0      d1        Z>e1j{                  d2      d3        Z?e1j{                  d4      d5        Z@e1j                  d6      dZd7e4fd8       ZBe1j{                  d9      dXd#e3d$e4fd:       ZCe1j{                  d;      dYd#e3fd<       ZDe1j{                  d=      d>        ZEe1j                  d?      d@e8dAefdB       ZGe1j                  dC      d@e9dAefdD       ZHe1j{                  dE      dFe4fdG       ZIe1j{                  dH      dI        ZJe1j                  dJ      d@e
e4ef   fdK       ZKdFe4d@e9fdLZLdMe4dNe
e4ef   dOee
e4ef      fdPZMdMe4dNe
e4ef   dOee
e4ef      fdQZNe$dRk(  rddlOZO eOj                  dSdTdUd dVW       yy# e$ r dZY Pw xY w# e$ r!Z+e%jY                  de+        dZ)Y dZ+[+ZdZ+[+ww xY w# e$ r#Z+e%jY                  de+        dZ-dZ/Y dZ+[+MdZ+[+ww xY w)[zn
FastAPI Microservice for QuantEdge AI
Provides high-performance NBA data processing and backtesting services
    )FastAPIHTTPExceptionBackgroundTasks)CORSMiddleware)	BaseModel)DictListAnyOptionalN)datetimePRODUCTION_MODEfalsetrueALLOW_MOCK_DATAu2   🚨 PRODUCTION MODE: Mock data fallbacks DISABLEDu#   🔧 DEV MODE: Mock data fallbacks ENABLEDDISABLED)levelc                    t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              r| D cg c]  }t        |       c}S t        | t
              r,| t        d      k(  s| t        d      k(  s| | k7  r	| dkD  rdS dS | S 	 ddl}t        | |j                        rt        |       S t        | |j                        r2t        |       }|t        d      k(  s|t        d      k(  r	|dkD  rdS dS |S t        | |j                        r| j                         S t        | d      r| j                         S 	 | S c c}}w c c}w # t        $ r Y | S w xY w)zTRecursively replace infinity, NaN values and numpy types with JSON-compatible valuesinfz-infr   gR?@gR?Nitem)
isinstancedictitemsclean_infinity_valueslistfloatnumpyintegerintfloatingndarraytolisthasattrr   ImportError)objkvr   npvals         -/var/www/html/backtest/python_service/main.pyr   r   '   sQ   #t8;		D1(++DD	C	8;<%d+<<	C	%,#v"63#: 1W61'1
	#rzz*3xC-Cj%,&#v*>%(1W69'9
C,zz|#f%xxz! & 
1 E<(  	
	s<   EE$$E! 	AE! E! E! %E! 7E! !	E.-E.)UniversalBacktestingEngineu2   ✅ UniversalBacktestingEngine loaded successfullyu1   ❌ Failed to import UniversalBacktestingEngine: )cache_serviceu   ✅ Redis cache service enabledu4   ⚠️ Redis cache service disabled - using fallbacku$   ❌ Failed to import cache service: FzQuantEdge AI Python Servicez6High-performance NBA data and backtesting microservicez1.0.0)titledescriptionversionzhttp://localhost:3000zhttp://localhost:3003T*)allow_originsallow_credentialsallow_methodsallow_headerslimitseasonc           	      ~   t         r6t        j                  ||       }|rt        j	                  d| d|  d       |S t
        s[t        rt        st        dd      t        j                  d       dd	d
ddddddg}t         rt        j                  ||| d       |S 	 dt
        j                  v rt
        j                  d   d   } |dd      }t        |t              rf|r$|D cg c]  }|j                  d      |k(  s| }}|d|  }t         r3t        j                  |||        t        j	                  d| d|  d       |S t        rt        st        dd      dd	d
ddddddg}	t         rt        j                  |	|| d       |	S c c}w # t        $ r"}t        j!                  d|        Y d}~qd}~ww xY w)z6Load NBA games data using the real engine with cachingu%   ✅ Cache hit for NBA games (season: z	, limit: )  zFNBA data service unavailable and mock data disabled in production modestatus_codedetailz1Backtesting engine not available, using mock datazmock-001LALGSWz
2024-01-152023-24x   s   home)game_id	home_team	away_team	game_dater6   
home_score
away_scorewinner   	ttl_hoursnbadata_loaderN1dayr6   u$   💾 Cached NBA games data (season: zError loading NBA games: z=NBA API unavailable and mock data disabled in production modezfallback-001)CACHE_ENABLEDr,   get_nba_gamesloggerinfoBACKTESTING_ENGINEr   r   r   warningset_nba_gamesmarket_enginesr   r   get	Exceptionerror)
r5   r6   cached_data	mock_datarN   datagameresultefallback_datas
             r*   load_nba_gamesrb   j   s    #11&%@KK?xyQVPWWXYZ?_ 
 	JK &"")#!! 	
	 ''	65AN6&555,;;EB=QKtV,D$%-1RTTXXh5G65QDRDRfu !!//FKK"FvhiX]W^^_ `a
 R
 	
 &%		
M ##M65ANI S  604556s2   AF &F FAF F 	F<F77F<c           	         t         r2t        j                  |       }|rt        j	                  d|  d       |S ddddddd	d
ddddddddd
dgd|  }t         r/t        j
                  ||        t        j	                  d|  d       |S )z"Load NBA players data with cachingu&   ✅ Cache hit for NBA players (limit: r8   lebron_jameszLeBron Jamesr=   SFg     <@gffffff @g333333&@)ppgapgrpg)	player_idnameteampositionstatsstephen_curryzStephen Curryr>   PGgL8@gffffff@g      @Nu%   💾 Cached NBA players data (limit: )rP   r,   get_nba_playersrR   rS   set_nba_players)r5   r[   r\   s      r*   load_nba_playersrr      s     #33E:KK@qIJ
 ("!#d;	
 )#!#c:	
 uI$ %%i7;E7!DE    c                     t         r-t        j                         } | rt        j	                  d       | S dddddddd	ddd
dddddddddg}t         r,t        j
                  |d       t        j	                  d       |S )z Load NBA teams data with cachingu   ✅ Cache hit for NBA teamsr=   zLos Angeles LakerszLos AngelesWestern)team_idrj   city
conferencer>   zGolden State WarriorszSan FranciscoBOSzBoston CelticsBostonEasternNYKzNew York KnickszNew York   rK   u   💾 Cached NBA teams data)rP   r,   get_nba_teamsrR   rS   set_nba_teams)r[   r\   s     r*   load_nba_teamsr      s     #113KK56 (!#		
 +##		
 $#		
 %#		
'I8 ##I=01rs   c                   b    e Zd ZU eed<   dZeed<   dZeeee	f      ed<   dZ
eeee	f      ed<   y)StrategyRequeststrategy_coderM   marketNparamstime_period)__name__
__module____qualname__str__annotations__r   r   r   r   r
   r    rs   r*   r   r   	  s@    FC'+FHT#s(^$+,0K$sCx.)0rs   r   c                       e Zd ZU eed<   eed<   eeef   ed<   dZeeeef      ed<   dZ	ee   ed<   dZ
ee   ed<   dZeeeef      ed	<   dZeeeef      ed
<   dZeeeef      ed<   dZee   ed<   y)BacktestRequeststrategy_namer   r   Nr   r   1hour	timeframewalk_forward_configwalk_forward_periodsoptimization_configFuse_intrabar_ticks)r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   boolr   rs   r*   r   r     s    KcN,0K$sCx.)0#'M8C='&Ix}&48$sCx.1859(4S>2948$sCx.18)..rs   r   c                       e Zd ZdZdZdZdZy)	JobStatuspendingrunning	completedfailedN)r   r   r   PENDINGRUNNING	COMPLETEDFAILEDr   rs   r*   r   r     s    GGIFrs   r   c                       e Zd ZdedefdZy)BacktestJobjob_idrequestc                     || _         || _        t        j                  | _        t        j                         | _        d | _        d | _	        d | _
        d | _        y )N)r   r   r   r   statusr   utcnow
created_at
started_atcompleted_atr_   rZ   )selfr   r   s      r*   __init__zBacktestJob.__init__%  sH    ''"//+ 
rs   N)r   r   r   r   r   r   r   rs   r*   r   r   $  s    s _ rs   r   /c                  V   K   ddt        j                         j                         dS w)zHealth check endpointoperationalz QuantEdge AI Python Microservice)r   service	timestamp)r   r   	isoformatr   rs   r*   rootr   /  s+       5__&002 s   ')z/healthc                     K   t         rdnd} t        rdnd}dddd| |t        j                         j	                         d	S w)
zDetailed health checkenableddisabledloadedr   healthyr   normalactive)r   uptimememory_usageconnectionsr,   backtesting_enginer   )rP   rT   r   r   r   )cache_statusengine_statuss     r*   health_checkr   8  sK      !.9:L 2HM  %+__&002 s   ?Az/cache/statsc                  F   K   t         sddiS t        j                         S w)zGet cache statisticsrZ   Cache service not available)rP   r,   	get_statsr   rs   r*   cache_statsr   H  s&      677""$$s   !z/cache/cleartypec                    K   t         sddiS | dk(  rt        j                         }n8| dk(  rt        j                         }n| dk(  rt        j                         }nddiS d| |dS w)	zClear cache by typerZ   r   rM   backtestallz.Invalid cache type. Use: nba, backtest, or allT)success
cache_typekeys_cleared)rP   r,   clear_nba_cacheclear_backtest_cacheclear_all_cache)r   cleareds     r*   clear_cacher   P  sx      677u}//1		446	//1IJJ  s   A#A%z
/nba/gamesc                    K   	 t        | |      }d|t        |      dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA games dataTr   r]   countzError fetching NBA games:   zFailed to fetch NBA gamesr:   N)rb   lenrY   rR   rZ   r   )r5   r6   gamesr`   s       r*   rQ   rQ   e  sd     	Quf-Z
 	

  Q1!564OPPQs$   A A	A%AAAz/nba/playersc                    K   	 t        |       }d|t        |      dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA players dataTr   zError fetching NBA players: r   zFailed to fetch NBA playersr:   N)rr   r   rY   rR   rZ   r   )r5   playersr`   s      r*   rp   rp   s  sb     	S"5)\
 	

  S3A3784QRRSs$   A A	A%AAAz
/nba/teamsc                     K   	 t               } d| t        |       dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA teams dataTr   zError fetching NBA teams: r   zFailed to fetch NBA teamsr:   N)r   r   rY   rR   rZ   r   )teamsr`   s     r*   r~   r~     s`     	Q Z
 	

  Q1!564OPPQs$   A A	A%AAAz/strategy/executer   background_tasksc                   K   	 t         j                  d| j                   d       | j                  dk(  r4t        | j                  | j
                  | j                         d{   }n3t        | j                  | j
                  | j                         d{   }d|ddS 7 >7 # t        $ r6}t         j                  d|        t        d	dt        |       
      d}~ww xY ww)zExecute a dynamic strategyz
Executing z	 strategyrM   NT2   )r   r_   execution_time_mszStrategy execution failed: r   r:   )rR   rS   r   execute_nba_strategyr   r   r   execute_financial_strategyrY   rZ   r   r   )r   r   r_   r`   s       r*   execute_strategyr     s     \j 0	:; >>U"/0E0Ew~~W^WjWjkkF5g6K6KW^^]d]p]pqqF !#
 	
	 lq  \21#676QRUVWRXQY4Z[[\sM   C)A B' $B#%3B' B%	B' "C)#B' %B' '	C&01C!!C&&C)z/backtest/runc                   K   	 t         j                  d| j                   d| j                          t        st        dd      | j                  j                  dd      xsF | j                  j                  dd      xs( t        | j                  j                  d	d
            dkD  }|rut        d       t        t        j                               }t        ||       }|t        |<   t        d|        |j                  t         ||        t        d       d|ddddS 	 | j"                  xs | j$                  }t        j'                  | j                  | j                  | j                  | j                  j                  dd      | j(                  || j*                  | j,                  | j.                  	      }t5        |t6              rd#|v rt        d$|d#         t9        |      }d|d%d&S # t0        $ r}t         j3                  dt        |              ddt        |       ddddt        |       dg di | j                   d| j                   i dt        |       t        |      g g ddid d!
cY d"}~S d"}~ww xY w# t
        $ r  t0        $ r6}t         j3                  d'|        t        d(d't        |             d"}~ww xY ww))z/Run a backtest using UniversalBacktestingEnginezRunning z backtest for r9    Backtesting engine not availabler:   	run_asyncFlarge_dataset	data_file r   z0DEBUG: Creating background job for large datasetz&DEBUG: Adding background task for job z)DEBUG: Background task added successfullyTacceptedzPBacktest started in background. Use /backtest/status/{job_id} to check progress.z30-120 seconds)r   r   r   messageestimated_time
min_trades   	r   r   
parametersr   r   r   r   r   r   zBacktest execution failed: Visualization failed: z3Backtest core succeeded, but visualization failed: )total_tradeswin_ratetotal_profitnotez+Backtest completed with visualization error on z5Strategy executed successfully, visualization error: r   zChart generation failed)rZ   
price_datatradessummary)
r   rZ   resultsr   performance_summaryrisk_metricsequation_summarydetailed_statistics	trade_logchart_visualizationNrZ     d   )r   r   r   zBacktest failed: r   )rR   rS   r   r   rT   r   r   rX   r   printr   uuiduuid4r   	job_storeadd_taskrun_backtest_backgroundr   r   run_backtestr   r   r   r   rY   rZ   r   r   r   )r   r   run_in_backgroundr   jobwalk_forward_datar_   r`   s           r*   r  r    s    ]Rhw~~.nW=R=R<STU!C8Z[[ NN{E2 9NN69"";34q8 	 DF&Ffg.C #If:6(CD%%&=vwO=?   $m"2 '	 ' < < [@[@['44~~%33">>">>--lB?!++%6$+$?$?#*#=#=%33 5 
FL fd#6(9CwHH 'v. !$
 	
C  	LL6s1vh?@  1#a&:$% !$%QRUVWRXQYZ	 'T "'.'<'<&=T'..AQ$R')TUXYZU[T\] V"$  &(AB	( 	N   R(,-6GAx4PQQRsg   KDJ  K"BG/ :4J .K/	J8A?I=7J8J <K=JJ K1KKKz/backtest/status/{job_id}r   c                 h  K   | t         vrt        dd      t         |    }| |j                  |j                  j	                         |j
                  j                  |j
                  j                  d}|j                  r|j                  j	                         |d<   |j                  t        j                  k(  r.|j                  j	                         |d<   |j                  |d<   |S |j                  t        j                  k(  r,|j                  j	                         |d<   |j                  |d<   |S w)	z'Check status of background backtest jobi  zJob not foundr:   )r   r   r   r   strategyr   r   r   rZ   )r  r   r   r   r   r   r   r   r   r   r   r   r_   r   rZ   )r   r
  responses      r*   get_backtest_statusr    s     YODD
F
C **nn..0++$$KK--H ~~!$!9!9!;
zzY(((#&#3#3#=#=#? !jj
 O	 
y''	'#&#3#3#=#=#? IIOs   D0D2z/backtest/jobsc                    K   g } t         j                         D ]  \  }}| j                  ||j                  |j                  j
                  |j                  j                  |j                  j                         |j                  r|j                  j                         nd|j                  r|j                  j                         ndd        | t        |       dS w)zList all backtest jobsN)r   r   r   r  r   r   r   )jobstotal)r  r   appendr   r   r   r   r   r   r   r   r   )r  r   r
  s      r*   list_backtest_jobsr  #  s      D ( 	jjkk((11..2248;#..224D<?<L<LC,,668RV
 		 3t9--s   CCz/rag/add-insightc           	        K   	 | j                  dd      }| j                  di       }| j                  dd      }|st        dd      t        j                  d	|j                  d
d       d|j                  dd              t	        t        j                               |||t        j                         j                         dd}	 ddl
}d} |j                  ||||dd      }|j                  dk(  r
dd|d   ddS t        d|j                   d|j                          dd|j                   |d   ddS # j                  j                   $ r,}t        d|        dd |d   d!t	        |      d"cY d}~S d}~wt"        $ r t        d#       dd$|d   d%dcY S w xY w# t$        $ r?}t        j'                  d&t	        |              t        d'd(t	        |             d}~ww xY ww))zHAdd successful strategy insights to RAG vector store for global learningcontentr   metadatasourceunknownr   zContent is requiredr:   u   🎯 RAG Insight Received: r   z - r  T)idr  r  r  received_at	processedr   Nz!http://localhost:5000/add-insight)r  r  r     )jsontimeout   z.Insight successfully added to RAG vector storer  	connected)r   r   
insight_id
rag_statusu#   ⚠️ RAG service returned status : FzRAG service error: rZ   u"   ⚠️ RAG service not available: z7RAG service not available - insight stored locally onlyoffline)r   r   r"  r#  rZ   u9   ⚠️ requests library not available for RAG integrationz6RAG integration unavailable - requests library missingunavailablezRAG insight addition failed: r   zFailed to add RAG insight: )rX   r   rR   rS   r   r  r  r   r   r   requestspostr;   r  text
exceptionsRequestExceptionr$   rY   rZ   )	r   r  r  r  insight_datar'  rag_urlr  r`   s	            r*   add_rag_insightr.  4  s1    E\++i,;;z2.Xy1C8MNN 	1(,,vy2Q1RRUV^VbVbcmoxVyUz{|
 djjl# #??,668
)	9G$x}}W"$ 4 	H ##s*#O".t"4"-	  ;H<P<P;QQST\TaTaSbcd$!4X5I5I4JK".t"4")	  ""33 	6qc:; T*40'Q   	MN S*40+	 	  \4SVH=>6QRUVWRXQY4Z[[\sw   G/CF$ 	7D=  G/;D= <G/=F!!E=7F!8F$ <G/=!F!F$ G/ F!!F$ $	G,-:G''G,,G/c                 .
  K   	 t        d|         t        dt        t        j                                       | t        vrt        d|  d       yt        |    }t        d|         t        j
                  |_        t        j                         |_	        t        j                  d|  d|j                          t        d	       t        |d
d      xs t        |dd      }t        d|j                          t        j!                  |j                  |j"                  |j                  |j                  j%                  dd      |j&                  ||j(                  |j*                  |j,                  	      }t        dt/        |t0              rt        |j                               n
t3        |              |j%                  d|j%                  dg             }|j%                  dddi      }d|v s|j%                  d      s	 t        j4                  j%                  |j                  i       }|rd|v r|r|d   } ||j                  j%                  d      |j&                  |j*                        }	|	rt7        |	      dkD  r~ddl}
t/        |	t              r|
j;                  |	      }n|	}t        j=                  |||j                        }t        j                  d|  dt7        |j%                  dg              d       |j%                  dd      |j%                  dd      |j%                  d d      |j%                  d!d      |j%                  d"d      |j%                  d#d      |j%                  d$d      ||d%|j%                  dd       d&|j%                  dd       d'|j%                  d$d      |j%                  d#d      |j%                  d"d      d(|j"                   d)|j                   |d*d+}tE        |      |_#        t        jH                  |_        t        j                         |_%        t        j                  d,|  d-t7        |       d.       y# t>        $ r6}t        jA                  d|  d|        ddtC        |       i}Y d}~d}~ww xY w# t>        $ rl}t        jM                  d/|  d0tC        |              t        jN                  _        tC        |      |_&        t        j                         |_%        Y d}~yd}~ww xY ww)1zBackground task to run backtestz/DEBUG: run_backtest_background STARTED for job z DEBUG: Available jobs in store: zERROR: Job z not found in job_store!NzDEBUG: Found job in store: u&   🟡 Starting background backtest job z for z!DEBUG: About to call run_backtestr   r   z8DEBUG: Background job calling run_backtest with params: r   r   r   z/DEBUG: run_backtest returned result with keys: 
all_tradesr   r   rZ   zVisualization not availablerN   r   r   u1   ✅ Regenerated visualization for background job r$  z trades plottedz6Could not regenerate visualization for background job r   r   r   r   avg_profit_per_tradeprofit_factorsharpe_ratiomax_drawdownzBackground backtest completed: z	 trades, z
% win rate)r4  r3  r2  r   z7Strategy executed successfully in background processing)r   r   r   r1  r2  r3  r4  r   r   r   r   r   r   r   u   ✅ Background backtest job z completed successfully with z trades visualizedu   ❌ Background backtest job z	 failed: )(r  r   r  keysr   r   r   r   r   r   rR   rS   r   getattrr   rT   r  r   rX   r   r   r   r   r   r   r   rW   r   pandas	DataFrame"_generate_trade_visualization_datarY   rU   r   r   r_   r   r   rZ   r   )r   r   r
  r  r_   r   r   market_enginerN   data_sourcepddata_df	viz_errorcomplete_resultr`   s                  r*   r  r  ~  s    d-?xHI0inn6F1G0HIJ"Kx'?@A+F845&&
!*<VHE'..IYZ[13 $G-CTJ{gV]_tvzN{HHXYZ $00>>!//~~~~)),;''!2 ' ; ;&99!// 1 

 	?WabhjnWoV[[]@Suy  {A  vB  @C  D  	E L&**Xr*BC$jj)>Jg@hi ))1D1H1H1R[ 2 A A E EgnnVX Y ]m%C"/">K"-**;7))22#K
 #s;'7!';+%k48&(ll;&?G&1G.@.c.c"GW^^/+ &WX^W__abefyf}f}  G  IK  gL  cM  bN  N]  %^  _ #JJ~q9

:q1"JJ~q9$*JJ/Eq$I#ZZ;"JJ~q9"JJ~q9#6%DVZZP^`aEbDcclmsmwmw  yC  EF  nG  mH  HR  $S &

>1 = &

>1 =!'OQ!?
 $+#8#8"9gnn=M N#)R%
* +?;
((
#??,26(:WX[\bXcWddvwx=  [!WX^W__abkalmn'.2HYHX0Y&Z#[@  -3F89SVHMN%%
F	#??,	-si   TAR TF2R C<Q ER T	R$+RR RR 	T&A"TTTTcoder   r   c           	      t  K   t         st        d      	 dt         j                  v r[t         j                  d   }t        t         d      r8t         j	                         } |d   | |      }t         j                  ||      }|S ddddd	d
dddgdS # t        $ r}t        dt        |             d}~ww xY ww)z:Execute NBA strategy code using UniversalBacktestingEnginer   rM   _get_nba_dynamic_engineexecute   iX  g?001	moneylinerB   gffffff?r   )rC   bet_type
prediction
confidencestake)bets_generatedtotal_stakeexpected_valuerecommended_betszNBA strategy execution failed: N)rT   rY   rW   r#   rB  _calculate_nba_backtest_resultsr   )r@  r   r   
nba_enginedynamic_enginebetsr   r`   s           r*   r   r     s     :;;D&555+::5AJ)+DE!3!K!K!M0~i0v>,LLTSYZ  "  % +"("& !	
 	
  D9#a&BCCDs5   B8A,B B8B B8	B5B00B55B8c           
         K   t         st        d      	 dddddddd	d
dgdS # t        $ r}t        dt        |             d}~ww xY ww)zExecute financial strategy coder         gףp=
?g      ?z2024-01-15T10:00:00ZAAPLBUYg      ?g     0g@)r   symbolactionrI  entry_price)signals_generatedr   r   r2  recommended_signalsz%Financial strategy execution failed: N)rT   rY   r   )r@  r   r   r`   s       r*   r   r     sx     :;;J "$  "8$#"&#)$
 	
  J?AxHIIJs$   A$ A	A	AA		A__main__zmain:appz0.0.0.0i@  rS   )hostportreload	log_level)r  r?   )r  )r   )Q__doc__fastapir   r   r   fastapi.middleware.corsr   pydanticr   typingr   r	   r
   r   r  asynciologgingsysosr  r   r'  r$   getenvlowerr   r   r  pathr  dirnameabspath__file__basicConfigINFO	getLoggerr   rR   r   universal_backtestingr+   rT   rS   r`   rZ   r,   r   rP   rU   appadd_middlewarer   r   rb   rr   r   r   r   r  r   r   rX   r   r   r   deleter   rQ   rp   r~   r(  r   r  r  r  r.  r  r   r   uvicornrunr   rs   r*   <module>rz     s  
 < ; 2  , ,    
 	  
 "))-w7==?6I"))-v6<<>&H?	
>?	/_	R\/]
^_ 0I JK L   ',, '			8	$<@35
KKDE
+!))M56MN 
'H   *,CD%%  P# PS Pd C  D)V1i 1
/i 
/ 	 	 	     % % NC  ( Qs Q# Q Q S S S Q Q 
\O \ \ \* /_R _R? _R _RB 	$%c  &6 	. .  
G\4S> G\ G\Rf-# f- f-PDS D$sCx. DxX\]`be]eXfOg DBJ3 JS#X JU]^bcfhkck^lUm J4 zGKK [  Hj  
LLDQCHI  
LL7s;<MMsB   N N $7O NNO!N==OO-
O((O-