+
    /i              
          R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHt ^ RIHt ^ RIHt  ^ RItRt]
! 4        ]P*                  ! R4      t]P*                  ! R	4      tR
tRtRtRtRtRtRtRtRt Rt!Rt"Rt#Rt$Rt%Rt&Rt'^xt(Rt)^t*^t+^t,^t-Rt.^t/^t0^
t1Rt2Rt3Rt4Rt5R t6R!t7^-t8R"t9R#RR$RR%RR&RR'R/t:R#RR$RR%RR&RR'R/t;. t<]Pz                  ! 4       t>. t?. t@]P                  ! 4       tA]#sB]#sCRtD]E! 4       sF]Pz                  ! 4       tG^tH^tIR(tJ. tK]Pz                  ! 4       tLRsM]Pz                  ! 4       tN. sO]P                  ! 4       tQRsR. sS. sTRsUR) tVR* tWR+ tXR, tYR- tZR. t[R/ t\R0 t]R1 t^R2 t_R3 t`R4 taR5 tbR6 tcR7 tdR8 teR9 tfR: tgR; thR< tiR= tjR> tkR? tlR@ tmRA tn^toRBtpRtq^tr^ ssRC ttRURD ltuRE tvRF twRG txRH tyRI tzRJ t{RK t|RVRL lt}RWRM lt~RN tRO tRP tRQ tRR tRS t]RT8X  d
   ]! 4        R# R#   ] d    Rt ELi ; i)Xu  
PAPER TRADING BOT - BTC 15-Min Kalshi Markets
$100 starting balance. Smart tiered bet sizing. 2:1 reward/risk.
Trailing high-water mark stop-loss — protects profits, not just starting balance.
Live dashboard: open dashboard.html via OPEN DASHBOARD shortcut
N)load_dotenv)serializationhashes)padding)default_backendTFKALSHI_API_KEY_IDKALSHI_PRIVATE_KEY_PATHz https://api.elections.kalshi.comC:\kalshibotzC:\kalshibot\datazC:\kalshibot\data\archivez&C:\kalshibot\trade_analytics_test.jsonz'C:\kalshibot\market_snapshots_test.jsonz+C:\kalshibot\data\session_history_test.jsonz C:\kalshibot\paper_log_test.jsonzC:\kalshibot\auto_params.jsoni  i'  g     @o@g?g      ?g=
ףp=?gffffff?gMbP?g?      ?      @      ?g      ?g-C6:?gQ?ga2U0*C?binancecoinbasekrakenokxbybitga2U0*S?c                     \        V R 4      ;_uu_ 4       p\        P                  ! VP                  4       R\	        4       R7      uuRRR4       #   + '       g   i     R# ; i)rbN)passwordbackend)openr   load_pem_private_keyreadr   )pathfs   & paper_trade_test.pyload_private_keyr   _   s<    	dD		Q11!&&(TSbSde 
			s   /AA 	c                  <    \         f   \        \        4      s \         # N)_private_key_cacher   KEY_PATH     r   get_private_keyr#   c   s    !-h7r"   c           	      ~   W,           V,           P                  R 4      pV P                  V\        P                  ! \        P                  ! \
        P                  ! 4       4      \        P                  P                  R7      \
        P                  ! 4       4      p\        P                  ! V4      P                  R 4      # )zutf-8)mgfsalt_length)encodesignr   PSSMGF1r   SHA256DIGEST_LENGTHbase64	b64encodedecode)pktsmethodr   msgsigs   &&&&  r   sign_requestr5   i   sx    ;
%
%g
.C
''#w{{w||FMMO'DKK--/06ACC ''00r"   c                     \        \        \        P                  P                  4       P	                  4       R ,          4      4      p\        4       pR\        RVR\        W2W4      RR/# )i  zKALSHI-ACCESS-KEYzKALSHI-ACCESS-TIMESTAMPzKALSHI-ACCESS-SIGNATUREzContent-Typezapplication/json)strintdatetimenow	timestampr#   KEY_IDr5   )r2   r   r1   r0   s   &&  r   get_headersr=   o   s\    	S""&&(224t;<	=B		B)BB%|BF'I.0 0r"   c                      \         \        8  d7   \        R \         R R\         ^\        ,
          ,          R R24       \         sR# R# )z  ** NEW HIGH: $.2fz  Stop now at $z **N)balancehigh_water_markprintTRAILING_STOP_PCTr!   r"   r   update_high_water_markrD   v   s>      _WaHYFY=Z[^<__bcd! !r"   c                      R # )Fr!   r!   r"   r   check_session_stop_lossrF   |   s    r"   c            	         \         '       g   R # R.p R pR pR pR p V  F0  p \        P                  ! VWW4R7      pVP                  ^^R7       K2  	  \        P                  ! ^4       KO    \         dI   p\        RTP                  R	4      ^,           R
T 24       \        P                  ! ^4        R p?K  R p?ii ; i)Nz-wss://stream.binance.us:9443/ws/btcusdt@tradec                 Z    \         P                  ! V4      p\        VP                  R 4      ;'       g    VP                  R4      ;'       g    ^ 4      pV^ 8  d   \        P                  ! 4       p\
        ;_uu_ 4        V\        R&   V\        R&   \        P                  WC34       RRR4       \        '       dC   \        V\        ,
          \        ,          4      \        8  d   \        P                  4        Vs
R# \        '       g   Vs
R# R# R#   + '       g   i     Lr; i    R# ; i)pcr   N)jsonloadsfloatgettime
price_lockpricesprice_timesprice_historyappend_last_hot_btcabsHOT_PATH_BTC_MOVEhot_path_eventset)wsr3   datapricer:   s   &&   r   on_msgbinance_ws.<locals>.on_msg   s    	JJsOD$((3-==488C===A>EqyiikZ-2F9%-0K	*!((#6   !=S%-*?=)P%QUf%f"&&($)M&$)M ' Z 	sA   2D% D% 1D% ?)D(D% <A D% >D% 
D% D"	D% %D*c                     R # r   r!   )rZ   errs   &&r   on_errorbinance_ws.<locals>.on_error   s    4r"   c                     \         ;_uu_ 4        R \        R&   R \        R&   R R R 4       R #   + '       g   i     R # ; i)Nr   )rP   rQ   rR   )rZ   argss   &*r   on_closebinance_ws.<locals>.on_close   s'    Z%)F9%)K	" ZZZs   ,=	c                     \        R 4       R# )u!     ✅ Binance WebSocket connectedN)rB   )rZ   s   &r   on_openbinance_ws.<locals>.on_open   s    12r"   )
on_messagera   re   rh   )ping_intervalping_timeoutu     ⚠  Binance WS /z error: )	WS_AVAILABLE	websocketWebSocketApprun_forever	ExceptionrB   splitrO   sleep)WS_URLSr]   ra   re   rh   ws_urlrZ   es           r   
binance_wsrx      s    < 	8G"  *
3
F	++%%8 Ra@  	

1	  *6<<+<Q+?*@LM

1s   ,A--C 8=B;;C c                     R .p  V  F  p \         P                  ! V^R7      pVP                  ^8X  dw   \        VP	                  4       R,          4      p\
        P
                  ! 4       p\        ;_uu_ 4        V\        R&   V\        R&   \        P                  WC34       RRR4        MK  	  \
        P                  ! ^4       K    + '       g   i     L.; i    K  ; i)9https://api.binance.us/api/v3/ticker/price?symbol=BTCUSDTtimeoutr\   r   NrequestsrN   status_coderM   rK   rO   rP   rQ   rR   rS   rT   rt   )	REST_URLSurlrr\   r:   s        r   poll_binance_restr      s     	DI C	LLa0==C'!!&&(7"34E IIKC#,1y)C;y3I%,,c\: $  (  	

1 $ Hs$   A,C7)C CCCCc                       \         P                  ! R^R7      p V P                  ^8X  d}   \        V P	                  4       R,          R,          4      p\
        P
                  ! 4       p\        ;_uu_ 4        V\        R&   V\        R&   \        P                  W!34       RRR4       M \
        P                  ! ^4       K    + '       g   i     L(; i    L/; i)T/https://api.coinbase.com/v2/prices/BTC-USD/spotr{   r[   amountr   Nr}   )r   r\   r:   s      r   poll_coinbaser      s    
	NXYZA}}#affhv.x89		Z).F:&#J0G!((#6  Z $ 	

1	  Z 	s*   A3C 6)CC C	C C Cc                       \         P                  ! R^R7      p V P                  ^8X  d   V P                  4       P                  R/ 4      p\	        VP                  R/ 4      P                  R^ .4      ^ ,          4      pV^ 8  dU   \
        P
                  ! 4       p\        ;_uu_ 4        V\        R&   V\        R&   \        P                  W234       RRR4       \
        P                  ! ^4       K    + '       g   i     L(; i    L/; i)T2https://api.kraken.com/0/public/Ticker?pair=XBTUSDr{   resultXXBTZUSDrJ   r   Nr~   rN   r   rK   rM   rO   rP   rQ   rR   rS   rT   rt   )r   r   r\   r:   s       r   poll_krakenr      s    

	Q[\]A}}#h3vzz*b9==cA3GJK19))+C#+0x(#+h2G%,,c\: $ 	

1	 $ 	s*   B&D ))C2D 2D	=D D D	c                    a
aa \         ;_uu_ 4        \        \        4      o\        \        4      oR R R 4       \        P                  ! 4       o
S U u. uFG  p SV ,          '       g   K  SV ,          '       g   K%  S
SV ,          ,
          ^8  g   K<  V SV ,          3NKI  	  pp V'       g   R# \        V
VV3R lR 4       R 4      pV'       g   R# RP                  R V 4       4      pR pSR,          SR,          SR,          rvpV'       dM   V'       dE   V'       d=   Wg,           ^,          qV,
          V,          p	\        V	4      R8  d   RV	^d,          R	 R
2pW#V3#   + '       g   i     EL1; iu up i )Nc              3      <"   T FW  pSP                  V4      '       g   K  SP                  V4      '       g   K5  SSV,          ,
          ^8  g   KL  SV,          x  KY  	  R# 5i)   NrN   ).0sr:   snap_psnap_ts   & r   	<genexpr>!get_best_price.<locals>.<genexpr>   sQ      Q%RZZ] '-zz!} :=q	/R9O &))%Rs   A"A"A"A"r   r   r   +c              3   *   "   T F	  w  rVx  K  	  R # 5ir   r!   )r   r   _s   &  r   r   r      s     )541Q5s   gMb@?zEDGE +.3fz% Binance vs othersNNN)r   r   r   r   r   )rP   dictrQ   rR   rO   nextjoinrV   )srcvalidr\   srcsedgebrJ   kavgdivr:   r   r   s             @@@r   get_best_pricer      s-   	f[(9v 
IIKC+1n6CVC[[VC[[VY\bcf\gVgkmUmc6#;6En)) Q%R QRVXE))HH)5))DDY
!3VH5E!AQ1ukc'S3s8fuSWTN:M%Nd 
 os#   EE-(E-9E-E-E*	c            	      D   \         P                   ! 4       q \        ,
          p\        ;_uu_ 4        \         UUu. uF  w  r#W!8  g   K  W#3NK  	  ppp\         UUu. uF  w  r#W R ,
          8  g   K  W#3NK  	  upp\        R&   RRR4       \	        X4      \
        8  d   R# V^ ,          ^,          qTR	,          ^,          pWe,
          V,          pV^d,          R R2pV\        8  d   VRV3# V\        ) 8:  d   VRV3# VRV3# u uppi u uppi   + '       g   i     L; i)
X  NNNNr   %UPDOWNFLATr   )rO   MOMENTUM_SECONDSrP   rS   lenWARMUP_TICKSMOMENTUM_THRESHOLD)	r:   cutofftrI   recentoldestnewestmompcts	            r   get_momentumr      s    
))+C&6 6v	%2B]TQak&1&]B/<O}tq3YFQF}Oa 
 6{\!*:#:AYq\F2JqM6?f
$CWTN!
C	#	#C,<%<	##	#C,<%< CO 
s4   
D
D
	D
DD	
2D	
9DDD	c                      \         P                  ! R^R7      p V P                  ^8X  d   V P                  4       P                  R. 4      pV'       d   \	        V^ ,          P                  R^ 4      4      pV^ 8  d   \
        P
                  ! 4       p\        ;_uu_ 4        V\        R&   V\        R&   \        P                  W234       X'       d8   \        W$,
          V,          4      \        8  d   \        P                  4        TpRRR4       \
        P                  ! ^4       EK(    + '       g   i     L); i    L0; i)uF   OKX spot BTC price — free, no auth, reliable alternative to Binance.8https://www.okx.com/api/v5/market/ticker?instId=BTC-USDTr{   r[   lastr   N)r~   rN   r   rK   rM   rO   rP   rQ   rR   rS   rT   rV   rW   rX   rY   rt   )r   r[   r\   r:   rU   s        r   poll_okxr      s    
	WabcA}}#vvx||FB/!$q'++fa"89Eqy"iik'Z,1F5M;u3E)00#>,e6K}5\1]ar1r . 2 2 405 ( 	

1 (Z 	s2   AD< AD<  A(D)D< )D9	4D< 9D< <E c                 &     \         P                  ! R^R7      p V P                  ^8X  d   V P                  4       P                  R/ 4      P                  R. 4      pV'       d~   \	        V^ ,          P                  R^ 4      4      pV^ 8  dU   \
        P
                  ! 4       p\        ;_uu_ 4        V\        R&   V\        R&   \        P                  W234       RRR4       \
        P                  ! ^4       K    + '       g   i     L(; i    L/; i)u8   Bybit spot BTC price — free, no auth, good redundancy.Dhttps://api.bybit.com/v5/market/tickers?category=spot&symbol=BTCUSDTr{   r   list	lastPricer   Nr   )r   lstr\   r:   s       r   
poll_bybitr     s    
	cmnoA}}#ffhll8R044VR@!#a&**[!"<=Eqy"iik'Z.3F7OC[5I)00#> ( 	

1	 (Z 	s1   A D $AD 0)C9D 9D		D 	D Dc                      \        4       p \        ;_uu_ 4        V sV '       d
   V ^ ,          MRsRRR4       V  F  p\	        V4       K  	  \
        P                  ! \        4       Kh    + '       g   i     L@; i    L3; i)u   
Background thread — refreshes ALL open KXBTC15M markets every 3 seconds.
Main loop scores each market independently for more trading opportunities.
N)get_all_15m_marketsmarket_cache_lockall_markets_cachemarket_cacherecord_kalshi_pricerO   rt   KALSHI_POLL_INTERVAL)marketsms     r   poll_kalshi_marketr     sf     	)+G""$+!-4wqz$ # #A&  	

'( #"
 	s!   A< A)A< )A9	4A< <B c           
        V '       g   R# \         ;_uu_ 4        \        P                  \        P                  ! 4       V R,          V R,          34       \        P                  ! 4       R,
          p\         UUUu. uF  w  r#qBV8  g   K  W#V3NK  	  uppp\        R&   RRR4       R# u upppi   + '       g   i     R# ; i)z/Store Kalshi contract prices for lag detection.Nyes_askno_askr   r   )kalshi_price_lockkalshi_price_historyrT   rO   )marketr   r   yns   &    r   r   r   0  s    6		##TYY[&2CVHEU$VWs"8L"\8Luq1U[P[7A78L"\Q	 
	 #]	 
		s$   A B.9B'	B'B.'B..B?	c                   V '       d	   V'       g   R# V R,          pV R,          pV R,          pV R,          pV^ 8:  g   V^ 8:  d   R# VR,          pVR8  d    \        4       pV^ 8  d
   VR,          M\        pWR	,          ,          p	W,
          V,          p
V	^ 8  d   \        V
4      V	,          pM^ pVR
8  d   RpM*VR8  d   RpM VR8  d   RpMVR8  d   RpMVR	8  d   RpMRpRpRpV
^ 8  d   W,
          pRpMV
^ 8  d   W,
          pRpV\        8  d   R# \	        \        ^2VR,          4      4      pV^8  d   VR8  d   \        ^2V^,           4      pW3# )u   
SIGNAL 1 — EXPIRATION VALUE (0-50 pts)
Is BTC clearly above/below floor with time running out?
Is Kalshi underpricing the actual probability?
Nfloor	secs_leftr   r   g      N@g      @g      Y@r   r   g
ףp=
?       @gGz?r
   g)\(?g      ?g?g?gp=
ף?        r   r   i      N)get_btc_volatilityBTC_VOL_PER_MINrV   MIN_MISPRICINGr8   min)r   	btc_pricer   r   r   r   	mins_leftlive_volvol_per_minexpected_range_pctdistance_pctz_scoreexpected_prob	direction
mispricingscores   &&              r   score_expiration_valuer   9  sd    7NE$I	"G!FA~!G^T!I3!#H(018e#/K$S(89%2LAl#&88 #~	C	C	C	C)-IJa",
			"+
	N"7NB
S()*E1}CB	"r"   c                T  a V '       d	   V'       g   R
# \         P                   ! 4       pV\        ,
          o\        ;_uu_ 4        \        V3R l\         4       R4      pRRR4       X'       g   R
# W,
          V,          p\        V4      \        8  d   R
# \        ;_uu_ 4        \        V3R l\         4       R4      pRRR4       X'       g   R
# Vw  rgV R,          pV R,          p	V^ 8  dD   VR,          p
W,
          pW,
          pVR8  d!   \        \        ^V^,          4      4      pVR3#  R
# V^ 8  dJ   \        V4      R,          pW,
          pW,
          pVR8  d!   \        \        ^V^,          4      4      pVR	3# R
#   + '       g   i     EL-; i  + '       g   i     L; i)u   
SIGNAL 2 — LAG DETECTION (0-30 pts)
Did BTC move recently but Kalshi hasn’t repriced yet?
Detect the window where we can enter before market makers catch up.
Nc              3   >   <"   T F  w  rVS8  g   K  Vx  K  	  R # 5ir   r!   )r   r   rI   r   s   &  r   r   &score_lag_detection.<locals>.<genexpr>s  s     CmdaqF{ms   
c              3   @   <"   T F  w  rq1S8  g   K  W#3x  K  	  R # 5ir   r!   )r   r   r   r   r   s   &   r   r   r   y  s     U1EgaAf6A61Es   r   r   r
   Q?r   r   r   )rO   LAG_WINDOW_SECSrP   r   rS   rV   LAG_MIN_BTC_MOVEr   r   r8   r   )r   r   r:   old_btcbtc_move
old_kalshiold_yesold_nocur_yescur_noexpected_yes_moveactual_yes_movelagr   expected_no_moveactual_no_mover   s   &&              @r   score_lag_detectionr  h  s]    7NYY[C?"F	CmCTJ 
7N#w.H
8}''		U1EUW[\
 
g~ OGi GhF!|$sN#-1:Bc	*+E$;  N 
Ax=3.!?/:Bc	*+E&= N; 
 
	s   F$FF	F'	c                    V '       d   Vf   ^ # \        V4      \        ,          p\        \        ^V^,          4      4      # )u   
SIGNAL 3 — MOMENTUM CONFIRMATION (0-20 pts)
Used only as a tiebreaker or confirming signal.
Never triggers a trade on its own.
)rV   r   r8   r   )r   momentumstrengths   && r   score_momentumr    s3     (8}11Hs2x!|$%%r"   c                   V '       d	   V'       g   R	# \        W4      w  rE\        W4      w  rgT;'       g    T;'       g    VR
9   d   TMRpV'       g   R	# VR8H  ;'       d    VR8H  ;'       g    VR8H  ;'       d    VR8H  p	V	'       d   R	# W88X  d   \        W4      M^ p
V^ 8  d   V^ 8  d
   V
^ 8X  d   R	# WF,           V
,           pRV RV RV
 2pV\        8  d   RpMV\        8  d   RpMRpWW3# )zi
Master scoring function. Combines all 3 signals.
Returns: (score, trade_direction, tier, breakdown_str)
Nr   r   zEXP:z LAG:z MOM:HIGHMEDIUM)r   NN )r   r   )r   r  r  
SCORE_HIGHSCORE_MEDIUM)r   r   r  r   	exp_scoreexp_dir	lag_scorelag_dir	trade_diropposing	mom_scoretotal	breakdowntiers   &&&&          r   get_confidence_scorer    s   
 +<$<1&DI.vAIYY7YYI4NyTXI..T!99i6&9 ; ;V#99	T(9   7@7My3STI1}Q9>  !I-EykykykBI	*	v	,	x'+T,,r"   c                    V \         8  d   R# V ^Z8  d   RpM4V ^U8  d   RpM*V ^K8  d   RpM V ^A8  d   RpMV ^78  d   RpMV ^-8  d   RpMRp\        W,          ^4      p\        R	\        W1R,          4      4      pV# )
z
Kelly-inspired dynamic bet sizing.
Bet size scales with BOTH confidence score AND current balance.
Higher score = bigger % of balance. Balance grows = bets grow.
Hard floor: $0.50. Soft cap: 15% of balance per trade.
r   g333333?gQ?g{Gz?g?r   g{Gz?{Gz?r   )r  roundmaxr   )r   current_balancer   bets   &&  r   get_dynamic_betr    s     |C	"Dc	"Dc	"Dc	"Dc	"Dc	"Dc c
%q
)C
dCt34
5CJr"   c           
         V R8X  d4   \        \        \        \        \        \
        R,          4      4      ^4      # \        \        \        \        \        \
        R,          4      4      ^4      # )u0   Legacy wrapper — used when no score available.r	  g?r  )r  r   BET_HIGH_MAXr  BET_HIGH_MINr@   BET_MED_MAXBET_MED_MIN)r  s   &r   get_bet_for_tierr%    sG    v~Ss<5'IJANN[#k7U?"CDaHHr"   c                    Rp Rp\        RV 4      p \        P                  ! \        V ,           V,           V^R7      pVP                  ^8w  d   . #  \
        P
                  P                  \
        P                  P                  4      p. pTP                  4       P                  R. 4       EF  p \
        P
                  P                  TR,          P                  RR4      4      p\
        P
                  P                  TR	,          P                  RR4      4      pYtu;8:  d	   T8:  Ed   M K  Y,
          P                  4       p	T	^8  d   K  TP                  R
TR
,          R\        TP                  R4      ;'       g    ^ 4      R\        TP                  R4      ;'       g    ^ 4      R\        TP                  R4      ;'       g    ^ 4      R\        TP                  R4      ;'       g    ^ 4      R\        TP                  R4      ;'       g    ^ 4      RT	R\        TP                  R4      ;'       g    ^ 4      /4       EK  EK  	  \        TR R7      #    . u # ; i    EK  ; i)zReturn ALL currently open KXBTC15M markets (Kalshi often has 2-3 overlapping).
Sorted by secs_left ascending so we score shortest-window first.z/trade-api/v2/marketsz,?status=open&limit=20&series_ticker=KXBTC15MGET)headersr|   r   	open_timeZz+00:00
close_timetickerr   yes_ask_dollarsyes_bidyes_bid_dollarsr   no_ask_dollarsno_bidno_bid_dollarsr   floor_striker   volumevolume_24h_fpc                     V R ,          # )r   r!   )xs   &r   <lambda>%get_all_15m_markets.<locals>.<lambda>  s    ;r"   )key)r=   r~   rN   BASE_URLr   r9   r:   timezoneutcrK   fromisoformatreplacetotal_secondsrT   rM   sorted)
r   paramsr(  r   r:   r   r   open_tclose_tsecss
             r   r   r     s    &D<F%&GLLD617AN==C




 1 1 5 5
6CGVVX\\)R(	''55an6L6LSRZ6[\F''55ao6M6McS[6\]G'''446"9h(aee,=&>&C&C! Daee,=&>&C&C! Daee,<&=&B&B Caee,<&=&B&B CaeeN&;&@&@q AaeeO&<&A&A B D E (	 )" '788) 2I& 	sH   =I /A=I .I 1I ?#I ##I #I +#I %I 5I I I&c                 <    \        4       p V '       d
   V ^ ,          # R# )z,Legacy: returns first active market or None.N)r   )r   s    r   get_15m_marketrG    s    !#G 71:*d*r"   c                 `   R V  2p\        RV4      p\        P                  ! \        V,           VR7      pVP                  ^8X  di   VP                  4       P                  R/ 4      p\        VP                  R4      ;'       g    ^ 4      \        VP                  R4      ;'       g    ^ 4      3# R# )z/trade-api/v2/markets/r'  )r(  r   r/  r2  )NN)r=   r~   rN   r;  r   rK   rM   )r,  r   r(  r   r   s   &    r   get_live_pricerI    s    &vh/D%&Gll8d?G<A}}FFHLL2&aee-.33!4aee,-2235 	5r"   g333333?c                   a \         ;_uu_ 4        \        RR  U Uu. uF  w  rVNK	  	  pp pRRR4       \        X4      ^
8  d   R# \        V4      \        V4      ,          o\        V3R lV 4       4      \        V4      ,          p\	        VR,          S,          ^d,          ^4      # u upp i   + '       g   i     L; i)u;   Std deviation of last 60 BTC ticks — measures choppiness.Nr   c              3   B   <"   T F  qS,
          ^,          x  K  	  R# 5i)   Nr!   )r   rI   means   & r   r   %get_btc_volatility.<locals>.<genexpr>  s     3FqH??Fs   r   i)rP   rS   r   sumr  )r   rI   r   variancerM  s       @r   r   r     s    	 -cd 34 3! 34 

6{Rv;V$D3F33c&kAH(c/T)C/33	 5 
s   B.B(
B.(B..B>	c                   \         P                   P                  4       p/ RVbRV R,          bR\        P                  ! 4       bRVP                  R4      bRVP                  bRVP                  4       bRV R,          bR	V P                  R	R
4      bRV P                  RR
4      bRV R,          bR\        \        V P                  R^ 4      4      ^d,          ^4      bR\        \        V P                  R^ 4      4      \        ,          ^4      bR\        4       bRV P                  R^ 4      bR\        V P                  R^ 4      V P                  R^ 4      ,
          ^4      bRV P                  R^ 4      bRV P                  R^ 4      bRV P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      RV P                  RR
4      /CpVR8X  d   Ve   \        \        P                  ! 4       V P                  R\        P                  ! 4       4      ,
          4      pTP                  RTR \        V^4      R!\        W R,          ,
          V R,          ,          ^d,          ^4      R"T;'       g    ^ ^ 8  d   R#MR$R%VR&V/4         \        \        4      ;_uu_ 4       p\        P                   ! V4      p	RRR4       X	P#                  T4       \        \        R'4      ;_uu_ 4       p\        P$                  ! Y^\&        R(7       RRR4       R#   + '       g   i     La; i   . p	 Lj; i  + '       g   i     R# ; i  \(         d   p
 Rp
?
R# Rp
?
ii ; i))zJWrite rich per-trade data to trade_analytics.json for the learning engine.eventr,  r;   time_str%H:%M:%Shourday_of_weekr   signal_type?r  entry_pricemomentum_pctmomentum_rawmomentum_strengthbtc_volatilitymarket_yes_askmarket_spreadmarket_yes_bidr   r   	entry_btcconfidence_scorer  r  r  confidence_tierexitN
entry_time
exit_pricepnlpnl_pctoutcomeWINLOSSexit_reason	hold_secswindentdefault)r9   r:   rO   strftimerU  weekdayrN   r  rV   r   r   r8   updater   ANALYTICS_PATHrK   loadrT   dumpr7   rr   )posrR  rf  rg  rl  r:   recordrm  r   r[   rw   s   &&&&&      r   log_analyticsrz    s   





!CUS] 	TYY[ 	S\\*5	
 	SXX 	S[[] 	S- 	SWW]C8 	SWWVS1 	S/ 	U3sww~q'A#BS#H!L 	U3sww~q'A#BEW#WYZ[ 	/1 	SWW%5q9 	U377+;Q#?#''JZ\]B^#^`ab  	SWW[!4!" 	SWW[!4#$ 	SWW%7;SWW[!4SWW[!4SWW[!4SWWVS1-F0 :1		cgglDIIK&HHI	:5a=5*=/A"ASEW!WZ]!]_`aSXXAN5;9
 		n%%499Q<D%F.#&&!TYYtqRU-V&& &%r&&& sf   L5 2L"	L5 )M :L>M "L2	-L5 1M 2L5 5L;9M >M		M M M(#M(c                   V '       g   R# \         P                   P                  4       p\        p  \        V4      ;_uu_ 4       p\        P
                  ! V4      pRRR4       \        P                  ! 4       pX U	u. uF3  qP                  R4      '       g   K  YR,          ,
          ^A8:  g   K1  T	NK5  	  p
p	T U	u. uF3  qP                  R4      '       g   K  YR,          ,
          R8:  g   K1  T	NK5  	  pp	T
'       d   T
^ ,          R,          MT pT'       d   T^ ,          R,          MT p\        Y,
          T,          ^d,          ^4      p\        Y,
          T,          ^d,          ^4      pRTRTP                  R4      RTP                  RTP                  4       RT R	TR
TRT'       d   \        T^d,          ^4      M^ RT;'       g    RR\        4       RT'       d
   TR,          MRRT'       d
   TR,          MRRT'       d"   \        TR,          TR,          ,
          ^4      MRRT'       d
   TR,          MR/pTP                  T4       \        T4      R8  d   TRR p\        TR4      ;_uu_ 4       p\        P                  ! Yv\         R7       RRR4       R#   + '       g   i     ELG; i   . p ELQ; iu up	i u up	i   + '       g   i     R# ; i    R# ; i)u   
Runs every scan cycle. Tracks BTC price trend + Kalshi odds over time.
Stored in market_snapshots.json — separate from per-trade analytics.
Nr;   i1  r   rS  rT  rU  rV  
btc_chg_1m
btc_chg_5mr  r   r   
volatilityr   r   spreadr.  r   i  rn  rq  i0)r9   r:   SNAPSHOTS_PATHr   rK   rv  rO   rN   r  rr  rU  rs  r   rT   r   rw  r7   )r   r   r  r   r:   	snap_pathr   snapsnow_tsr   snaps_1msnaps_5m
btc_1m_ago
btc_5m_agochg_1mchg_5mry  s   &&&&             r   log_market_snapshotr  >  s+   
 f





!CI 	iAtyy|u 99;$_u!k(:A;@W\^?^AAu_$`u!k(:A;@W\_?_AAu`2:Xa[-	
2:Xa[-	
	.*<sBAF	.*<sBAF63<<
33883;;=966x5C3Q9..-/6),T6(+Tf5	!2VI5F!FJZ^&6+.d
  	Vu:eEFme)S!!Q		%C(H!!; ! ``0 "!!Ds   J- JJ- #K <J7J7/J75K ;J<J<.J<4#K B-K 'K .K *K ,AK 2KK J*	$J- (K *J- -J41K K	K K Kc            
         \        \        4      ;_uu_ 4       p \        P                  ! V 4      pRRR4       X Uu. uF  q"P	                  R4      R8X  g   K  TNK  	  pp\        T4      \        8  d   R# ^ RIHp T! R 4      pT Fc  pTP	                  R^ 4      pYW,          R;;,          ^,          uu&   TP	                  R4      R	8X  g   KH  YW,          R
;;,          ^,          uu&   Ke  	  TP                  4        UUu. uF=  w  rxTR,          \        8  g   K  TR
,          TR,          ,          \        8  g   K;  TNK?  	  p	ppTP                  4        UUu. uF=  w  rxTR,          \        8  g   K  TR
,          TR,          ,          \        8:  g   K;  TNK?  	  p
ppT! R 4      pT Fl  pTP	                  R^ 4      R8  d   RMRpY,          R;;,          ^,          uu&   TP	                  R4      R	8X  g   KQ  Y,          R
;;,          ^,          uu&   Kn  	  RpTR,          R,          \        8  d?   TR,          R
,          TR,          R,          ,          pT\        8:  d   RT^d,          R R2p\        \        4      p\        \        4      p\        T	4      p\        T
4      pTT8g  ;'       g    TT8g  p. pT'       d(   TP!                  RT Uu. uF  qwR R2NK
  	  up 24       T'       d(   TP!                  RT Uu. uF  qwR R2NK
  	  up 24       T'       d   TP!                  T4       R\#        \$        P$                  P'                  4       4      R\        T4      RTRTRT/p\        \(        R4      ;_uu_ 4       p \        P*                  ! TT ^R7       RRR4       TsTs\        T4      sT'       dB   T'       g	   T'       d2   \/        R\        T4       R 24       T F  p\/        R!T 24       K  	  R# \/        R"\        T4       R#24       R#   + '       g   i     EL; i    R# ; iu upi u uppi u uppi u upi u upi   + '       g   i     L; i)$u#  
Runs every AUTO_RETUNE_EVERY completed trades.
Only updates auto_params.json when patterns are very strong:
  - 60%+ win rate AND 20+ trades in bucket = mark as GOOD hour
  - 40% or below AND 20+ trades = mark as AVOID hour
Does NOT constantly tweak — only acts on overwhelming evidence.
NrR  rd  )defaultdictc                      R ^ R^ /# winsr  r!   r!   r"   r   r8  auto_analyze.<locals>.<lambda>y  s    FAw#:r"   rU  r  ri  rj  r  c                      R ^ R^ /# r  r!   r!   r"   r   r8  r    s    61gq"9r"   r\  r   strongweakr  zWeak signals losing (.0fu$   % WR) — consider raising thresholdz"Best hours (60%+ WR, 20+ trades): 02dz:xxz%Avoided hours (40%- WR, 20+ trades): generated_attrades_analyzed
good_hoursavoid_hoursnotesrn  )rp  z 
  [LEARN] Auto-params updated ( trades analyzed)    z
  [LEARN] uO    trades analyzed — no strong patterns yet (need 60%+ or 40%- with 20+ trades))r   ru  rK   rv  rN   r   AUTO_RETUNE_EVERYcollectionsr  itemsAUTO_MIN_BUCKET_TRADESAUTO_MIN_WIN_RATEAUTO_MAX_WIN_RATErA  r  r  rT   r7   r9   r:   AUTO_PARAMS_PATHrw  _last_autotune_countrB   )r   r[   r   exitsr  hour_mapr   hdnew_good	new_avoidmom_mapbucket	weak_noteweak_wrexisting_goodexisting_avoid
new_good_snew_avoid_schangedr  rB  notes                          r   auto_analyzer  i  s   .!!Qtyy|!91g& 8QQE9
5z%%v':;HEE&!G!55u$hk&&9Q&>&9  !) 0 C 0wZ#99 i!G*,0AA ! 0H C !) 0 C 0wZ#99 i!G*,0AA ! 0I C 9:GUU#6:cAv A% 55u$gof&=&B&= 
 Ivw#99&/&)GFOG,DD''/C/@@deIJ'MK(N"J#K]*KKk^.KGEELL#E^hFi^hYZCPS}^hFiEj!klELL#HalImal\]sGSV-alImHn!opELL+C 1 1 5 5 78CJJKEF 
	$	$499VQq+I	$JKu:J+1#e*=NOPD54v/E
3u:,&uvwo "!!F9CC, GjIm 
%	$sn   P- PP- P5P5P:P:>P:Q 5Q Q Q
Q
QP*	$P- *P- -P2Q 	c                 \    \         \        3 F  p \        P                  ! V RR7       K  	  R# )z;Create data/ and data/archive/ folders if they don't exist.T)exist_okN)DATA_DIRARCHIVE_DIRosmakedirs)r  s    r   ensure_data_dirsr    s    $
A% %r"   c           	        \         P                  P                  V 4      '       g   ^ #  \        V 4      ;_uu_ 4       p\        P
                  ! V4      pRRR4       \        X\        4      '       g   \        V4      # \        V4      pWR8  Ed	   \        P                  P                  4       P                  R4      p\         P                  P                  V 4      P                  RRV R24      p\         P                  P                  \        V4      p\        VR4      ;_uu_ 4       p\        P                   ! WC^\"        R7       RRR4       \        V R4      ;_uu_ 4       p\        P                   ! . V4       RRR4       \%        RV RV R	V 24       ^ # V#   + '       g   i     ELN; i  + '       g   i     Lp; i  + '       g   i     LO; i  \&         d   p	\%        R
T RT	 24        Rp	?	^ # Rp	?	ii ; i)z
If a JSON file has >= threshold records, move it to archive with a timestamp.
Archives are NEVER deleted. The working file is reset to empty [].
Nz%Y%m%d_%H%M%Sz.jsonr   rn  ro  u     🗄  z: u#    records archived → data/archive/u      ⚠  archive check failed for )r  r   existsr   rK   rv  
isinstancer   r   r9   r:   rr  basenamer?  r   r  rw  r7   rB   rr   )
r   label	thresholdr   r[   countr1   fnamedestrw   s
   &&&       r   archive_file_if_larger    sY   
 77>>$$ZZ1TYYq\dZ$%%c$i'7D	%%))+44_EBGG$$T*227at5MJEGGLLe4DdCAtyyC'PdCAtyyQ'7HUG2eW,OPUwWX ZZ !   0r!=>sk   G F(G <B*G &F,G  F?8G G F)	#	G ,F<	7G ?G	
G G9G44G9c                    \        4         \        P                  P                  \        4      '       g   R# \        \        4      ;_uu_ 4       p \        P                  ! V 4      pRRR4       XP                  R. 4      pV Uu. uF  q3P                  R4      R8X  g   K  VNK  	  ppV Uu. uF  q3P                  R4      R8X  g   K  VNK  	  ppV Uu. uF  q3P                  R^ 4      ^ 8  g   K  VNK  	  pp\        \        R V 4       4      ^4      pVP                  R\        4      pVP                  R	\        4      p	V'       d-   \        \        V4      \        V4      ,          ^d,          ^4      M^ p
R
\        P                  P                  4       P                  R4      R\        V4      R\        V4      R\        V4      R\        V4      \        V4      ,
          RV
RVR\        RVRV	R\        V\        ,
          \        ,          ^d,          ^4      /p. p\        P                  P                  \         4      '       d8    \        \         4      ;_uu_ 4       p \        P                  ! V 4      pRRR4       VP#                  V4       \        \         R4      ;_uu_ 4       p \        P$                  ! W^\&        R7       RRR4       V'       d"   \)        R\        V4       RV
R RVR 24       R# \)        R4       R#   + '       g   i     EL; iu upi u upi u upi   + '       g   i     L; i   . p L; i  + '       g   i     L; i  \*         d   p\)        RT 24        Rp?R# Rp?ii ; i)z
Called at startup BEFORE paper_log is wiped.
Reads the last session's paper_log and appends a summary to session_history.json.
Even sessions with 0 trades are recorded so we have a complete run history.
NtradesrR  rd  entryrg  c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5irg  Nr   r   r   s   & r   r   'save_session_summary.<locals>.<genexpr>  s     =u!eeE1oou    r@   rA   session_endz%Y-%m-%d %H:%M:%Sentriesr  losseswin_rate_pct	total_pnlstart_balanceend_balancepeak_balancerh  rn  ro  u     💾 Session saved: z trades | WR:r  z	% | P&L:$+.2fuB     💾 Session saved: 0 trades this session (recorded for history)u'     ⚠  Could not save session summary: )r  r  r   r  PAPER_LOG_PATHr   rK   rv  rN   r  rO  STARTING_BALANCEr   r9   r:   rr  SESSION_LOG_PATHrT   rw  r7   rB   rr   )r   logr  r   r  r  r  r  end_balpeak_balwin_ratesummaryhistoryrw   s                 r   save_session_summaryr    s    '=ww~~n--v.!!Qdiil!GGHb) &C1%%.F*BQQC &D1%%.G*CQQD %=1ua1)<QQ=#=u==qA	GGI'78GG-/?@>CE#d)c%j036:x00446??@STs5zs7|s4ys5zCI5xy/wxug0@&@DT%TWZ%Z\]^
 77>>*++!*++qDIIaL'+w"C((AIIgC8 )*3u:,mHS>QZ[deiZjklVXE "!!CD=, ,+ bG((  =7s;<<=s   )M M K?%M LL%M +LLM L0L6EM L5 L"2L5 :)M #L>M M 2M ?L	
M "L2	-L5 1M 2L5 5L;9M >M		M M5M00M5c                    \        4        \        4        \        \        R\        4      p \        \
        R\        4      pV ^ 8  d   \        RV R R\        R R24       V^ 8  d   \        RVR R\        R R24       R# R# )	z
Master data preservation call. Run at every startup before anything is reset.
1. Save session summary from last run
2. Auto-archive large files to data/archive/
3. Never delete anything
trade_analyticsmarket_snapshotsu     📊 Analytics:  ,z records  (archives at )u     📊 Snapshots:  N)r  r  r  ru  ARCHIVE_ANALYTICS_ATr  ARCHIVE_SNAPSHOTS_ATrB   )a_counts_counts     r   preserve_and_archiver    s     #N5FH\]G#N5GI]^G{#GA;.EFZ[\E]]^_`{#GA;.EFZ[\E]]^_` r"   c            
          \        \        R 4      ;_uu_ 4       p \        P                  ! R\        R\
        R\        /V ^\        R7       RRR4       R#   + '       g   i     R# ; i)rn  r@   rA   r  ro  N)r   r  rK   rw  r@   rA   	paper_logr7   )r   s    r   save_logr    sG    	nc	"	"a		9g'8/Y()*1c	C 
#	"	"	"s   1AA%	c
                    \          U
u. uF  qP                  R 4      R8X  g   K  V
NK  	  pp
. p\         EF  pVP                  RVR,          4      p\        WR,          ,
          VR,          ,          ^4      p\        WR,          ,
          VR,          ,          ^d,          ^4      p\	        \
        P
                  ! 4       VP                  R\
        P
                  ! 4       4      ,
          4      pVP                  / RVR,          bRVR,          bRVR,          bR	VP                  R	R
4      bRVP                  RR
4      bRVR,          bRVbRVR,          bRVR,          bRVR,          bRVR,          bRVbRVbRVR,          bRVbR\        P                  P                  VP                  R\
        P
                  ! 4       4      4      P                  R4      b4       EK  	  \        \        ^\        ,
          ,          ^4      pYxT	ppp/ RRbR\
        P
                  ! 4       bRV bRVbRT;'       g    RbR\        \        ^4      bR\        bR\        \        ^4      bRVbR T;'       g    ^ bRT;'       g    R!bR"VbR#\        bR$VbR%T;'       g    R&bR'T;'       g    RbR(VbR)VR*V/Cp \        R+R,4      ;_uu_ 4       p\         P"                  ! VV\$        R-7       R.R.R.4       R.# u up
i   + '       g   i     R.# ; i    R.# ; i)/rR  rd  current_pricerY  r  re  r,  sider   rW  rX  r  targetstopcostpnl_absrh  r   	held_secsentry_time_strrT  modepaperlast_updater   
btc_sourcer   r  r@   starting_balancerA   
stop_levelr  r   bet_tiersession_haltedrb  rc  --score_breakdownr   open_positionscompleted_tradeszC:\kalshibot\bot_state.jsonrn  r  N)r  rN   paper_positionsr  r8   rO   rT   r9   fromtimestamprr  rA   rC   r@   r  r   r   rK   rw  r7   )btcsourcesr   r  r   r   r  r   r  r  r   r  pos_datarI   currentr  rh  r  r  _sc_tr_bdstater   s   &&&&&&&&&&              r   
save_stater    sd   !>	1UU7^v%=QQ	E> H_%%=)9:]#33qzA1E]#33q7GG#MqQ		aeeL$))+&FFG	 
Qx[
QvY
 Q{^
 QUU=#6	

 QUU63/
 Q}-
 W
 Qx[
 QvY
 QwZ
 QvY
 W
 W
 QwZ
 Y
  h//==lDIIK022:(:2F#
 	 2 !.?*?@!DJcC&		S&17 	5!$ '9:J 	5!4	 7CJ	
 	HMM
 $/	0C0CV 	H / 	C 	3;;$ 	399" 	& +H6H%E13771IIeQ, 87[ ?Z 877Ds4   K+K+/L K0!L 0L	;L L L	c	                 F  a V R ,          p	VR8X  d   RMRp
V
R8X  d
   V R,          MV R,          p\         Tu;8:  d   \        8:  g   RD#  RD# V'       d   TM
\        V4      p\        V\        R,          4      p\        ^
\        ^\        W,          4      4      4      p\        W,          ^4      pV\        8  d   RV3# \        \        V^\        ,           ,          ^4      R4      p\        V^\        ,
          ,          ^4      p\        W,
          V,          ^4      p\        VV,
          V,          ^4      pV^ 8  d   \        VV,          ^4      M^ p\        V R	,          ^<,          4      p\        V R	,          ^<,          4      pV3R
 lpV! R4      pV! R4      pV! R4      p/ R V R ,          bRV
bRVbRVbRVbRVbRVbRVbRVbRVbR\        P                  ! 4       bRVbRVbRV R,          bRVbRVbRT;'       g    ^ bRV R,          RV R ,          R	V R	,          R!VR"VR#VR$V/Cp\        V,          s\        ;_uu_ 4        \        P                  V4       R%R%R%4       \        P                  / VCR&R'R(\        P                  P!                  4       P#                  R)4      /C4       \%        VR'4       \'        4        \        \(        ^\*        ,
          ,          ^4      p\-        R*RE 24       \-        R+T R,V
R8X  d   R-MR. 24       \-        R/VR0 R1V R,          R0 24       \-        R2VR3 R4V R5VR6 R7V R8V R924       \-        R:VR6 R;VR3 R<VR6 R;VR3 R=V R>24       \-        R?\        R6 R@\(        R6 RAVR6 24       \-        RBRE 24       RCV3#   + '       g   i     EL@; i)Fr,  r   yesnor   r   Fg?gq=
ףp?r   c                    < \         P                  ! V  R 2S4      pV'       d   \        VP                  ^4      4      # ^ # )z:(-?\d+))researchr8   group)tagr   r  s   & r   _parsepaper_enter.<locals>._parseU  s3    II#h'9"#s1771:**r"   EXPLAGMOMr  rY  r  r  r  r  r  max_gainmax_lossre  ra  r   r   r  rW  r[  r^  r`  r.  rb  r  r  r  NrR  r  rS  rT  
  z  PAPER TRADE []  z
YES BTC UPzNO  BTC DOWNz  BTC: $,.2fz
  Floor: $z
  Entry: $.3fz xz = $r?     |  zm s leftz  Target: +$z ($z)  Stop: -$z)  [z:1]  Balance: $	  Peak: $z  Trailing stop: $  T)FSKIPz>==============================================================)MIN_ENTRY_PRICEMAX_ENTRY_PRICEr%  r   r@   r  r8   r  PROFIT_TARGET	STOP_LOSSrO   position_lockr  rT   r  r9   r:   rr  rz  r  rA   rC   rB   )r   trade_directionrW  r   r  r   override_betoverride_scorer  r,  r  rY  r  r  r  r  r  r  r  rrminssecs_rr  exp_slag_smom_srx  r  s   &&&&&&&&f                   r   paper_enterr7  B  s   HF*d2%D'+u}&#&:JK{=o=}@T=}@T(L.>{.KCWt^$CC3s0123E+%q)Dg~e[005M(9:A>EF[A	M2A6Df*e3Q7HkD(E115H081uX(!,!B6+&",-D6+&+,F+ 5ME6%=5&-%G8VH% Gvt G]K GKGEG!4G)16G;A4G xG ",XG 	G '29	G
 G
 *1&/G ;G !.{G 8==qG VI.VI.{+~{E;GC tOG	s# 
 P PWg ("3"3"7"7"9"B"B:"NP Q#wJ!.?*?@!DJ	D/	OK=D%KL^+\
]^	HYt$Jvgt.D
EF	J{3'r%T#JeD6F8SY
Z[	L#c&[#cRVWZQ[[_`b_ccf
gh	LYs.CCUV`adUe
fg	Bvh- 
s   NN 	c                 b   \         ;_uu_ 4        \        '       g    RRR4       R# . p \         EF  p\        VR,          4      w  r#Vf   K  VR,          R8X  d   TMTpV^ 8:  d   K9  WAR&   VR,          pWE,
          V,          p\        WE,
          VR,          ,          ^4      pRpWAR,          8  d   R	V^d,          R
 R2pMRWAR,          8:  d   RV^d,          R
 R2pM6\        P                  ! 4       VR,          ,
          R8  d   RV^d,          R R2pV'       g   K  \        \
        WAR,          ,          ,           ^4      sV^ 8  d   RMRp	\        RV	 RV RVR RVR RVR R\
        R 24       \        P                  / VCRRRVR VR!VR"\
        R#\        P                  P                  4       P                  R$4      /C4       \        VRVWxR%7       V P                  V4       \        4        EK  	  V  F  p\        P                  V4       K  	  RRR4       R#   + '       g   i     R# ; i)&u   
Called by the 2-second fast monitor thread.
Checks every open position for target/stop/time exit.
Prints only when something actually exits — silent otherwise.
Nr,  r  r  r  rY  r  r  zTARGET +.1fr   r  zSTOP re  i  zTIME +.1fzWIN rk  u   
  ⚡[z]   $r"     →$z  P&L:$r  z  Bal:$r?   rR  rd  rf  rg  reasonbalance_afterrS  rT  )rf  rg  rl  )r-  r  rI  r  rO   r@   rB   r  rT   r9   r:   rr  rz  r  remove)
to_closerx  ybnbr
  r  rh  r  r=  icons
             r   check_exits_fastrD  w  s    
 
"?C#CM2FBz8K50bbG!|X#* -(E%/GW_G<a@GFM)8GTWKX[K\\]A^K'5QTUXHYYZA[s<00365QTUYHZZ[A\v'L*@ @!D$+qL&fbE#;d73- P%d^773-A B   "]C "]&,#('8V#2G#-x/@/@/D/D/F/O/OPZ/["] ^ c6g")?$
3 #4 C""3' ; 
s   HC2HC5HH.	c                 4   ^ RI p ^ RIp^ RIpVP                  ! R4        ! R RV P                  P
                  4      p VP                  RV4      ;_uu_ 4       pVP                  4        RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)zXServe the kalshibot folder at localhost:8765 so dashboard.html can fetch bot_state.json.Nr	   c                   &   a  ] tR tRt o R tRtV tR# ),start_dashboard_server.<locals>.QuietHandleri  c                    R # r   r!   )selfrd   s   &*r   log_message8start_dashboard_server.<locals>.QuietHandler.log_message  s    dr"   r!   N)__name__
__module____qualname____firstlineno__rJ  __static_attributes____classdictcell__)__classdict__s   @r   QuietHandlerrG    s     **r"   rS  )r  i="  )	http.serversocketserverr  chdirserverSimpleHTTPRequestHandler	TCPServerserve_foreverOSError)httprU  r  rS  httpds        r   start_dashboard_serverr^    sp    ((HH_+t{{;; +##J==! >=== s/   B A4*B 4B	?B B BBc                       \         P                  ! \        4       \        4        K(    \         d   p  Rp ? K9  Rp ? ii ; i)uR   Daemon thread — checks positions every 2 seconds independently of the main loop.N)rO   rt   FAST_MONITOR_INTERVALrD  rr   )rw   s    r   fast_monitor_loopra    s0    
	JJ,- 		s   $) ??c                 f   \         ;_uu_ 4        \         F{  p V P                  RV R,          4      pV R,          pW,
          V,          p\        RV R,          R8X  d   RMR RVR	 R
VR	 RV^d,          R RV R,          R	 RV R,          R	 24       K}  	  RRR4       R#   + '       g   i     R# ; i)uP   Called by main loop every 10 seconds — just prints HOLD status, no exit logic.r  rY  z  HOLD r  r  YESNO r;  r"  r<    (r:  z%)  target:$r  z  stop:$r  N)r-  r  rN   rB   )rx  r
  r  rh  s       r   print_position_statusrf    s    	"Cggos=/ABG-(E%/GGS[%%7EUC DC[WSMWS[4F G ]3/xFC7HJ K	 # 
s   BBB0	c                  	   \        RD4       \        R4       \        RC4       \         U u. uF  q P                  R4      R8X  g   K  V NK  	  pp V'       g   \        R\        R R\        R 24       R# V U u. uF  q P                  R^ 4      ^ 8  g   K  V NK  	  pp V U u. uF  q P                  R^ 4      ^ 8:  g   K  V NK  	  pp \        \        R	 V 4       4      ^4      p\        \        R
 V 4       4      ^4      p\        \        P                  ! 4       \        ,
          R,          4      p\        \        P                  ! 4       \        ,
          R,          ^<,          4      p\        RV RV R24       \        R\        R 24       \        R\        R R\        \        ,
          R R24       \        R\        R 24       \        RVR R\        \        ,
          \        ,          ^d,          R R24       \        RVR 24       \        RRE 24       \        R\        V4       R\        V4       R\        V4       R\        V4      \        V4      ,          ^d,          R R2	4       V'       d    \        R V\        V4      ,          R 24       / pV F  p V P                  R!R"4      p	W9  d   R#^ R^ R$^ /W&   W,          R#;;,          ^,          uu&   W,          R;;,          V P                  R^ 4      ,          uu&   V P                  R^ 4      ^ 8  g   K  W,          R$;;,          ^,          uu&   K  	  V'       d   \        R%4       \        VP                  4       4       F]  w  rV
R#,          '       d   V
R$,          V
R#,          ,          ^d,          M^ p\        R&V	R' RV
R#,           R(V
R,          R R)VR R2	4       K_  	  \        R*R+R, RR-R. RR/R0 RR1R2 RR3R2 RR4R2 R524       VRFR  F  p \        RV P                  R6R"4      R, RV P                  R!R"4      R. RV P                  R74      R88X  d   R9MR:R0 R;V P                  R<^ 4      R= R;V P                  R>^ 4      R= R;V P                  R^ 4      R? RV P                  R^ 4      ^ 8  d   R@MRA 24       K  	  \        RB4       \        RC4       R# u up i u up i u up i )Gz

z  PAPER TRADING SESSION REPORTrR  rd  z"  No completed trades.  Balance: $r?   r&  Nrg  c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5ir  r   r  s   & r   r   print_report.<locals>.<genexpr>  s     95a%%q//5r  c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5i)r  Nr   r  s   & r   r   ri    s     :Eq%%**Er  i  z  Session      : zh r   z  Start        : $z  Peak balance : $z  (+$r  z  Final balance: $z  Total P&L    : $r  re  r:  z%)z  Total wagered: $r'  z  Trades       : zW / zL)  Win rate: r  r   z  Avg/trade    : $rW  rX  r  r  z  By type      :r  z<16z trades  P&L: $z  WR: r  Timez>8Typez>9Sidez>4Entryz>7ExitzP&Lz  ResultrS  r  r  rc  rd  r;  rY  r"  rf  z>+6.2frj  rk  z#
  Log: C:\kalshibot\paper_log.jsonA=================================================================zC

=================================================================u   ─────────────────────────────────────────────i)rB   r  rN   r@   rA   r  rO  r8   rO   session_startr  r   rA  r  )r   r  r  r  r  	total_bethrsr2  typesstr[   wrs               r   print_reportrw    sX   	/	
*+	&M!>	1UU7^v%=QQ	E>273-yY\H]^_!9EqUU5!_q%8ED9!:EqUU5!_%9EF:c95991=Ic:E::A>I		m+t34C},4:;D	cU"TF!
,-	/4
56	s35IY9YZ]8^^_
`a	wsm
,-	y.c7;K3KM]2]^a2abf1ggi
jk	yo
./	Bxj/	c%j\SYKtCK=WZ[_W`adejakWkloWopsVttu
vwe(3u:)=d(CDEEUU=#&?!UAvq(IEI	'a5!1QUU5!_!D!155?Q	& 1Q 6 1	 
  "u{{}-HB37==fd7m+C/aBDC4=/eT@RRXY[\_X``abc . 
D2fR[6"+R|2fR[PRSXY[R\\d
ef34[155C(,Bquu]3/G.K2%%-.E"= >%%a(-S|A1Fs0K L%%a.(AEE%N14D5&*QS 	T 
 
24	&MK ? ::s#   R3R37R8R8 R==R=c                     \        R4       \        R4       \        R4       \        R4       \        R4       \        R4       \        R4       \        4        \        s\        s\        \        R4      ;_uu_ 4       p \        P                  ! R\        R\        R. /V 4       R	R	R	4       \        R
\        R R24       \        P                  P                  \        4      '       d    \        \        4      ;_uu_ 4       p \        P                  ! V 4      pR	R	R	4       \        RXP                  RR4       R24       VP                  R. 4       F  p\        RV 24       K  	  VP                  R. 4      sVP                  R. 4      sM. s. s\        R4       \        R4       \        R4       \        R4       \        R4       \        R4       \        R\$         R\&         R24       \        R\(         R24       \        R\*        ^d,          R R 24       \        R!\,        ^d,          R" R#\.        ^d,          R" R$\,        \.        ,          R% R&24       \        R'\0        ^d,          R" R(24       \        R)4       \        R4       \2        '       d+   \4        P6                  ! \8        R*R+7      P;                  4        \4        P6                  ! \<        R*R+7      P;                  4        \4        P6                  ! \>        R*R+7      P;                  4        \4        P6                  ! \@        R*R+7      P;                  4        \4        P6                  ! \B        R*R+7      P;                  4        \4        P6                  ! \D        R*R+7      P;                  4        \4        P6                  ! \F        R*R+7      P;                  4        \4        P6                  ! \H        R*R+7      P;                  4        \4        P6                  ! \J        R*R+7      P;                  4        \        R,4       R-R.R/ 3R0R1R2 3R3R4R5 3R6R7R8 3R9R:R; 3.p. pV FK  w  rgp \L        P                  ! V^R<7      p	V! V	4      p
\        R=VR> R?V
R@ 24       VPO                  V4       KM  	  \        RD\U        V4       RERFPW                  V4       24       \U        V4      ^8  d   \        RG4       \        R4       \        RI4       \Y        ^4       EF  p\Z        P\                  ! ^4       \^        ;_uu_ 4        \`        ;QJ d.    RJ \b        Pe                  4        4       F  '       g   K   R*M#	  RKM! RJ \b        Pe                  4        4       4      p\U        \f        4      pR	R	R	4       X'       d   X\h        8  d   \^        ;_uu_ 4        \b        RL,          ;'       g#    \b        RM,          ;'       g    \b        RN,          pROPW                  RP \b         4       4      pR	R	R	4       \        RQXRR RSX RT24        MV'       g   EK5  \^        ;_uu_ 4        \b        RL,          ;'       g#    \b        RM,          ;'       g    \b        RN,          pR	R	R	4       \        RUXRR RVX RW\h         RX24       EK  	  \        RY4       \        RZ\        R R[\        ^\0        ,
          ,          R R\24       ^ pR]pR	p  \j        Pm                  \&        R<7      pV'       d   \j        Po                  4        \Z        PZ                  ! 4       p\q        4        \s        4       w  pppV'       g=   \        R^\t        Pt                  Pw                  4       Py                  R_4       R`24       K  \{        4       w  ppp\|        ;_uu_ 4        \        \        4      pV'       d
   V^ ,          MR	pR	R	R	4       X'       d=   VRa,          V8w  d/   VRa,          p\        RbVRa,          RR	  Rc\U        X4       Rd24       \^        ;_uu_ 4        \U        \f        4      pR	R	R	4       X\h        8  pRw  ppp p!p"V'       g;   X'       d3   V F,  p#\        V#VVV4      w  p$p%p&p'V$V8  g   K  V$V%V&V'V#3w  ppp p!p"K.  	  VVV V!3w  p(p)p*p+V"'       d   T"pT*;'       g    RfpV'       d   RgV RW\h         RC2p,MNT;'       g    Rhp-V*'       d   RSV* RT2MRep.\U        X4      ^8  d   RV\U        V4       Ri2MRep/V- RjV RkV( V. V/ RHV+ 2	p,\        \        ^\0        ,
          ,          ^4      p0\        '       d   RlMRep1V'       g   RmMJ\        VRn,          ^<,          4       Ro\        VRn,          ^<,          4       RpVRq,          R RrVRs,          R 2p2\        RHV'       d   RtMRH Ru\t        Pt                  Pw                  4       Py                  R_4       RvVRR RSV RwV, RxV2 Ry\        R Rz\        R R{V0R R|\U        \        4       RW\         RTV1 24       V'       d   \        RHV 24       \        '       d   \        4        \        VVVVVVVV(V*V+R}7
       \        VVVV4       \U        \         U3u. uF  p3V3P                  R~4      R8X  g   K  V3NK  	  up34      p4V4^ 8  d(   V4\        8w  d   V4\        ,          ^ 8X  d   \        4        \t        Pt                  Pw                  4       P                  p5RKp6V'       * ;'       d    \        4       '       * ;'       d    VR	J;'       d    V*R	J;'       d    V)R	J;'       d    \U        \        4      \        8  ;'       d    VV,
          \        8  ;'       do    VRn,          \        8  ;'       dW    VP                  Rq^ 4      ^ 8  ;'       d:    VP                  Rs^ 4      ^ 8  ;'       d    \        \        8  ;'       d    V6'       * p7V7'       Eg   V*Ee   V(\        8  Ed   . p8V'       d   V8PO                  R4       \        4       '       d   V8PO                  R4       Vf   V8PO                  Rm4       V*f   V8PO                  RV( R24       V)f   V8PO                  R4       \U        \        4      \        8  d   V8PO                  R4       VV,
          \        8:  d1   V8PO                  R\        \        VV,
          ,
          4       R24       V'       d8   VRn,          \        8:  d&   V8PO                  R\        VRn,          4       R24       V'       d@   VP                  Rq^ 4      ^ 8X  g   VP                  Rs^ 4      ^ 8X  d   V8PO                  R4       \        \        8  d   V8PO                  R\        R R24       V6'       d   V8PO                  R4       \        RV( RSV* RRFPW                  V84       24       V7'       dB   \        V(\        4      p9V9^ 8:  d   EK  \        VV)V*VVVV9V(V+R7	      w  p:p;V:'       d   TpEK;  EK>  EKA    + '       g   i     ELr; i  + '       g   i     EL; i  \"         d   p\        RT 24       . s. s R	p?ELR	p?ii ; i  \"         d3   p\        RATR> RB\Q        T4      PR                   RC24        R	p?E
Ka  R	p?ii ; i  + '       g   i     E	L.; i  + '       g   i     EL; i  + '       g   i     ELk; i  + '       g   i     EL1; i  + '       g   i     EL; iu up3i   \         d    \        4        \        4         R	# \"         d1   p\        RT 24       \Z        P\                  ! ^
4        R	p?EK  R	p?ii ; i)
uE   █                                                               █uF   █        *** TEST VERSION — DATA COLLECTION RUN ***            █uD   █   $250 balance | SCORE_MEDIUM=10 | EXP all time horizons     █uF   █   Analytics → trade_analytics_test.json (separate file)      █rn  r@   rA   r  Nu     ✅ Paper balance reset to $r?   z  (all learning data preserved)u     ✅ Loaded auto_params.json (r  rX  r  r  z     r  r  u(     ⚠  Could not load auto_params.json: z1  PAPER TRADING BOT v3  --  $100 Starting Balancez4  KXBTC15M  |  Binance (WS+REST) + Coinbase + Krakenz?  Signal engine : 3-factor confidence scoring (EXP + LAG + MOM)uJ     Bet sizing    : DYNAMIC — scales with score + balance (Kelly-inspired)z  Position mon  : every zs  |  Entry scan: every zs (instant on big BTC move)z"  Kalshi cache  : refreshed every z"s (background thread, no blocking)z/  Hot path      : instant trigger if BTC moves z%+ (beats market maker lag)z  R:R           : +r  z% target / -z	% stop = r9  z:1z'  Trailing stop: halt if balance drops z% from PEAKz7  Dashboard    : Double-click OPEN DASHBOARD on desktopT)r  daemonzL  Starting: Binance WS + REST, Coinbase, Kraken, OKX, Bybit, Kalshi cache...z
Binance.USrz   c                 B    \        V P                  4       R ,          4      # )r\   rM   rK   r   s   &r   r8  run.<locals>.<lambda>"  s    5'*+r"   Coinbaser   c                 P    \        V P                  4       R ,          R,          4      # )r[   r   r|  r}  s   &r   r8  r~  $  s    5&)(34r"   Krakenr   c                 l    \        V P                  4       R ,          R,          R,          ^ ,          4      # )r   r   rJ   r|  r}  s   &r   r8  r~  &  s#    5(+J7<Q?@r"   OKXr   c                 ^    \        V P                  4       R ,          ^ ,          R,          4      # )r[   r   r|  r}  s   &r   r8  r~  (  s    5&)!,V45r"   Bybitr   c                 l    \        V P                  4       R ,          R,          ^ ,          R,          4      # )r   r   r   r|  r}  s   &r   r8  r~  *  s#    5(+F3A6{CDr"   r{   u     ✅ z<10z $z>10,.2fu     ❌ z unreachable (r  z  Active feeds: u	   /5  —  z, uJ     ⚠  WARNING: fewer than 2 price sources. LAG detection will be limited.r'  z  Waiting for prices...c              3   8   "   T F  q'       g   K  Vx  K  	  R # 5ir   r!   )r   rI   s   & r   r   run.<locals>.<genexpr>=  s     6AAaas   	
Fr   r   r   r   c              3   P   "   T F  p\         V,          '       g   K  Vx  K  	  R # 5ir   )rQ   )r   r   s   & r   r   r  A  s     ?6aVAYY6s   &
&z  Ready  BTC $r!  z []z  BTC $z (rm   z
 ticks)...u"     Slow feeds — continuing anywayr%  z  Stop at: $z  |  Ctrl+C to stop
BASEz  [rT  z] No price datar,  z  [NEW WINDOW] re  z markets open)r  r  zwarming up (r   zmkts) z  score:z
  [HALTED]z	no marketr   r   zs Y:r   z N:r   u   ⚡[z]  BTC $r   r#  z  |  $z (peak:$z stop:$z) [)r   r  r  rR  rd  z
warming upzsession haltedzscore z below thresholdzno directionzmax positionsz	cooldown r$  zonly zs left in windowzmarket has no valid prices yetz	balance $z too lowzhour blocked by learningu     ⚠  score:u   ] SKIP — )r/  r0  r  z	  Error: u   
█████████████████████████████████████████████████████████████████u   █████████████████████████████████████████████████████████████████
rp  zB
=================================================================u     ────────────────────────────────────────────────────────────i)r   NNr  N)YrB   r  r  r@   rA   r   r  rK   rw  r  r   r  r  rv  rN   r  r  rr   r`  SCAN_INTERVALr   rW   r+  r,  rC   rn   	threadingThreadrx   startr   r   r   r^  ra  r   r   r   r~   rT   typerL  r   r   rangerO   rt   rP   anyrQ   valuesrS   r   rX   waitclearrD   r   r9   r:   rr  r   r   r   r   r  r  r   r8   r  MAX_POSITIONSrf  r  r  r  r  r  r  rU  rF   ENTRY_COOLDOWNMIN_SECS_LEFTr$  r  r  r7  KeyboardInterruptrw  r  )<r   apr  rw   test_sourcesworkingnamer   parserrespr\   ihasticksrI   r   
last_entrycurrent_tierlast_market_tickertriggered_by_hot_pathr:   r  r  r   r  r   r   r   r   warmup
best_scorebest_dir	best_tierbest_breakdownbest_marketmktsctdtrbdr   r  r  r  mom_strr  tier_strn_mktsr  halt_strmkt_strr   	completedcurrent_hourhour_blocked	can_tradereasonsr  enteredr   s<                                                               r   runr    s$   	/	
QR	
RS	
PQ	
RS	
QR	/G2B	nc	"	"a		9.0ACSU]_abdef 
#	*+;C*@@_
`a	ww~~&''	.&''1499Q<b'3BFF;LS4Q3RRcdew+UU4&>-B+&&r2J&&3K
 
r	-	
=>	
@A	&M	KM	VX	$%:$;;STaSbb}
~	./C.DDf
gh	;<Mc<QRU;VVq
rs	c 1#6l9S=QTBUU^_lmv_vwz^{{}
~	34Ec4I#3Nk
Z[	CE	&M|
$?EEG-d;AACMd;AACKd;AAC24@FFH-dCIIK.dCIIKHdCIIKJdCIIK	
XY 
Q	+	-	F	4	6	I	@	B	O	5	7	[	D	FL G)6	H<<Q/D4LEF4*BuWo67NN4  * 
S\N)DIIg4F3G
HI
7|aZ[	/	
#$2Y

1Z#66###666CM@R 5L(9%OO
);OOvh?Oxx?6??  N1T("TF!45uS9%OO
);OOvh?O GAd82eWAl^:FG  	23	L\'1=N;N2OPS1TTi
jkJ6L+=
[	3$2$7$7$7$N!$$$&))+C"$!/!1C$H--113<<ZHIYZ\d'3~$Hi""01(/'!*T # &*.@@%+H%5"x(8(>'?s3w<.P^_`S%7U\)FKbHJ)^[g"C%9#sHi%XNBBJWY[]_acegjWjT
Hi # 1;HiQ_0_-E9dI[F<<4L(qa@#--v+/RvQ<R69'lQ6FBs7|nE2BCqXeWXJvhbT!6G2GH!LJ)7RH,2{ 3R 7893vk?RSU?U;V:W X$Y/4Cx8H7MO  B 5u4@(BSBSBWBWBYBbBbcmBnAo pd2gYc'%y Ic](?3*?wzRUFV W/*+1]O1XJH I URv;' 5 7sGT8Y"DVXyA	N	1QUU7^v5MQQ	NOI1}.B!BySdGdhiGi#,,00277L L# % %,C,E(E % %$&% %+/t+;% %@IQU@U% %(=8% % *$~5% % ;'-7	% %
 JJy!,q0% %
 6<ZZ!5Lq5P% % {*% % %$  9!1e|6K|8T*,,GW8X>{8S<PUwVfGg8h$~8V'=8'..:Y#~5SVWegjkuguWvSwRxx~G  9Af[1]BGNNUZ[^_efq_r[sZt  uE  TF  EGvzz)A6!;vzz(ST?UYZ?Z]d]k]k  mM  ^N[(SZ[^R__gGh8iGa8beWBtfK		'@R?STU*5':!8X(D#xQU69%9BD
 J7 M 
#	"	" (''
  	.<QC@AJ2[	.b  	HF4*N473C3C2DAFGG	H ZZ 
 ( #"" D OF ! 	.NHJ 	3IaS/"DJJrNN	3s  <&x(x3 ?xA2x3 <Ay/z6z")z2*z2,){{!| .B| 3| #{2| A
| {.(| | &#| 

| 
|  | 7
| A3| 6C/| &:|  |=|A,| 0| | | | +| 	| !| 9| | 3| | | 4C'| >| A/| ;| | !!| x	x0	*	x3 3y>yyz)&zzz/2{{{+	%	| .{?	9| }#)}#2}#3$}}#__main__r   )r  r   Nr  )Nr   r  )__doc__r  r-   r9   rO   rK   r  r~   r  dotenvr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   cryptography.hazmat.backendsr   ro   rn   ImportErrorgetenvr<   r    r;  BOT_DIRr  r  ru  r  r  r  r  r  r  r  r+  r,  r*  r)  r   r   r  r  r  r   rC   r  r  r  r"  r!  r$  r#  r   r   r   r   rQ   rR   rS   LockrP   r  r  rq  r@   rA   r   rY   traded_tickersr-  r`  r   rW   r   r   r   r   r   EventrX   rU   r  r  r   r   r#   r5   r=   rD   rF   rx   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r%  r   rG  rI  r  r  r  r  r  r   rz  r  r  r  r  r  r  r  r  r7  rD  r^  ra  rf  rw  r  rL  r!   r"   r   <module>r     s$   A @ @ @  @ = 8L 99()99./- #(1=>C 74    	    
  !  dJheTSZ\`adJheTSZ\`a.."
	99;##5>>#     ~~'  ~~'   (
 f10"+Z&$(")"]-^'R&-8&I9>+
      4-^)VAxF&
2.=`a"C
0d3j%(N
	K)V}3~ zE s$  Ls   G8 8	HH