
    {j                        d dl 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
mZ d dlmZ  ed           G d	 d
                      Zd+dZd+dZd+dZddd,dZd-d"Zd#d$d.d*ZdS )/    )annotationsN)asdict	dataclass)Path)IterableSequence)	BotConfigT)frozenc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dS )NearMissEventfloattsstrstrategy_idcoinreasondrop_pctleverageroe_drop_pctrequired_drop_pctrequired_roe_drop_pctdistance_pctcurrent_price
high_priceN)__name__
__module____qualname____annotations__     near_miss.pyr   r      s         IIIIIIKKKOOOOOO    r    r   cfgr	   r   r   returnr   c                    t          | j                            |                                | j                            S N)r   leverage_by_coingetupperdefault_leverager"   r   s     r!   leverage_for_coinr+      s.    %))$**,,8LMMNNNr    c                l    t          t          | |          d          }t          | j                  |z  S )Ng{Gz?)maxr+   r   crash_roe_trigger_pct)r"   r   r   s      r!   roe_crash_required_drop_pctr/       s2    $S$//66H*++h66r    c                b    t          t          | j                  t          | |                    S )a  Unlevered drop threshold after respecting coin-specific leverage.

    The strategy's unlevered flash-crash trigger remains a hard floor, but a
    15% ROE-style crash is normalized per coin as 15 / leverage. The stricter
    of both thresholds avoids accidentally making high-leverage coins too easy
    to trigger unless the strategy explicitly lowers its flash-crash trigger.
    )r-   r   flash_crash_trigger_pctr/   r*   s     r!   effective_required_drop_pctr2   %   s+     uS0113NsTX3Y3YZZZr    )now_tsr   historyIterable[tuple[float, float]]r   r   r3   float | NoneNearMissEvent | Nonec                   d |D             }|r|dk    rd S t          |          }|dk    rd S ||z
  |z  dz  }	t          ||          }
|	|
z  }t          ||          }| |
z  }t          d|t          |	          z
            }t	          t          ||nt          j                              | |                                |t          |	d          t          |
d          t          |d          t          |d          t          |d          t          |d          t          |          t          |                    S )Nc                    g | ]\  }}|S r   r   ).0_prices      r!   
<listcomp>z)build_near_miss_event.<locals>.<listcomp>:   s    ,,,5e,,,r    r   g      Y@g              )r   r   r   r   r   r   r   r   r   r   r   r   )	r-   r+   r2   absr   r   timer(   round)r   r   r4   r   r   r"   r3   pricesr   r   r   r   r   required_roedistances                  r!   build_near_miss_eventrF   0   sS    -,G,,,F ]a''tVJQt+z9UBH d++Hh&L3C>>%%0L3)CMM9::H6-49;;??ZZ\\x##x##<++ 1155#L!448Q''M**$$   r    pathr   eventNonec                   | j                             dd           |                     dd          5 }|                    t	          j        t          |          d          dz              d d d            d S # 1 swxY w Y   d S )NT)parentsexist_okazutf-8)encoding)	sort_keys
)parentmkdiropenwritejsondumpsr   )rG   rH   fhs      r!   append_near_missrX   V   s    KdT222	3	)	) CR
F5MMT:::TABBBC C C C C C C C C C C C C C C C C Cs   :A;;A?A?
   )limiteventsSequence[NearMissEvent]rZ   intlist[NearMissEvent]c               6    t          | d           d |         S )Nc                :    | j         t          | j                   fS r%   )r   r@   r   )items    r!   <lambda>z!top_near_misses.<locals>.<lambda>]   s    D,=DM@R@R?R+S r    )key)sorted)r[   rZ   s     r!   top_near_missesre   \   s%    &SSTTTU[V[U[\\r    )r"   r	   r   r   r#   r   )r   r   r   r   r4   r5   r   r   r   r   r"   r	   r3   r6   r#   r7   )rG   r   rH   r   r#   rI   )r[   r\   rZ   r]   r#   r^   )
__future__r   rU   rA   dataclassesr   r   pathlibr   typingr   r   configr	   r   r+   r/   r2   rF   rX   re   r   r    r!   <module>rk      sv   " " " " " "   ) ) ) ) ) ) ) )       % % % % % % % %       $       O O O O7 7 7 7
[ [ [ [&  # # # # # #LC C C C FH ] ] ] ] ] ] ] ]r    