o
    Yi"                     @   s   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 ddlmZ eG dd	 d	Zd
ededededededejdejdee fddZd
ededededededededejdefddZdS )u   
出场模块 — 结构trailing止损

规则:
- 浮盈>5%后激活trailing
- BTC trailing 15% / ETH 20% / 山寨 25%
- 做空从最低点反弹12%
- 最长持仓：做多500根4H / 做空200根4H
- 止损触发直接出场
    N)	dataclass)Optional   )settings)get_coinc                   @   s\   e Zd ZU dZejed< eed< eed< eed< eed< eed< e	ed< eed	< eed
< dS )
ExitResultu   出场结果	exit_time
exit_priceexit_reasonpnl_pct
pnl_dollarmax_unrealized_pct	hold_barsexit_efficiencyfeesN)
__name__
__module____qualname____doc__pd	Timestamp__annotations__floatstrint r   r   !/opt/langlang_ai/core/trailing.pyr      s   
 
r   	directionentry_price	stop_losscoinentry_methodnotionaldf_4h
entry_timereturnc                  C   s  t |}| dkr|jnd}	| dkrtjntj}
|d |k}|| }t|dkr)dS |dkr3|tj }n|tj }| dkr?|}n|}d}d}d}| D ]\}}|d	7 }|d
 }|d }|d }| dkrt	||}|| | }t	||}||kr|}d}|d dkr|d | |d  nd}|dkr|d	tj
  }d}t| ||||||||d 	  S || | }|tjkrd}|r|| | }||	kr|d	|	  }t| ||d|||||d 	  S n[t||}|| | }t	||}||kr|}d}t| ||||||||d 	  S || | }|tjkrd}|r5|| | }||	kr5|d	|	  }t| ||d|||||d 	  S ||
krJt| ||d|||||d 	  S qK|dkre|jd }t| ||d d|||||d 	S dS )uu  
    模拟持仓过程（逐根4H bar）

    Args:
        direction: 'long' or 'short'
        entry_price: 入场价
        stop_loss: 止损价
        coin: 币种
        entry_method: '1H回踩' or '4H直接'
        notional: 名义持仓
        df_4h: 4H K线数据
        entry_time: 入场时间

    Returns:
        ExitResult or None if no exit found
    longgQ?	timestampr   Nu   1H回踩        F   highlowcloser   openg?extreme_slippageTtrailingmax_holddata_end)r   trailing_pctSMAX_HOLD_LONG_4H_BARSMAX_HOLD_SHORT_4H_BARSlen	FEE_MAKER	FEE_TAKERiterrowsmaxSLIPPAGE_EXTREME_build_resultTRAILING_ACTIVATE_PCTminiloc) r   r   r   r    r!   r"   r#   r$   cfgr3   r0   maskbars	entry_fee
peak_pricetrough_pricer   trailing_activer   _barhilocl
unrealizedr	   reasonbar_dropcurrent_unrealizeddrawdown_from_peakbounce_from_troughlast_barr   r   r   simulate_exit#   s   


$







rT   r	   rN   rD   r   r   r   c	                 C   sp   | dkr|| | }	n|| | }	|t j }
||
 }||	 | }|dkr)|	| }nd}t||||	|||||d	S )u   构建出场结果r&   r   r(   )	r   r	   r
   r   r   r   r   r   r   )r4   FEE_EXITr   )r   r   r	   rN   r"   rD   r   r   r   r   exit_fee
total_feesr   r   r   r   r   r=      s(   

r=   )r   numpynppandasr   dataclassesr   typingr   configr   r4   config.coinsr   r   r   r   	DataFramer   rT   r   r=   r   r   r   r   <module>   sd    	
 	
