
    JjZ>                    6   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	m
Z
 d dlmZ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mZmZ d dlmZmZ d dlmZ d dl m!Z! d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d  Z3d!S )"    )annotations)datetimetimezone)Decimal)summarize_l2_book)build_market_confluence_reportscore_coin_confluence)CoinMarketContextMarketContextSnapshot)event_risk_from_news_itemsload_event_risk_context)CoinGeckoFundamentalsClient) build_normalized_market_snapshot)!_build_research_sentiment_context)append_snapshotenrich_with_derivatives_deltaswrite_latest)collect_news_event_riskparse_rss_itemsclassify_market_rows)build_reportc                    i dddt          d          dt          d          dt          d          d	t          d
          dt          d          dt          d          dt          d          dt          d          dt          j        t          j                  dt          d          dddddt          d          dt          d          dt          d          d t          d!          t          d          t          d"          t          d#          t          d#          t          d$          t          d$          t          d%          t          d%          d&}|                    |            t          d'i |S )(NcoinBTCrsi55sma_fast101sma_slow100atr1.2funding0volume50000000mid102
spread_pctz0.03	timestampreliability_scorez0.99
stale_dataFl2_availableTopen_interest12345.67premiumz0.00002	oracle_pxz102.0mark_pxz102.057500000050000z0.02z0.04)prev_day_pxday_ntl_vlmbid_depth_notional_5ask_depth_notional_5buy_impact_1k_pctsell_impact_1k_pctbuy_impact_5k_pctsell_impact_5k_pct )r   r   nowr   utcupdater
   )	overridesdatas     tests/test_market_confluence.pyctxrE      s   wt}} 	GENN 	GENN	
 	wu~~ 	73<< 	'*%% 	wu~~ 	gfoo 	X\(,// 	WV__ 	e 	 	,, 	79%%  	WW%%!" 	78$$#$ u~~z** ' 0 0 ' 0 0$V__%foo$V__%foo3  D6 	KK	$$t$$$    c                     t          t                                } | j        t          d          k    sJ | j        dk    sJ | j        du sJ | j        du sJ | j        dk    sJ d S )N60paper_candidateFr>   )r	   rE   final_scorer   recommendationlive_order_allowedmainnet_signed_actionblockersscores    rD   7test_score_coin_confluence_accepts_clean_retest_contextrQ   3   s    !#%%((E----#44444#u,,,,&%////>RrF   c                 p   t          t          t          d          t          d          t          d          t          d          dt          d          t          d                              } | j        dk    sJ d| j        v sJ d	| j        v sJ d
| j        v sJ d| j        v sJ d| j        v sJ d S )N825000000z0.20Fz0.18)r   r&   r7   r*   r.   r:   r;   block_new_entrymomentum_overheatedweak_liquidityspread_too_widel2_unavailableimpact_slippage_too_high)r	   rE   r   rK   rN   rO   s    rD   @test_score_coin_confluence_blocks_overheated_or_illiquid_contextr[   =   s   !#'$--	@R@R`ghq`r`r  @G  HN  @O  @O  ^c  w~  E  wF  wF  [b  ci  [j  [j  #k  #k  #k  l  lE#44444 EN2222u~----....u~----%777777rF   c                     t          dddddddgddddddggi          } | j        J | j        t          d          k    sJ | j        t          d	          k    sJ | j        J | j        J d S )
Nlevels9920)pxsz98r   r)   39404060)r   r*   r8   r   r9   r:   r;   )summarys    rD   2test_summarize_l2_book_calculates_depth_and_impactrf   H   s    D	!	!$d#;#;<T	"	"5$=$=>, !  G
 )))'76??::::'76??::::$000%11111rF   c            
     >   t          t          t          d          t          d          t          d          t          d                              } | j        dk    sJ | j        t          d          k     sJ d| j        v sJ d	| j        v sJ d
| j        v sJ d S )Nz0.00018z0.0015r!   z100.4)r$   r1   r2   r3   rU   rH   crowded_positive_fundingpremium_too_highmark_oracle_basis_wide)r	   rE   r   rK   derivatives_scorerN   rO   s    rD   =test_score_coin_confluence_blocks_crowded_derivatives_contextrl   U   s    !#gi.@.@'RZJ[J[gnotgugu  @G  HO  @P  @P  #Q  #Q  #Q  R  RE#44444"WT]]2222%7777////#u~555555rF   c                 ~   t          j        t          d          t          dt          d          t          d          t          d                    t          dt          d	          t          d
          t          d                    g          } t	          |           }|                                }|j        dv sJ |j        dk    sJ |d         du sJ |d         du sJ |d         dk    sJ d|d         v sJ |d         d         d         dk    sJ d|d         d         v sJ d|d         d         v sJ d|d         d         v sJ d|d         d         v sJ d|d         d         v sJ |d         d         d         |d         d         d         k    sJ |d         d         d         d k    sJ d S )!Nr   r   ETHr   r!   103)r   r   r    r(   WLD803000000z0.15)r   r   r&   r*   >   risk_on	selective   rL   FrM   score_versionconfluence_score.v1riskweightsscoresrK   rI   rk   sentiment_scoreevent_risk_scoreportfolio_score
risk_scorefinal_trade_scorerJ   rU   )r   from_coin_contextsrE   r   r   to_dictmarket_regimeeligible_count)snapshotreportrC   s      rD   >test_build_market_confluence_report_sets_regime_and_serializesr   _   s   $7'%..gV[nn]]]GDMM')2D2DQXY_Q`Q`aaa9  H ,H55F>>D#;;;;; A%%%%$%....'(E1111 $99999T)_$$$$>% !126GGGGG$x."77777Xu 55555h!66666Xu 555554>%00000>% !45h9N}9]]]]]>% !126GGGGGGGrF   c            	     J   t          j        t          dt          d          t          d                    t          dt          d          d          g          } t	          |           }t          | |                                          }|d	         d         }|d
         dk    sJ |d         du sJ |d         du sJ t          g d                              |          sJ |d         d         dk    sJ |d         d         dk    sJ |d         d         dk    sJ t          |d         d                   t          d          k    sJ t          |d         d                   t          d          k    sJ t          |d         d                   t          d          k    sJ |d         d         dk    sJ |d         d          d!k    sJ |d"         d          d!k    sJ |d#         d          d!k    sJ t          |d"         d                   t          d$          k    sJ t          |d%         d                   t          d          k    sJ |d&         d'         d(k    sJ |d&         d)         |d&         d*         k    sJ |d&         d+         d,k    sJ d S )-Nr   z0.00012z0.0012)r   r$   r1   ro   z0.12T)r   r*   r.   coinsschema_versionzmarket_snapshot.v1rL   FrM   )priceohlcvtrendmomentum
volatility	liquidityderivativesfundamentals	sentiment
event_riskregimery   
confluencer   sourcehyperliquid_metaAndAssetCtxsr$   z
0.00012000r/   r0   rP   r%   r   r:   z0.0200r;   crowding_statecrowded_longr   status
not_loadedr   r   50.00ry   r   rw   rx   r   rJ   rK   rU   )	r   r   rE   r   r   r   r   setissubset)r   r   
normalizedbtcs       rD   Ktest_build_normalized_market_snapshot_exposes_phase2_schema_and_derivativesr   y   s   $7	 2 2GH<M<MNNN76??FFF9  H 099J1(JGGOOQQJ
W
e
$C&'+?????*+u4444-.%7777  l  l  l  m  m  v  v  wz  {  {  {  {  {}h'+IIIII}i(L8888}o.*<<<<3}%g.//'#,,>>>>3{#$7899WX=N=NNNNN3{#$89::gh>O>OOOOO}./>AAAA~x(L8888{H%5555|X&,66663{#G,--1A1AAAAA3v;w'((73<<7777|_-1FFFFF|01S5F}5UUUUU|-.2CCCCCCCrF   c                     G d d          } t           |                                           d          }|                    d          }|j        dk    sJ |d         dk    sJ |d         dk    sJ |d	         d
k    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ d S )Nc                      e Zd ZdddZdS )Stest_coingecko_fundamentals_client_maps_public_market_fields.<locals>.FakeTransport
   )timeoutc               <    d|d         v sJ dddddddd	d
dddddgS )Nbitcoinids  i  2      g      @g      g      ?g      )@d         )id
market_capfully_diluted_valuationtotal_volumemarket_cap_rank'price_change_percentage_24h_in_currency&price_change_percentage_7d_in_currency&price_change_percentage_1h_in_currency'price_change_percentage_30d_in_currencyathatlcirculating_supplytotal_supplyr>   )selfurlparamsr   s       rD   getzWtest_coingecko_fundamentals_client_maps_public_market_fields.<locals>.FakeTransport.get   sR    u----"+/ "#$;>:?:=;?&( "   rF   N)__name__
__module____qualname__r   r>   rF   rD   FakeTransportr      s0        .0 	 	 	 	 	 	 	rF   r   )r   r   loadedr   coingecko_marketsr   coingecko_idr   market_cap_usd1000r   r   price_change_1h_pctz0.5price_change_30d_pctz12.5ath_usdr!   atl_usd1fdv_to_market_capr#   )r   collectfor_coinr   )r   r   r   s      rD   <test_coingecko_fundamentals_client_maps_public_market_fieldsr      sW          & +==??;;CCHMMH


E
"
"C?h&&&&x=/////x=H$$$$~)++++ F**** !Q&&&&$%....%&&0000y>U""""y>S    "#u,,,,,,rF   c                    t          j        t          d          g          } t          |           }t	          | |dddddidddd	d
diddddddi                                          }|d         d         d         d         dk    sJ |d         d         d         d         dk    sJ |d         d         d         d         dk    sJ |d         d         d         d         d
k    sJ |d         d         d         d         dk    sJ d S )Nr   rn   r   r   r   )r   r   r   &tradingview_community_research_contextloaded_research_onlyr   rv   )r   r   rP   recent_ideas_countnews_search_research_contextgreen80.00)r   r   
risk_levelrP   )r   r   r   r   r   r   r   r   r   r   r   )r   r   rE   r   r   r   )r   r   r   s      rD   ;test_normalized_market_snapshot_accepts_loaded_fundamentalsr      sx   $7%8IJJH/99J1(;xdeffg%MYo  {B  Z[  \  \  ]&DPfv}  IP  Q  Q  R   gii  gu%n5h?8KKKKgu%n56GHAMMMMgu%k28<@VVVVVgu%k23GHAMMMMgu%l3LAWLLLLLLrF   c                ^   | dz  }|                                  |dz                      dd           t          dt          |                     \  }}|d         d	         d
k    sJ |d         d         dk    sJ |d         d         du sJ |d         d         du sJ |d         du sJ d S )Nresearchz!tradingview_community_ideas.jsonlzY{"coin":"BTC","bias":"bullish","live_order_allowed":false,"mainnet_signed_action":false}
utf-8encoding)r   ro   )r   runtime_dirr   r   r   r   r   research_onlyTrL   F)mkdir
write_textr   str)tmp_pathresearch_dirrowsre   s       rD   0test_research_sentiment_context_is_research_onlyr      s    j(L77CC  Ea  lsC  t  t  t5NX[\dXeXefffMD';x $LLLLL;+,1111;'4////;+,5555?#t++++++rF   c                 f   d} t          | dd          }t          dd          }t          d|                                          }t          d|                                          }t	          |          d	k    sJ |d
         dv sJ |d
         dk    sJ |d         du sJ |d         du sJ d S )Na}  <?xml version='1.0'?><rss><channel>
    <item><title>Bitcoin rallies before FOMC decision</title><description>Crypto traders watch CPI and Fed risk.</description><link>https://example.test/btc</link></item>
    <item><title>Solana bridge exploit reported</title><description>SOL ecosystem exploit risk.</description><link>https://example.test/sol</link></item>
    </channel></rss>unit)r   SOL)r   r   r>   )feedsr   r   r   rv   r   >   redyellowr   rL   FrM   )r   r   r   r   len)rssitemspayload
manual_btc
manual_sols        rD   Atest_news_event_risk_collector_parses_rss_and_stays_research_onlyr      s    C
 CnEEEE%BnEEEG+E599AACCJ+E599AACCJu::????l#'88888l#u,,,,'(E1111*+u444444rF   c                l   dddddiddd}| dz  }| d	z  }t          ||           t          ||           |                    d
                              d          dk    sJ t	          d                              |                    d
                    }|d         du sJ |d         du sJ d S )N2026-07-05T00:00:00+00:00r   r%   r   )r$   r/   Fr+   r   rL   rM   zderivatives_history.jsonlzderivatives_latest.jsonr   r   
r   jsonrL   rM   )r   r   	read_textcount
__import__loads)r   r   historylatestr   s        rD   6test_derivatives_history_writers_emit_jsonl_and_latestr     s    75VYloJpJpBq  JO  jo  p  pG44G11FGW%%%!!!g..44T::a????%%f&6&6&6&H&HIIF&'50000)*e333333rF   c                     ddddddiddd} d	dd
dddidg}t          | |d          }|d         d         }|d         d         d         dk    sJ |d         d         d         dk    sJ |d         dk    sJ d S )Nz2026-07-05T01:00:00+00:00r   110z0.00006z0.0006)r/   r$   r1   Fr   r   r!   z0.00001z0.0001)r+   r   )<   )windowsr   derivatives_deltas60mopen_interest_change_pctz10.0000funding_changez
0.00005000crowding_alertneutral)r   )r   r  enrichedr   s       rD   3test_derivatives_history_enriches_oi_funding_deltasr     s   75\anw  EM  KN  KN  CO  gl  GL  M  MG8E]box  FN  LO  LO  DP  Q  Q  RG-gwNNNH
7
E
"C#$U+,FG9TTTT#$U+,<=MMMM I------rF   c                     dgddddg} t          d|                                           }|d         dk    sJ |d	         d
k    sJ d S )NMARKETz"Crypto market watches FOMC and CPIzFed macro riskcrypto_news_rsssymbolstitlere   categoryr   r   r   rP   r   r   r   )r   r   s     rD   3test_event_risk_market_macro_is_yellow_not_coin_redr    st    ".R_o  ~O  P  P  QE
$UE
2
2
:
:
<
<C|((((w<7""""""rF   c                     dgddddg} t          d|                                           }|d         dk    sJ |d         d	k    sJ d S )
Nr   Solana bridge exploit reportedzSOL ecosystem exploit riskr  r  r   r   rP   z20.00r  r   sols     rD   &test_event_risk_coin_exploit_stays_redr    st    +KXt  CT  U  U  VE
$UE
2
2
:
:
<
<C|%%%%w<7""""""rF   c            
         dgdddddg} t          d| t          ddd	t          j        
                                                    }|d         dk    sJ |d         dk    sJ d S )Nr   z2026-07-01T00:00:00+00:00r  zold itemr  )r  published_atr  re   r  i        )tzinfo)r?   r   r   rP   r   )r   r   r   r@   r   r  s     rD   &test_event_risk_ignores_stale_old_newsr#    s    2MXx  FP  ^o  p  p  qE
$UExaS[S_7`7`7`
a
a
a
i
i
k
kC|''''w<7""""""rF   c            
     $   ddddddddd	d
d
ddddddddddddddg} t          | ddhdh          }d |D             ddgk    sJ d|d         d         v sJ d|d         d         v sJ |d         d         du sJ |d         d          du sJ d S )!Nr   r   Bitcoinr   i e      r   )symbolr   namer   r   r   r   r   illiquidIlliquidi  r   P   )r(  r   r)  r   r   r   r   r  solanaSolanai iir   r   )
hl_symbolstrending_symbolsc                    g | ]
}|d          S )r(  r>   ).0rows     rD   
<listcomp>zOtest_coin_opportunity_radar_detects_hl_movers_research_only.<locals>.<listcomp>)  s    000cCM000rF   sharp_1h_selloffr   reasonscoingecko_trendingrL   FrM   r   )r   
candidatess     rD   ;test_coin_opportunity_radar_detects_hl_movers_research_onlyr9     s5   	9QRdm  Z[  HJ  Z^  	_  	_ZX[mq  ^`  MO  	P  	P(qbk  XZ  GJ  	K  	KD &du~Y^X_```J00Z000UENBBBBAy!99999:a=#;;;;;a=-.%7777a=01U::::::rF   c                   | dz  dz  }|                     d           |dz                      dd           |d	z                      d
d           | dz                                    | dz  dz                      dd           t          | | dz  d          }|d         d         }|d         du sJ |d         dk    sJ |d         d         d         dk    sJ |d         dk    sJ d S )Nexperiments"candidate_v76_fee_aware_anti_chaseT)parentszsignal_journal.jsonlz{"final_decision":"blocked:confluence_block_new_entry","would_enter":false,"block_reason":["confluence_block_new_entry","tv_bias_bearish"],"confluence_gate":{"score":"55"},"tradingview_context":{"available":true}}
r   r   ztrade_journal.jsonlz&{"event":"exit","net_pnl_usd":"0.10"}
reportszmarket_confluence_latest.jsonz>{"confluence":{"market_regime":"risk_off","eligible_count":0}}r   )runtime_rootexperiment_rootlimit
strategiesrL   Fsignals_seenr   top_blockersr   confluence_block_new_entrytv_available_signals)r   r   r   )r   expr   r3  s       rD   6test_confluence_gate_impact_report_summarizes_blockersrH  0  sX   
]
"%I
ICIIdI!!-- 	b .    	  ,,-Vah,iii	  """	;;GG  II  T[G  \  \  \xMAYacdddF

C
DC&'50000~!####~q!!$(DDDDD%&!++++++rF   N)4
__future__r   r   r   decimalr   src.hyperliquid.market_datar   src.market.confluencer   r	   src.market.contextr
   r   src.market.event_riskr   r   src.market.fundamentalsr   src.market.snapshotr   "src.tools.market_confluence_reportr   'src.tools.derivatives_history_collectorr   r   r   #src.tools.news_event_risk_collectorr   r    src.tools.coin_opportunity_radarr   'src.tools.confluence_gate_impact_reportr   rE   rQ   r[   rf   rl   r   r   r   r   r   r   r  r  r  r  r#  r9  rH  r>   rF   rD   <module>rV     sN   " " " " " " ' ' ' ' ' ' ' '       9 9 9 9 9 9 W W W W W W W W G G G G G G G G U U U U U U U U ? ? ? ? ? ? @ @ @ @ @ @ P P P P P P q q q q q q q q q q X X X X X X X X A A A A A A @ @ @ @ @ @% % %@     8 8 8
2 
2 
26 6 6H H H4D D D>!- !- !-HM M M$, , ,5 5 5$4 4 4	. 	. 	.# # ## # ## # #; ; ; , , , , ,rF   