
    ril                     r   U d 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m	Z	 ddl
mZmZmZmZ ddlmZ ddlZddlZddlmZ ddlmc mZ ddl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"Z"d	d
ddddddddddZ# ej$        ej%                    ej&        d          Z' G d dej(                  Z) G d d          Z* G d d          Z+ G d d          Z, edd d!"          Z-e-.                    ed#gd$d#gd#g%           da/ee,         e0d&<    ej1                    Z2 G d' d(e!          Z3 G d) d*e!          Z4 G d+ d,e!          Z5e-6                    d-          d.             Z7e-8                    d/          d0             Z9e-8                    d1          d2             Z:e-;                    d3          d4e3fd5            Z<e-8                    d6          d7             Z=e-;                    d8          d4e5fd9            Z>e-;                    d:          d4e4fd;            Z?e-;                    d<          d=             Z@e-8                    d>          d?             ZAe-8                    d@          dA             ZBe-;                    dB          dC             ZCeDdDk    r eEdE            eEdF            eEdG            eEdE            eEdHe#dI                      eEdJe#dK                      eEdLe#dM                      eEdE            e"jF        dNe#dI         e#dK         dOdPQ           dS dS )Ra  
ML Inference Server V9 - Dual Model System
===========================================

4-hour timeframe trading system with:
1. Volatility Gate: Predict if there's enough movement
2. Trend Detector: Long/Short classifier
3. Exit Optimizer: RL model for optimal exit timing

API Endpoints:
- POST /predict - Get entry signal
- POST /exit-check - Check if should exit position
- GET /health - Health check
- GET /model-info - Model information
- POST /update-price - Update price for 4h candle building
    N)datetime	timedelta)OptionalDictAnyList)deque)FastAPIHTTPException)CORSMiddleware)	BaseModelz0.0.0.0i  z2/var/www/html/bestrading.cuttalo.com/models/btc_v9zI/var/www/html/bestrading.cuttalo.com/scripts/prices_BTC_EUR_2025_full.csv      gffffff?g{Gzt?<   {Gz?Q?)hostport	model_dirhistorical_datacandle_minuteslookback_periodsconfidence_thresholdfee_ratepreload_candles	stop_losstake_profit)levelzml-inference-v9c                   8     e Zd Zd	dedef fdZd Zd
dZ xZS )ExitOptimizer      	input_dim
hidden_dimc                    t                                                       t          j        t          j        ||          t          j        |          t          j                    t          j        d          t          j        ||          t          j        |          t          j                    t          j        d                    | _        t          j        |d          | _	        t          j        |d          | _
        d S )Ng?      )super__init__nn
SequentialLinear	LayerNormReLUDropoutnetpolicyvalue)selfr#   r$   	__class__s      Q/var/www/html/bestrading.cuttalo.com/services/ml-inference/inference_server_v9.pyr)   zExitOptimizer.__init__D   s    =Ii,,L$$GIIJsOOIj*--L$$GIIJsOO	
 	
 i
A..Yz1--


    c                     |                      |          }|                     |          }|                     |          }||fS N)r0   r1   r2   )r3   xfeaturesaction_logitsr2   s        r5   forwardzExitOptimizer.forwardS   s>    88A;;H--

8$$e##r6   Tc                     |                      |          \  }}t          j        |d          }|r|                    d          }n3t          j                            |          }|                                }|||fS )N)dim)r<   FsoftmaxargmaxtorchdistributionsCategoricalsample)r3   r9   deterministicr;   r2   probsactiondists           r5   
get_actionzExitOptimizer.get_actionY   sw    #||Au	-R000 	#\\b\))FF&22599D[[]]Fue##r6   )r!   r"   )T)__name__
__module____qualname__intr)   r<   rK   __classcell__)r4   s   @r5   r    r    C   ss        . .# .s . . . . . .$ $ $$ $ $ $ $ $ $ $r6   r    c                       e Zd ZdZddefdZddededee	         fd	Z
dee	         fd
Zdej        fdZddededefdZdS )CandleBuilderz$Build 4h candles from minute prices.r   r   c                 h    || _         d | _        t          d          | _        g | _        d | _        d S )Nd   )maxlen)r   current_candler	   completed_candlesminute_pricescandle_start_time)r3   r   s     r5   r)   zCandleBuilder.__init__k   s;    ,"!&c!2!2!2!%r6   Nprice	timestampreturnc                    |t          j                    }| j        H|j        dz  |j        z   }|| j        z  | j        z  }|                    |dz  |dz  dd          | _        || j        z
                                  dz  }|| j        k    rS|                                 }| xj        t          | j                  z  c_        |g| _
        ||||| j        d| _        |S | j
                            |           | j        ||||| j        d| _        nPt          | j        d         |          | j        d<   t          | j        d         |          | j        d<   || j        d	<   dS )
z2Add a price tick. Returns completed candle if any.Nr   r   )hourminutesecondmicrosecondminutesopenhighlowcloser[   rf   rg   rh   )r   utcnowrY   r^   r_   r   replacetotal_seconds_complete_candler   rX   rV   appendmaxmin)r3   rZ   r[   rc   boundarytime_in_candle	completeds          r5   	add_pricezCandleBuilder.add_pricer   s    ))I !)nr)I,<<G4#66$:MMH%.%6%6^"}	 &7 & &D" $d&<<KKMMPRRT000--//I ""i8K&L&L&LL"""'D!3# #D  	!!%(((&!3# #D +.d.A&.I5*Q*QD'),T-@-G)O)OD&+0D(tr6   c                     | j         t          | j                  dk    rd S | j                                         }t          | j                  |d<   | j                            |           |S )Nr   volume)rV   lenrX   copyrW   rm   )r3   candles     r5   rl   zCandleBuilder._complete_candle   sj    &#d.@*A*AQ*F*F4$))++t122x%%f---r6   c                     t          | j                  dk    rt          j                    S t          j        t	          | j                            }|                    dd           |S )z#Get completed candles as DataFrame.r   r[   Tinplace)rv   rW   pd	DataFramelist	set_index)r3   dfs     r5   get_dataframezCandleBuilder.get_dataframe   sY    t%&&!++<>>!\$t56677
[$///	r6   r   csv_pathnum_candlesc           	      \   	 t          j        |          }t          j        |d         d          |d<   |                    dd           |                    | j         d                              dddd	d
d                                          }|                    |          }|	                                D ]\  }}t          |d                   t          |d                   t          |d                   t          |d                   t          |d                   |d}| j                            |           t          |          dk    r|j        d         }|t          | j                  z   | _        t          |j        d         d                   t          |j        d         d                   t          |j        d         d                   t          |j        d         d                   | j        d| _        t&                              dt          |           d|j        d          d|j        d                     t          |          S # t*          $ r@}	t&                              d|	            ddl}
|
                                 Y d}	~	dS d}	~	ww xY w)z<Load historical 4h candles from CSV to bootstrap the system.r[   s)unitTrz   ro   firstrn   lastsum)re   rf   rg   rh   ru   re   rf   rg   rh   ru   )re   rf   rg   rh   ru   r[   r   r>   rb   rd   zLoaded z historical 4h candles from z to z#Failed to load historical candles: N)r|   read_csvto_datetimer   resampler   aggdropnatailiterrowsfloatrW   rm   rv   indexr   rY   ilocrV   loggerinfo	Exceptionerror	traceback	print_exc)r3   r   r   r   df_4hidxrowrx   last_candle_timeer   s              r5   load_historicalzCandleBuilder.load_historical   s   1	X&&B nR_3GGGB{OLLdL333 KK4#6 ; ; ;<<@@B B   vxx  JJ{++E "NN,, 	6 	6S!#f+..!#f+.. U,,"3w<00#CM22!$  &--f5555 5zzA~~#(;r? )9IdNa<b<b<b)b&!%*R."9::!%*R."9:: B!899"5:b>'#:;;!%!7' '# KKo#e**oo%+VW.oo^c^ijl^moopppu:: 	 	 	LLBqBBCCC!!!11111		s   II! !
J++5J&&J+)r   r8   )r   )rL   rM   rN   __doc__rO   r)   r   r   r   r   rs   rl   r|   r}   r   strr    r6   r5   rR   rR   h   s        ..& &s & & & &3 3u 3 3Xd^ 3 3 3 3j(4.    r|    3 3 3# 3s 3 3 3 3 3 3r6   rR   c                   <    e Zd ZdZd Zdej        dej        fdZdS )FeatureComputerzCompute features for V9 models.c                 *    g d| _         g d| _        d S )N)vol_3vol_6vol_12vol_24atr_3atr_6atr_12
vol_regime	range_pct	range_smavolume_ratiohour_sinhour_cosret_1ret_3ret_6)r   ret_2r   r   ret_12ret_24sma_cross_6_12sma_cross_12_24sma_cross_24_48price_vs_sma12price_vs_sma24rsi_normroc_3roc_6roc_12r   r   r   r   r   r   r   r   )vol_featurestrend_featuresr3   s    r5   r)   zFeatureComputer.__init__   s0    
 
 
	
 	
 	
r6   r   r\   c                 X   |                                 }dD ]#}|d                             |          |d| <   $dD ]J}|d                             |                                          t	          j        d          z  |d| <   Kt	          j        |d         |d	         z
  t	          j        t          |d         |d                             d
          z
            t          |d	         |d                             d
          z
                                |d<   dD ]>}|d                             |          	                                |d         z  |d| <   ?dD ]5}|d                             |          	                                |d| <   6|d         |d         z
  |d         z  |d<   |d         |d         z
  |d         z  |d<   |d         |d         z
  |d         z  |d<   |d         |d         z
  |d         z  |d<   |d         |d         z
  |d         z  |d<   |d         
                                }|                    |dk    d                              d          	                                }|                    |dk     d                               d          	                                }||dz   z  }ddd
|z   z  z
  |d<   |d         dz
  dz  |d<   dD ]#}|d                             |          |d | <   $|d!                             d"          	                                |d#<   |d!         |d#         dz   z  |d$<   |d%         |d&         dz   z  |d'<   |d         |d	         z
  |d         z  |d(<   |d(                             d)          	                                |d*<   |j        j        |d+<   t	          j        d,t          j        z  |d+         z  d-z            |d.<   t	          j        d,t          j        z  |d+         z  d-z            |d/<   |S )0zCompute all features.)r'   r&               rh   ret_)r   r   r   r   r   i  vol_rf   rg   r'   tr)r   r   r   atr_)r   r   r   0   sma_sma_6sma_12r   sma_24r   sma_48r   r   r   r      g|=rT   rsi2   r   roc_ru   r   
volume_smar   r   r   r   r   r   r   r^   r&   r   r   r   )rw   
pct_changerollingstdnpsqrtmaximumabsshiftmeandiffwherer   r^   sinpicos)r3   r   periodsdeltagainlossrss          r5   computezFeatureComputer.compute  s_   WWYY , 	C 	CG#%g;#9#9'#B#BBg   & 	Y 	YG#%g;#6#6w#?#?#C#C#E#EPWHXHX#XBg   :vJE"JBvJG!2!21!5!5566BuI7 1 1! 4 4455 
 
4 " 	R 	RG#%d8#3#3G#<#<#A#A#C#Cbk#QBg   ' 	G 	GG#%g;#6#6w#?#?#D#D#F#FBg   "7bl :bkI!#H8!<7 K!#H8!<7 K "7bl :blJ "7bl :blJ 7  ""{{519a((004499;;UQY***33B77<<>>TE\"3!b&>*5	U)b.B.: " 	C 	CG#%g;#9#9'#B#BBg   h<//3388::<\R-=-EF> g;"X,*>?< f:5	1R[@;[/11!4499;;; X]6
BE	BvJ 6 ;<<:BE	BvJ 6 ;<<:	r6   N)rL   rM   rN   r   r)   r|   r}   r   r   r6   r5   r   r      sO        ))
 
 
*=", =2< = = = = = =r6   r   c                       e Zd ZdZdefdZdefdZdefdZ	dde
d	edee         fd
Zdeeef         fdZdede
fdZde
deeef         fdZd ZdS )InferenceEngineV9z/Main inference engine for V9 Dual Model system.configc                    || _         t          j        t          j                                        rdnd          | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        t          |d                   | _        t                      | _        d| _        d| _        d | _        d| _        d| _        i | _        t.                              d| j                    d S )Ncudacpur   r   z!InferenceEngineV9 initialized on )r   rC   devicer   is_availablevol_gate_model
long_modelshort_model
exit_model
vol_scalertrend_scalerr   r   rR   candle_builderr   feature_computerpositionentry_price
entry_timemax_profit_seensteps_in_position
model_infor   r   )r3   r   s     r5   r)   zInferenceEngineV9.__init__R  s    lUZ-D-D-F-F#Q66ERR #   !" ,F3C,DEE / 1 1  !"EEEFFFFFr6   r\   c                    	 | j         d         }t          j        t          j                            |d                    | _        t          j        t          j                            |d                    | _	        t          j        t          j                            |d                    | _
        t          j        t          j                            |d                    | _        t          j        t          j                            |d                    | _        t          j        t          j                            |d                    | _        t          j        t          j                            |d	                    | _        t          j        t          j                            |d
          | j        d          }t#          dd          | _        | j                            |d                    | j                            | j                   | j                                         dt-          j                                                    |                    dd          |                    dd          dd| _        t6                              d           dS # t:          $ r@}t6                              d|            ddl}|                                  Y d}~dS d}~ww xY w)zLoad all models.r   zvol_gate_model.txt)
model_filezvol_scaler.pklzvol_features.pklzlong_model.txtzshort_model.txtztrend_scaler.pklztrend_features.pklzexit_optimizer_best.ptF)map_locationweights_onlyr!   r"   )r#   r$   model_state_dictV9_DUAL_MODELavg_pnlunknownwin_rate4h)version	loaded_atexit_avg_pnlexit_win_rate	timeframez!All V9 models loaded successfullyTzFailed to load models: r   N)!r   lgbBoosterospathjoinr   joblibloadr   r   r   r   r   r   rC   r   r    r   load_state_dicttoevalr   now	isoformatgetr  r   r   r   r   r   r   )r3   r   exit_checkpointr   r   s        r5   load_modelszInferenceEngineV9.load_modelss  su   (	K0I #&+iQe9f9f"g"g"gD$k"',,yBR*S*STTDO &BGLLDV,W,W X XD "kRW\\)M]5^5^___DO"{bgll9N_6`6`aaaD &BGLLDV,W,W X XD"(+bgll9FZ.[.["\"\D $jY(@AA!["  O
 ,aCHHHDOO++O<N,OPPPOt{+++O  """ +%\^^5577 / 3 3Iy I I!0!4!4Z!K!K! DO KK;<<<4 	 	 	LL6166777!!!55555		s   J+J/ /
K995K44K9c                 b   | j                             d          }| j                             dd          }|rZt          j                            |          r;| j                            ||          }t                              d| d           |S t          	                    d|            dS )z>Load historical candles to bootstrap the system (no waiting!).r   r   r   zPre-loaded z, historical candles - SYSTEM READY TO TRADE!zHistorical data not found at r   )
r   r  r  r  existsr   r   r   r   warning)r3   r   r   loadeds       r5   load_historical_dataz&InferenceEngineV9.load_historical_data  s    ;??#455koo&7<< 	x00 	(88;OOFKKZfZZZ[[[MNNE8EEFFF1r6   NrZ   r[   c                 8    | j                             ||          S )z7Update with new price. Returns completed candle if any.)r   rs   )r3   rZ   r[   s      r5   update_pricezInferenceEngineV9.update_price  s    ",,UI>>>r6   c                 D   | j         ddiS | j                                        }t          |          dk     r$ddt          |           dt          |          dS | j                            |          }|                                }t          |          d	k    rdd
dS |j        d         }	 | j        	                    || j
                 j                            dd                    }| j                             |          d	         }n# t          $ r}dd| dcY d}~S d}~ww xY w|dk     rddt          |          dS 	 | j        	                    || j                 j                            dd                    }| j                            |          d	         }| j                            |          d	         }n# t          $ r}dd| dcY d}~S d}~ww xY w| j        d         }	||	k    r:||k    r4dt          |          t          |          t          |d                   dS ||	k    r:||k    r4dt          |          t          |          t          |d                   dS ddt          |          t          |          t          |          dS )z(Get entry signal based on current state.Nr   zModels not loadedr   WAITzAccumulating data: z/50 candles)signalreasoncandlesr   zNo valid features)r*  r+  r>   r'   ERRORzVol gate error:       ?zLow volatility expected)r*  r+  vol_probabilityzTrend detection error: r   LONGrh   )r*  
confidencer/  rZ   SHORTHOLDzNo confident signal)r*  r+  
long_probashort_probar/  )r   r   r   rv   r   r   r   r   r   	transformr   valuesreshapepredictr   r   r   r   r   r   r   )
r3   r   latestvol_X	vol_probar   trend_Xr4  r5  r   s
             r5   get_entry_signalz"InferenceEngineV9.get_entry_signal  s   &011 ..00r77R<< DBDDDr77   "**2..YY[[r77a<<$0CDDD	IO--fT5F.G.N.V.VWXZ\.].]^^E+33E::1=II 	I 	I 	I%1GA1G1GHHHHHHHH	I s?? 3#(#3#3  	P'11&9L2M2T2\2\]^`b2c2cddG0099!<J*227;;A>KK 	P 	P 	P%1N11N1NOOOOOOOO	P  ${+AB,,,k1I1I #J//#(#3#3vg//	   ///K*4L4L!#K00#(#3#3vg//	   !/#J//$[11#(#3#3  s>   0AD 
D+D& D+&D+A>G 
G#GG#G#	directionc                     || _         || _        t          j                    | _        d| _        d| _        t                              d|dk    rdnd d|            dS )zOpen a position.r   zPosition opened: r'   r0  r2  z @ N)	r   r   r   ri   r   r   r  r   r   )r3   r?  rZ   s      r5   open_positionzInferenceEngineV9.open_position  sf    ! "/++ !"Y)q..gYYRWYYZZZZZr6   current_pricec           
         | j         dk    rdddS | j        dddS | j         dk    r|| j        z
  | j        z  }n| j        |z
  | j        z  }t          | j        |          | _        | xj        dz  c_        | j                            d	d
          }|| k    rrt          	                    d|dz  dd|dz  dd           dd	t          |          t          || j        d         z
            d| j        t          | j                  dS | j                            dd          }||k    rrt                              d|dz  dd|dz  dd           ddt          |          t          || j        d         z
            d| j        t          | j                  dS | j                                        }t          |          dk    rj| j                            |          }|j        d         }|                    dd          }|                    dd          }|                    dd          }	nd\  }}}	t%          j        || j        || j        z
  | j        dz  |||	| j         gt$          j                   }
t+          j        |
                              d                              | j                  }t+          j                    5  | j                            |d!"          \  }}}ddd           n# 1 swxY w Y   |d#                                         }|                                dk    s| j        dk    rr|                                dk    rd$nd%}d|t          |          t          || j        d         z
            t          |          | j        t          | j                  dS d&t          |          t          |          | j        t          | j                  d'S )(&Check if should exit current position.r   NONEzNo position)rI   r+  Nr-  zExit model not loadedr'   r   r   zSTOP LOSS triggered: PnL rT   z.2fz% <= -z.0f%EXITr   g      ?)rI   r+  pnlnet_pnlexit_probabilityr  r   r   r   zTAKE PROFIT triggered: PnL z% >= r>   r   r.  r   r   )r.  r   r   r   )dtypeT)rG   )r   r'   model_decisiontimeoutr3  )rI   rH  rJ  r  r   )r   r   r   rn   r   r  r   r  r   r#  r   r   r   r   rv   r   r   r   r   arrayfloat32rC   FloatTensor	unsqueezer  r   no_gradrK   item)r3   rB  rH  r   r   r   r:  r   r   r   
exit_statestate_tensorrI   rH   r2   
exit_probar+  s                    r5   
check_exitzInferenceEngineV9.check_exit  sh   =A$>>>?"%1HIII =A 4#33t7GGCC#m3t7GGC"4#7==!# KOOK66	9*NN^s3w^^^)TW-^^^^___ %Szz t{:'>!>??$'%)%;#()=#>#>   koomT::+KK^c#g^^^TW^^^^___ 'Szz t{:'>!>??$'%)%;#()=#>#>    ..00r77Q;;&..r22BWR[FJJw,,EJJw**Ezz*a00HH%."E5( X $&&"R'M	
 	 	 	
 (44>>qAADDT[QQ]__ 	` 	`#'?#=#=lZ^#=#_#_ FE5	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 4[%%''
 ;;==A!72!=!=)/!););%%F  Szz t{:'>!>??$)*$5$5%)%;#()=#>#>   :: %j 1 1!%!7$T%9::
 
 	
s   !K;;K?K?c                     t                               d| j        dk    rdnd            d| _        d| _        d| _        d| _        d| _        dS )Close current position.zPosition closed. Was r'   r0  r2  r   N)r   r   r   r   r   r   r  r   s    r5   close_positionz InferenceEngineV9.close_position^  sY    Wdmq6H6HFFgWWXXX !"r6   r8   )rL   rM   rN   r   dictr)   boolr   rO   r%  r   r   r   r   r'  r   r   r>  rA  rW  rZ  r   r6   r5   r   r   O  s6       99Gt G G G GB*T * * * *Xc    ? ?% ?H ?QU ? ? ? ?C$sCx. C C C CJ[s [5 [ [ [ [^
 ^
$sCx. ^
 ^
 ^
 ^
@# # # # #r6   r   zML Inference Server V9z(Dual Model Trading System (4h timeframe)z9.0.0)titledescriptionr  *T)allow_originsallow_credentialsallow_methodsallow_headersenginec                   4    e Zd ZU eed<   dZee         ed<   dS )UpdatePriceRequestrZ   Nr[   )rL   rM   rN   r   __annotations__r[   r   r   r   r6   r5   rf  rf    s/         LLL#Ix}#####r6   rf  c                       e Zd ZU eed<   dS )ExitCheckRequestrB  N)rL   rM   rN   r   rg  r   r6   r5   ri  ri    s         r6   ri  c                   $    e Zd ZU eed<   eed<   dS )OpenPositionRequestr?  rZ   N)rL   rM   rN   rO   rg  r   r   r6   r5   rk  rk    s"         NNNLLLLLr6   rk  startupc                     K   t          t                    at                                           t                                          } t
                              d|  d           d S )Nz!V9 Inference Server started with z pre-loaded candles)r   CONFIGrd  r   r%  r   r   r$  s    r5   startup_eventrp    s^       v&&F
 ((**F
KKOFOOOPPPPPr6   z/healthc            	      (  K   t           rt          t           j        j                  nd} dt           rt           j        d undt           rt          t           j                  ndt          t          j                    t          z
            dd| | dk    dS )	Nr   healthyFzN/Ar  r  r   )statusmodels_loadedr   uptimer  r  candles_readyready_to_trade)
rd  rv   r   rW   r   r   r   r   r  startup_time)candle_counts    r5   healthrz    s      CIP3v,>???qL>DO.d::%(.9#fm$$$Ehlnn|344"%&",	 	 	r6   z/model-infoc                  4   K   t           sddiS t           j        S )Nr   Engine not initialized)rd  r  r   r6   r5   r  r    s#       3122r6   z/update-pricerequestc                   K   t           st          dd          d}| j        rt          j        | j                  }t                               | j        |          }d| j        |dut          t           j        j	                  dS )z!Update price for candle building.  r|  status_codedetailNT)successrZ   candle_completedtotal_candles)
rd  r   r[   r   fromisoformatr'  rZ   rv   r   rW   )r}  r[   rr   s      r5   r'  r'    s        N4LMMMMI >*7+<==	##GM9==I %T1V2DEE	  r6   z/entry-signalc                  h   K   t           st          dd          t                                           S )zGet entry signal.r  r|  r  )rd  r   r>  r   r6   r5   r>  r>    s7        N4LMMMM""$$$r6   z/open-positionc                    K   t           st          dd          t                               | j        | j                   d| j        dk    rdnd| j        dS )	zOpen a new position.r  r|  r  Tr'   r0  r2  )r  r?  rZ   )rd  r   rA  r?  rZ   r}  s    r5   rA  rA    sk        N4LMMMM
*GM:::&0A55VV7  r6   z/check-exitc                 t   K   t           st          dd          t                               | j                  S )rD  r  r|  r  )rd  r   rW  rB  r  s    r5   rW  rW    s<        N4LMMMMW2333r6   z/close-positionc                  p   K   t           st          dd          t                                            ddiS )rY  r  r|  r  r  T)rd  r   rZ  r   r6   r5   rZ  rZ    sB        N4LMMMM
tr6   z	/positionc                  4  K   t           st          dd          t           j        t           j        dk    rdnt           j        dk    rdndt           j        t           j        rt           j                                        nd	t           j        t           j        d
S )zGet current position info.r  r|  r  r'   r0  r>   r2  FLATN)r   r?  r   r   r  r   )rd  r   r   r   r   r  r  r   r   r6   r5   get_positionr    s        N4LMMMM O%!33VVV_XZEZEZ''`f)7=7HRf'11333d#5!1  r6   z/candlesc                     K   t           st          dd          t          t           j        j                  } t          |           t           j        j        t          |           dk    r
| dd         n| dS )zGet accumulated candles.r  r|  r     N)countcurrentlatest_5)rd  r   r~   r   rW   rv   rV   )r,  s    r5   get_candlesr    sx        N4LMMMM6(:;;GW(7$'LLA$5$5GBCCLL7  r6   z/reload-historicalc                    K   t           st          dd          t           j        j                                         dt           j        _        dt           j        _        t                                           } d| | dk    dS )z:Reload historical candles (reset and pre-load fresh data).r  r|  r  NTr   )r  candles_loadedrw  )rd  r   r   rW   clearrV   rY   r%  ro  s    r5   reload_historicalr    s        N4LMMMM +11333+/F(.2F+ ((**F  B,  r6   __main__z<============================================================z*ML INFERENCE SERVER V9 - DUAL MODEL SYSTEMz14-hour timeframe | Volatility Gate + Trend + ExitzHost: r   zPort: r   zModel dir: r   zinference_server_v9:appFr   )r   r   reload	log_level)Gr   r  sysjsonnumpyr   pandasr|   r   r   typingr   r   r   r   collectionsr	   loggingrC   torch.nnr*   torch.nn.functional
functionalr@   lightgbmr  r  fastapir
   r   fastapi.middleware.corsr   pydanticr   uvicornrn  basicConfigINFO	getLoggerr   Moduler    rR   r   r   appadd_middlewarerd  rg  r  rx  rf  ri  rk  on_eventrp  r  rz  r  postr'  r>  rA  rW  rZ  r  r  r  rL   printrunr   r6   r5   <module>r     s    " 
			 



          ( ( ( ( ( ( ( ( , , , , , , , , , , , ,                             * * * * * * * * 2 2 2 2 2 2        Eb 
 
  ', ' ' ' '		,	-	-$ $ $ $ $BI $ $ $JD D D D D D D DVU U U U U U U UxV# V# V# V# V# V# V# V#z g
":     %%%     '+"# * * *x|~~$ $ $ $ $ $ $ $
    y       )   
 iQ Q Q       / 2    & % % % 

!4 
 
 
 
 -4. 4 4 4 4 
      
 
 
 
   . z	E(OOO	E
6777	E
=>>>	E(OOO	E
#6&>
#
#$$$	E
#6&>
#
#$$$	E
-{+
-
-...	E(OOOGK!F^F^      r6   