
    YqiY                        U d Z ddlZddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ daeej                     ed<   deee	e
fded	ed
edededej                  fdZdej                  fdZ	 	 	 	 d0dedededededee   dee   dee   ddfdZ	 d1dedededdfdZ	 	 d2dededededdf
d Zd3ded!edefd"Zdedefd#Zdefd$Zd%edefd&Zd'edefd(Zd)ed*edefd+Zd4d,ed-ed.edefd/Zy)5z)
Logging utilities and helper functions.
    N)datetime)Optional)	LOG_LEVELLOG_FILELOG_TO_CONSOLELOG_TO_FILEDATE_FORMAT_loggertrading_botnamelevellog_fileconsolefilereturnc                    t        j                  |       }|j                  t        t         |j	                         t         j
                               |j                  j                          t        j                  dt              }|rEt        j                  t        j                        }|j                  |       |j                  |       |r7t        j                  |      }|j                  |       |j                  |       |a|S )a.  
    Setup and configure logging.

    Args:
        name: Logger name
        level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        log_file: Path to log file
        console: Enable console logging
        file: Enable file logging

    Returns:
        Configured logger instance
    z+%(asctime)s | %(levelname)-8s | %(message)s)datefmt)logging	getLoggersetLevelgetattrupperINFOhandlersclear	Formatterr	   StreamHandlersysstdoutsetFormatter
addHandlerFileHandlerr
   )	r   r   r   r   r   logger	formatterconsole_handlerfile_handlers	            '/var/www/html/crpytotradingbot/utils.pysetup_loggingr(      s    , t$F
OOGGU[[]GLLAB OO !!5I !//

;$$Y//* **84!!),,'GM    c                  .    t         
t               a t         S )zk
    Get the global logger instance.

    Returns:
        Logger instance (creates one if not exists)
    )r
   r(    r)   r'   
get_loggerr,   C   s     /Nr)   actionsymbolpricelotsmagictpslprofitc           
          t               }d|  d| d|dd|dd| 
}	|	|	d	|dz  }	|	|	d
|dz  }	|	|	d|dz  }	|j                  |	       y)aD  
    Log a trade action.

    Args:
        action: Trade action (BUY, SELL, CLOSE, etc.)
        symbol: Trading pair symbol
        price: Execution price
        lots: Position size
        magic: Magic number (thread ID)
        tp: Take profit price
        sl: Stop loss price
        profit: Realized profit/loss
    z[TRADE]  z @ z.8fz	 | Lots: .6f
 | Magic: Nz | TP: z | SL: z | P/L: .2fr,   info)
r-   r.   r/   r0   r1   r2   r3   r4   r#   msgs
             r'   	log_trader=   P   s    . \FVHAfXSs9T#JjQVPW
XC	~C!!	~C!!&&&
KKr)   eventdetailsc                 ^    t               }d|  d| }|r|d| z  }|j                  |       y)z
    Log a thread-related event.

    Args:
        event: Event type (CREATED, AVERAGING, CLOSED, etc.)
        magic: Thread magic number
        details: Additional event details
    z	[THREAD] r8   z | Nr:   )r>   r1   r?   r#   r<   s        r'   log_thread_eventrA   t   s<     \FeWJug
.CWI
KKr)   balanceequitymargin_usedopen_positionsc           
      X    t               }|j                  d| dd|dd|dd|        y)z
    Log account balance information.

    Args:
        balance: Account balance
        equity: Account equity
        margin_used: Used margin
        open_positions: Number of open positions
    z[BALANCE] Balance: r9   z | Equity: z | Margin: z | Positions: Nr:   )rB   rC   rD   rE   r#   s        r'   log_balancerG      sC     \F
KK
gc]+fS\ Bs#>.1A	Cr)   decimalsc                     | d| dS )z
    Format price for display.

    Args:
        price: Price value
        decimals: Number of decimal places

    Returns:
        Formatted price string
    .fr+   )r/   rH   s     r'   format_pricerL      s     AhZq=!"r)   c                 
    | dS )z~
    Format lot size for display.

    Args:
        lots: Lot size value

    Returns:
        Formatted lot size string
    r7   r+   )r0   s    r'   format_lotsrN      s     3Zr)   c                  *    t        j                         S )zG
    Get current timestamp.

    Returns:
        Current datetime
    )r   nowr+   r)   r'   timestamp_nowrQ      s     <<>r)   dtc                 ,    | j                  t              S )z|
    Convert datetime to string.

    Args:
        dt: Datetime object

    Returns:
        Formatted datetime string
    )strftimer	   )rR   s    r'   timestamp_to_strrU      s     ;;{##r)   date_strc                 6    t        j                  | t              S )zx
    Parse datetime from string.

    Args:
        date_str: Datetime string

    Returns:
        Datetime object
    )r   strptimer	   )rV   s    r'   str_to_timestamprY      s     X{33r)   	old_value	new_valuec                 $    | dk(  ry|| z
  | z  dz  S )z
    Calculate percentage change between two values.

    Args:
        old_value: Original value
        new_value: New value

    Returns:
        Percentage change
    r           d   r+   )rZ   r[   s     r'   calculate_percentage_changer_      s#     A~"i/366r)   	numeratordenominatordefaultc                     |dk(  r|S | |z  S )a
  
    Perform safe division with default value for division by zero.

    Args:
        numerator: Division numerator
        denominator: Division denominator
        default: Default value if denominator is zero

    Returns:
        Division result or default
    r   r+   )r`   ra   rb   s      r'   safe_divisionrd      s     a{""r)   )r   NNN) )r]   r   )   )r]   )__doc__r   r   r   typingr   configr   r   r   r   r	   r
   Logger__annotations__strboolr(   r,   floatintr=   rA   rG   rL   rN   rQ   rU   rY   r_   rd   r+   r)   r'   <module>rp      s    
   P P %)'..	! ( "/
// / 	/
 / ^^/d
GNN 
$ "!!! ! 	!
 ! 	! 	! UO! 
!N   
	. 	  	
 
,# # #S #
e 
 
x 
$ 
$c 
$
4s 
4x 
475 7U 7u 7 #U # # #QV #r)   