o
    Yi                     @   s~   d Z ddlZddl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 d	ejd
ejdejdefddZG dd dZdS )ub   
6层信号过滤 + 做空过滤

按优先级依次检查，任一层被过滤则信号无效。
    N)ListOptionalDict)	timedelta   )Signal   )settingscloses
timestampstarget_datereturnc           
      C   s~   ||k}|  dk rdS |  d }| | }|tdd }||k}|  dk r)dS |  d }| | }	|	dkr9dS ||	 |	 S )uL   
    计算60日趋势: (close[date] - close[date-60]) / close[date-60]
    r   g        r   <   )daysr   )sumr   )
r
   r   r   maskidx_now	close_nowtarget_60d_agomask_60idx_60close_60 r    /opt/langlang_ai/core/filters.pycalc_trend_60d   s   r   c                
   @   sr   e Zd ZdZdd ZdedefddZdeded	ed
ee	j
 def
ddZdededefddZdefddZdS )SignalFilteru:   
    信号过滤器：维护状态，逐信号过滤
    c                 C   s"   d| _ d| _i | _i | _i | _d S )Nr   F)consecutive_losses	paused_4hlast_entry_by_coinlast_short_by_cointoday_4h_entries)selfr   r   r   __init__0   s
   
zSignalFilter.__init__signalpnlc                 C   sH   |j dkr"|dk r|  jd7  _| jtjkrd| _dS dS d| _dS dS )ua   
        交易结果回调：更新连败计数

        连败计数只对做多信号
        longr   r   TN)	directionr   SCONSECUTIVE_LOSS_PAUSEr   )r!   r#   r$   r   r   r   update_trade_result7   s   


z SignalFilter.update_trade_resultbtc_trend_60dcoin_trend_60dbtc_daily_breakout_timesr   c                 C   s  ddd}|j dkr| |||S |jdkr)tj|  kr"tjkr)n ndd|fS |jdkr=|jdkr=|tjkr=dd|fS d	d
lm	} ||j}|jdkrg|jdkrg|j
|jkrgdd|j
dd|j d|fS |jdkrz|j
|jkrz|d  d9  < |jdkr|j }t|}	|	| jv r| j|	 |jkrdd|fS |j| j|	< |jdkr| jrdd| j d|fS |jdv r| jrd| _d| _|j| jv r| j|j }
|jdkr|j|
 jtjk rddtj d|fS |jdkr|tjd k r|d  tjd 9  < n|tjd k r|d  tjd 9  < |jdkr8tj\}}}||j  kr)|kr8n n|dk r8|d  |9  < |jdkri|jdv ritj\}}}|D ]}t|j| j|krgd|d< |d  |9  <  nqLdd|fS )u   
        检查信号是否通过所有过滤层

        Returns:
            (passed: bool, reason: str, adjustments: dict)
            adjustments可能包含仓位调整因子
              ?Fposition_multcross_resonanceshort4Hu   趋势死区(-30%~-15%)BTCUSDTu   BTC趋势<=0,山寨4H不做r   )get_coinu   量比z.1fzx>xr/   g      ?u   同天已有其他币4H信号u   连败u   笔,4H暂停)u   日线u   共振r   u   同币u   天内已有入场r   Tr0      通过)r&   _filter_shortsignal_typer'   DEAD_ZONE_LOWDEAD_ZONE_HIGHcoinBTC_TREND_THRESHOLDconfig.coinsr4   volume_ratiovol_filter_4hvol_filter_reduce
entry_timedatestrr    r   r   r   r   SAME_COIN_COOLDOWN_DAYSADJ_TREND_VERY_WEAKADJ_TREND_WEAKADJ_4H_SL_WIDEsl_distanceADJ_CROSS_RESONANCEabs)r!   r#   r*   r+   r,   adjustmentsr4   cfg
entry_datedate_key
last_entrysl_losl_hisl_multwindow_daysmultcapbtr   r   r   check_signalE   sf   











(
zSignalFilter.check_signal	btc_trend
coin_trendc                 C   sp   ddd}|t jkrdd|fS |t jkrdd|fS |j| jv r3| j|j }|j| jt jk r3dd|fS dd|fS )	u   做空信号过滤r-   Fr.   u   BTC趋势>30%,不做空u   本币趋势>15%,不做空u   做空间隔不足7天Tr6   )r'   SHORT_BTC_TREND_MAXSHORT_COIN_TREND_MAXr;   r   rA   r   SHORT_SAME_COIN_COOLDOWN)r!   r#   rX   rY   rK   lastr   r   r   r7      s   






zSignalFilter._filter_shortc                 C   s.   |j | j|j< |jdkr|j | j|j< dS dS )u   记录入场（用于去重）r1   N)rA   r   r;   r&   r   )r!   r#   r   r   r   record_entry   s   
zSignalFilter.record_entryN)__name__
__module____qualname____doc__r"   r   floatr)   r   pd	TimestamptuplerW   r7   r^   r   r   r   r   r   +   s"    
]r   )rb   pandasrd   numpynptypingr   r   r   datetimer   pipeliner   configr	   r'   ndarrayDatetimeIndexre   rc   r   r   r   r   r   r   <module>   s    
