
    iWib                         d dl 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 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 d dlmZ d dlmZ  e j        e          Z G d d          ZdS )    N)Optional)AsyncSession)settings)fetch_multi_timeframeget_current_price)DecisionEngine)risk_engine)execution_engine)simulation_engine)TradeTradeStatus)Strategy)telegram_service)selectc                   >    e Zd ZdZdefdZdededee	         fdZ
dS )	TradeServicez
    Orchestrates the full trade lifecycle:
    1. Fetch market data
    2. Run decision engine
    3. Apply risk management
    4. Execute or simulate the trade
    5. Send Telegram notification
    decision_enginec                     || _         d S )N)r   )selfr   s     >/var/www/html/crypto-bot/backend/app/services/trade_service.py__init__zTradeService.__init__   s    .    pairdbreturnc           
      h  K   t           j        st                              d           dS |                    t          t                                        t          j        t          j
        k                         d{V }t          |                                                                          }t          j        |          s"t                              d| d|            dS |                    t          t                                d{V }|                                                                }d |D             }	 t#          |ddg          }n8# t$          $ r+}	t                              d	| d
|	            Y d}	~	dS d}	~	ww xY wt)          |          }
|
sdS | j                            ||||
          }|d         dvr(t                              d| d
|d                     dS |d         }|                    d          }|t          j        |          n|
dz  }t          j        |
||          }t          j        |
||          }d}t          j        ||
|          }|||d         |                    d          |                    dg           |                    di           d}t:          j        }|dk    r"t?          j         ||||
||||           d{V }n!tC          j         ||||
||||           d{V }|rt          j"        |           d{V  |S )z
        Run one full analysis and execution cycle for a trading pair.
        Returns the opened Trade if a signal is acted on, else None.
        z$Bot is paused, skipping signal cycleNzMax open trades reached (z), skipping c                 6    i | ]}|j         	|j        |j        S  )enablednameweight).0ss     r   
<dictcomp>z1TradeService.run_signal_cycle.<locals>.<dictcomp>6   s%    QQQqyQAFAHQQQr   15m1h)
timeframesz Failed to fetch market data for z: )r   market_datastrategy_weightscurrent_pricesignal)BUYSELLzNo actionable signal for g{Gz?g     @@
confidencemarket_conditionstrategies_breakdownsupport_resistance)r   r+   r.   r/   r0   r1   REAL)#r   
is_runningloggerinfoexecuter   r   wherestatusr   OPENlenscalarsallr	   can_open_trader   r   	Exceptionerrorr   r   analyzedebuggetcalculate_atrcalculate_stop_losscalculate_take_profitscalculate_position_sizer   TRADING_MODEr
   
open_trader   notify_trade_opened)r   r   r   result
open_countstrat_resultstrategies_dbr)   r(   er*   decisionr+   df_1hatrsltpscapitalquantitysnapshotmodetrades                         r   run_signal_cyclezTradeService.run_signal_cycle    s       * 	KK>???4 zz5MM0@ @AA
 
 
 
 
 
 
 
 ))--//00
)*55 	KKRJRRDRRSSS4  ZZx(8(899999999$,,..2244QQmQQQ	/%OOOKK 	 	 	LLGDGGAGGHHH44444	 *$// 	4 '//#-'	 0 
 
 H_44LLQTQQXh=OQQRRR4(#%%272Ck'...Y]I],]FCHH0FKK 6wrRR "<0 (-? @ @$,LL1G$L$L"*,,/CR"H"H
 
 $6>>*5D&-S(H       EE ,6D&-S(H       E  	>"6u=========s   E   
F* FFN)__name__
__module____qualname____doc__r   r   strr   r   r   rY   r   r   r   r   r      so         / / / / /O3 OL OXe_ O O O O O Or   r   )loggingtypingr   sqlalchemy.ext.asyncior   
app.configr   app.data_layer.market_datar   r   app.engines.decision_enginer   app.engines.risk_enginer	   app.engines.execution_enginer
   app.engines.simulation_enginer   app.models.trader   r   app.models.strategyr   app.services.telegram_servicer   
sqlalchemyr   	getLoggerrZ   r4   r   r   r   r   <module>rm      s@          / / / / / /       O O O O O O O O 6 6 6 6 6 6 / / / / / / 9 9 9 9 9 9 ; ; ; ; ; ; / / / / / / / / ( ( ( ( ( ( : : : : : :      		8	$	$\ \ \ \ \ \ \ \ \ \r   