o
    Ôìoj� ã                   @   sè  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZ	d dl
Z
d dlmZmZ d dlmZmZmZ d dlmZ e e¡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#h d£Z$dddddddddœdddddd d!ddœd"œZ%d#Z&d$Z'	%d‚d&e(d'e)e( d(e*d)e+e*e(e,e*f f fd*d+„Z-dƒd-ej.d.e/d)ej.fd/d0„Z0d„d-ej.fd4d5„Z1d…d-ej.fd8d9„Z2d-ej.d.e/d)ej.fd:d;„Z3d†d=ej4fd>d?„Z5dƒd=ej4d)ej.fd@dA„Z6dƒd=ej4d.e/d)e*dB fdBdC„Z7dDe)e, dEe(e,e*f d)e)e, fdFdG„Z8dHe(dB dIe)e( dB d)e(dB fdJdK„Z9	d‡d=ej4dB dLe/dMedB d)ej4dB fdNdO„Z:	d‡dLe/dMedB d)efdPdQ„Z;d‡dRedB d)e,fdSdT„Z<dRe,dB d)edB fdUdV„Z=dWej4d)e+e,e/f fdXdY„Z>dZe,d[e,d\e,d)e/dB fd]d^„Z?dZe,dB d)e,fd_d`„Z@dae,dB d)e(fdbdc„ZAdde,dee*dfe/dge)e, dhe*die*dje*dke*dle*d)e(fdmdn„ZBd=ej4d)e(dB fdodp„ZCd=ej4d)e(dB fdqdr„ZDd‡d=ej4dZe,dB d)e(dB fdsdt„ZE			udˆd=ej4dve*dwe*dxe*dye,dze/dB dde,d)e+eFe,f fd{d|„ZGdZe,d}e*d)e/fd~d„ZHG d€d�„ d�ƒZIdS )‰é    N)ÚCounter)ÚdatetimeÚ	timedelta)Úsave_sessionÚsave_positionÚdelete_position)Úrender_charté   éP   çš™™™™™é?g333333@gffffff@é<   éF   i  é   gÍÌÌÌÌÌä?éÈ   é   g      >@>   úKRW-ADAúKRW-ETHúKRW-SOLúKRW-XRPúKRW-BTCu   ë©”ì�´ì € ì¶”ì„¸gš™™™™™É?çffffff@çffffffÖ?ç333333@é   é   )ÚlabelÚentry_thresholdÚmin_atr_pctÚmax_atr_pctÚmin_daily_atr_pctÚmax_daily_atr_pctÚcooldown_winÚcooldown_lossu   ì•ŒíŠ¸ ë�ŒíŒŒé
   ç      ð?g      @g       @é   )ÚmajorÚaltz%Y-%m-%d %H:%M:%Sú%m-%d %H:%Mçü©ñÒMb@?ÚsessionÚ	positionsÚfee_rateÚreturnc           
      C   sà   i }d}|D ]C}|  d¡dvrq|  d¡}t|  d¡pdƒ}t|  d¡p%dƒ}|r7|dkr7|  |d¡| ||< |dkrI|dkrI||| d|  7 }q|   d	¡}	|	d
u rgt|   d¡pZdƒt|   d¡pbdƒ | }	tt|	ƒdƒ|fS )zBRestore paper cash and coin balances from persisted session state.ç        Ústatus©ÚholdingÚbuyingÚcoinÚ
buy_volumer   Ú	buy_priceé   Úvirtual_krwNÚtotal_budgetÚtotal_realized)ÚgetÚfloatÚmax)
r*   r+   r,   Úvirtual_coinsÚinvested_cashÚposr3   Úvolumer5   Ú
saved_cash© rB   ú-/var/www/back/telegram_server/upbit_trader.pyÚreconstruct_virtual_account>   s,   
€
ÿþÿrD   é   ÚcloseÚperiodc                 C   sV   |   ¡ }| |dkd¡ |¡ ¡ }| |dk d¡  |¡ ¡ }|| }ddd|   S )Nr   éd   r6   )ÚdiffÚwhereÚrollingÚmean)rF   rG   ÚdeltaÚgainÚlossÚrsrB   rB   rC   Úcalc_rsia   s
   rQ   é   é   é	   c           	      C   sP   | j |dd� ¡ }| j |dd� ¡ }|| }|j |dd� ¡ }|| }|||fS ©NF)ÚspanÚadjust©ÚewmrL   )	rF   ÚfastÚslowÚsignalÚema_fastÚema_slowÚ	macd_lineÚsignal_lineÚ	histogramrB   rB   rC   Ú	calc_macdi   s   
rb   é   é   c                 C   s6   |   |¡ ¡ }|   |¡ ¡ }|||  ||||  fS ©N)rK   rL   Ústd)rF   rG   Únum_stdÚsmarf   rB   rB   rC   Úcalc_bollingerr   s   ri   c                 C   s   | j |dd� ¡ S rU   rX   )rF   rG   rB   rB   rC   Úcalc_emax   ó   rj   é   Údfc                 C   s`   | d   |¡ ¡ }| d   |¡ ¡ }|| }| d | | dtj¡ d }|  |¡ ¡ }||fS )NÚlowÚhighrF   r   rH   )rK   Úminr<   ÚreplaceÚnpÚnanrL   )rm   Úk_periodÚd_periodÚlow_minÚhigh_maxÚdenomÚkÚdrB   rB   rC   Úcalc_stochastic|   s   r{   c                 C   s^   | d }| d }| d }t j|| || ¡   ¡ || ¡   ¡ gdd�jdd�}| |¡ ¡ S )Nro   rn   rF   r6   )Úaxis)ÚpdÚconcatÚshiftÚabsr<   rK   rL   )rm   rG   ro   rn   rF   ÚtrrB   rB   rC   Úcalc_atr…   s   ýüür‚   c                 C   s\   | d u s
t | ƒ|k rd S t| |ƒ}| d jd }|jd }t |¡s$|s&d S t|| d ƒS )NrF   éÿÿÿÿrH   )Úlenr‚   Úilocr}   Úisnar;   )rm   rG   ÚatrÚcurÚ	atr_valuerB   rB   rC   Úcalc_atr_pct‘   s   

rŠ   ÚtickersÚ
volume_mapc                    s   t | ‡ fdd„dd�S )uJ   ì „ì²´ ì¢…ëª©ì�„ ìœ ì§€í•œ ì±„ ê±°ëž˜ëŒ€ê¸ˆì�´ í�° ìˆœì„œë¡œ ì²˜ë¦¬í•œë‹¤.c                    s   ˆ   | d¡S )Nr   ©r:   ©Úticker©rŒ   rB   rC   Ú<lambda>¡   s    z%rank_market_tickers.<locals>.<lambda>T©ÚkeyÚreverse)Úsorted)r‹   rŒ   rB   r�   rC   Úrank_market_tickersœ   s   r–   Ú	orderbookÚtradesc              
      s~  | r
|r
t |ƒtk rdS |  d¡pg }|sdS |dt… }z$tdd„ |D ƒƒ}tdd„ |D ƒƒ}t|d d ƒ}t|d d ƒ}W n tttfyN   Y dS w || }|| d	 }	|dkse|	dkse||k rgdS || }
|| |	 d
 }g }z(|D ]#}| d¡}|dvr„qxt|d ƒt|d ƒ }|dkr›| 	||f¡ qxW n tttfyª   Y dS w t |ƒtk r³dS t
jdd„ |D ƒtd�}t| ¡ ƒ}|dkrËdS tdd„ |D ƒƒ}|| }tt
 |d¡ƒ‰ ‡ fdd„|D ƒ}tdd„ |D ƒƒ}|dkrødS tdd„ |D ƒƒ| }d}g }d}|
dk�r|d7 }| 	d|
d›d�¡ n|
dk�r6|d8 }|d7 }| 	dd|
 d›d�¡ |dk�rJ|d7 }| 	d|d›d�¡ n|d k�rc|d8 }|d7 }| 	d!d| d›d�¡ |d"k�rw|d7 }| 	d#|d›d�¡ n|d$k�r�|d8 }|d7 }| 	d%d| d›d�¡ |tk}|�r¡| 	d&|d'›d(�¡ ||�p¨|d	kt|
d)ƒt|d)ƒt|d)ƒt|d	ƒt |ƒ|d*œS )+uM   í˜¸ê°€ì™€ ì‹¤ì œ ì²´ê²°ì�„ ê²°í•©í•´ ë‹¨ê¸° ë§¤ìˆ˜ ìˆ˜ê¸‰ì�„ ì �ìˆ˜í™”í•œë‹¤.NÚorderbook_unitsc                 s   ó(   � | ]}t |d  ƒt |d ƒ V  qdS )Ú	bid_priceÚbid_sizeN©r;   ©Ú.0ÚunitrB   rB   rC   Ú	<genexpr>²   ó
   € ÿ
ÿz%analyze_order_flow.<locals>.<genexpr>c                 s   rš   )Ú	ask_priceÚask_sizeNr�   rž   rB   rB   rC   r¡   ¶   r¢   r   r›   r£   rd   é'  Úask_bid)ÚBIDÚASKÚtrade_priceÚtrade_volumec                 S   s   g | ]\}}|‘qS rB   rB   ©rŸ   Ú_ÚnotionalrB   rB   rC   Ú
<listcomp>Ö   ó    z&analyze_order_flow.<locals>.<listcomp>)Údtypec                 s   ó    � | ]\}}|d kr|V  qdS ©r§   NrB   ©rŸ   Úsider­   rB   rB   rC   r¡   Û   s   € ÿéZ   c                    s    g | ]\}}|ˆ kr||f‘qS rB   rB   r³   ©Úlarge_cutoffrB   rC   r®   á   s
    þc                 s   s   � | ]\}}|V  qd S re   rB   r«   rB   rB   rC   r¡   æ   ó   € c                 s   r±   r²   rB   r³   rB   rB   rC   r¡   ê   ó   € g=
×£p=â?r6   u   í˜¸ê°€ë§¤ìˆ˜ìš°ì„¸(ú.0%ú)g…ëQ¸…Û?u   í˜¸ê°€ë§¤ë�„ìš°ì„¸(gš™™™™™á?u   ì²´ê²°ë§¤ìˆ˜ìš°ì„¸(çÍÌÌÌÌÌÜ?u   ì²´ê²°ë§¤ë�„ìš°ì„¸(g�Âõ(\�â?u   ëŒ€ëŸ‰ë§¤ìˆ˜ìš°ì„¸(gáz®GáÚ?u   ëŒ€ëŸ‰ë§¤ë�„ìš°ì„¸(u   ìŠ¤í”„ë ˆë“œê³¼ë‹¤(ú.1fzbp)r   )ÚscoreÚblockedÚbook_buy_ratioÚtrade_buy_ratioÚlarge_buy_ratioÚ
spread_bpsÚtrade_countÚreasons)r„   ÚORDER_FLOW_MIN_TRADESr:   ÚORDER_FLOW_BOOK_LEVELSÚsumr;   ÚKeyErrorÚ	TypeErrorÚ
ValueErrorÚappendrr   ÚarrayÚ
percentileÚORDER_FLOW_MAX_SPREAD_BPSÚround)r—   r˜   ÚunitsÚ	top_unitsÚbid_notionalÚask_notionalÚbest_bidÚbest_askÚ
book_totalÚmidpointrÀ   rÃ   Úsigned_tradesÚtrader´   r­   Ú	notionalsÚtotal_notionalÚbuy_notionalrÁ   Úlarge_tradesÚlarge_totalrÂ   r¾   rÅ   Únegative_signalsÚspread_blockedrB   r¶   rC   Úanalyze_order_flow¤   s¾   þþÿ
€úÿÿ
þÿÿ





ørâ   Úinterval_minutesÚreference_timec                 C   st   | du s
t | ƒdk r| S |pt ¡ }t|dƒr| ¡ }| jd  ¡ }|t|d� }||k r6| jdd…  ¡ S |  ¡ S )uF   Upbit ì�‘ë‹µì�˜ ë§ˆì§€ë§‰ í–‰ì�´ ì§„í–‰ ì¤‘ ìº”ë“¤ì�´ë©´ ì œì™¸í•œë‹¤.Nrd   Úto_pydatetimerƒ   ©Úminutes)	r„   r   ÚnowÚhasattrrå   Úindexr   r…   Úcopy)rm   rã   rä   ÚrefÚlast_tsÚcutoffrB   rB   rC   Úget_completed_candle_df  s   
rï   c                 C   s8   |pt  ¡ }|j|  |  }|j|ddd�}|t| d� S )Nr   )ÚminuteÚsecondÚmicrosecondræ   )r   rè   rð   rq   r   )rã   rä   rè   Úminute_bucketÚcurrent_candle_startrB   rB   rC   Úget_latest_closed_candle_start.  s   ÿrõ   Úvaluec                 C   s   | pt  ¡  t¡S re   )r   rè   ÚstrftimeÚTRADE_TIME_FORMAT)rö   rB   rB   rC   Úformat_trade_time:  rk   rù   c                 C   s`   | sd S zt  | t¡W S  ty   Y nw zt  | t¡}|jt  ¡ jd�W S  ty/   Y d S w )N)Úyear)r   Ústrptimerø   rË   ÚLEGACY_TRADE_TIME_FORMATrq   rè   rú   )rö   ÚparsedrB   rB   rC   Úparse_trade_time>  s   ÿÿrþ   Údf_dailyc                 C   s’   | du s
t | ƒdk rdS | d }t|dƒ}t|dƒ}|jd }||jd k}||jd k}|jd |jd k}|s?|s?|s?d	S |rG|rG|rGd
S dS )uš   ì�¼ë´‰ EMAë¡œ ëŒ€ì„¸ íŒ�ë‹¨. Returns (trend, score_bonus).
    í•˜ë�½ ì¶”ì„¸ëŠ” ìƒ�ëŒ€ê°•ë�„ ì „ëžµì—�ì„œ ì‚¬ìš©í•  ìˆ˜ ìžˆë�„ë¡� -2ë¥¼ ë°˜í™˜í•œë‹¤.
    Nr   ©Úneutralr   rF   rc   é2   rƒ   éýÿÿÿ)Údownéþÿÿÿ)Úuprd   )r„   rj   r…   )rÿ   rF   Úema20Úema50rˆ   Úabove_ema20Úabove_ema50Úema20_risingrB   rB   rC   Úcheck_trendR  s   


r  r�   Úasset_trendÚ	btc_trendc                 C   sP   |dkrdS d}| dkr|S t | ƒdkr|dkrdS |ddddœ |d¡7 }|S )	uQ   ë©”ì�´ì €ëŠ” ê°•ì„¸ìž¥ë§Œ, ì•ŒíŠ¸ëŠ” BTC ìœ„í—˜ ì �ìˆ˜ë¥¼ ë°˜ì˜�í•´ ì„ ë³„í•œë‹¤.r  Nrd   r   r&   r   r  )r  r  r  )Úget_strategy_kindr:   )r�   r  r  Ú
adjustmentrB   rB   rC   Úget_entry_trend_adjustmentk  s   r  c                 C   s   | t v rdS dS )Nr&   r'   )ÚMAJOR_TICKERSrŽ   rB   rB   rC   r  ‚  s   r  Úticker_or_kindc                 C   s   | t v r| nt| ƒ}t | S re   )ÚSTRATEGY_PROFILESr  )r  ÚkindrB   rB   rC   Úget_strategy_profileˆ  s   r  Ústrategy_kindÚpricer¾   rÅ   Útarget_profitÚ	stop_lossÚatr_pctÚrsiÚ	vol_ratioc	           
      C   s8   t | ƒ}	|||t|dƒt|dƒt|dƒ||| |	d dœ
S )Nrd   r   )
r  r¾   rÅ   r  r  r  r  r  r  Ústrategy_name)r  rÐ   )
r  r  r¾   rÅ   r  r  r  r  r  ÚprofilerB   rB   rC   Ú_build_signal_result�  s   ör   c                 C   sP  | d u s
t | ƒtk rd S | d }| d }|jd }td }t|ƒ}t|ƒ\}}}t|dƒ}	t|dƒ}
t|dƒ}t| ƒ}| d¡ 	¡ }|jd }|jd }|jd }|jd }|jd }|d	krf|jd | nd	}t
 |¡s…t
 |¡s…t
 |¡s…t
 |¡s…|d	ks…t
 |¡r‡d S || d
 }||d k s™||d kr›d S |dk s£|dkr¥d S |
jd |jd ks¹|
jd |
jd kr»d S ||
jd k sË||
jd d krÍd S |dk rÓd S |d	krã|jd |jd krãd S d	}g }|	jd |
jd   krû|jd k�rn n
|d7 }| d¡ n||
jd   k�r|jd k�r$n n	|d7 }| d¡ |	jd |	jd k�rA||	jd k�rA|d7 }| d¡ n|jd |jd k�rU|d7 }| d¡ |jd |jd k�rt||k�rt|d	k�rt|d7 }| d¡ n%|d	k�rˆ||k�rˆ|d7 }| d¡ n|d	k�r—|d7 }| d¡ nd S d|  k�r¥dk�r¶n n|d7 }| d|d›d�¡ n|d7 }| d |d›d�¡ |d!k�rØ|d7 }| d"|d#›d$�¡ n|d%k�rë|d7 }| d&|d#›d$�¡ |jd'd …  ¡ }||d( k�r|d7 }| d)¡ tt|d* d+ƒd,ƒ}tt|d, d!ƒd-ƒ}td||||||t|ƒt|ƒƒ	S ).NrF   r@   rƒ   r&   r   rc   r   r  r   rH   r   r   é*   éB   r  g¤p=
×£ð?ç333333ë?rl   u   ë©”ì�´ì €ì •ë°°ì—´rd   u   ì¤‘ê¸°ìƒ�ìŠ¹u   ë‹¨ê¸°íšŒë³µr6   u   ì–‘ë´‰íšŒë³µõ
   MACDí™•ìž¥u
   MACDìƒ�ìŠ¹õ
   MACDì–‘ìˆ˜é0   u
   RSIê±´ê°•(ú.0fr»   u
   RSIì•ˆì •(gš™™™™™ù?u   ê±°ëž˜ëŸ‰í™•ëŒ€(r½   úx)gš™™™™™ñ?u   ê±°ëž˜ëŸ‰í™•ì�¸(iìÿÿÿg…ëQ¸…ï?u   ê³ ì �ê·¼ì ‘gffffffò?çÍÌÌÌÌÌì?çffffffþ?r   )r„   ÚMIN_SIGNAL_BARSr…   r  rQ   rb   rj   r‚   rK   rL   r}   r†   rÌ   r<   rp   r   r;   )rm   rF   r@   rˆ   r  r  r_   r`   Ú	macd_histÚema5r  Úema60r‡   Úvol_avgÚcur_rsiÚcur_histÚ	prev_histÚcur_atrÚcur_vol_avgÚcur_vol_ratior  r¾   rÅ   Úrecent_highr  r  rB   rB   rC   Úanalyze_major_coin§  sÀ   








ÿþýüÿ( ,(
&
*



÷r7  c                 C   s  | d u s
t | ƒtk rd S | d }| d }|jd }td }t|ƒ}t|ƒ\}}}t|dƒ}	t|dƒ}
t|dƒ}t| ƒ}| d¡ 	¡ }|jd }|jd }|jd }|jd }|jd }|d	krf|jd | nd	}t
 |¡s…t
 |¡s…t
 |¡s…t
 |¡s…|d	ks…t
 |¡r‡d S || d
 }||d k s™||d kr›d S |dk s£|dkr¥d S |	jd |
jd   kr¹|jd ks¼d S  d S |
jd |
jd krÈd S ||
jd k sØ||
jd d krÚd S |d	ksâ||k räd S |dk rêd S |jdd…  ¡ }||d k rûd S d}dg}||k�r|d7 }| d¡ n	|d7 }| d¡ |jd |jd k�r8|jd |jd k�r8|d7 }| d¡ n#|jd |jd k�rR||k�rR|d7 }| d¡ n	|d7 }| d¡ |dk�ro|d7 }| d|d›d�¡ n|d7 }| d |d›d�¡ d!|  k�r‰d"k�ršn n|d7 }| d#|d$›d%�¡ n|d7 }| d&|d$›d%�¡ t| d' jd | d( jd  |d) ƒ}|| d( jd  | }|d*k�rÞ|| d+ jd k�rÞ|d7 }| d,¡ tt|d- d-ƒd.ƒ}tt|d/ d0ƒd1ƒ}td||||||t|ƒt|ƒƒ	S )2NrF   r@   rƒ   r'   r   rc   r   r  r   rH   r   r   r&  éJ   r  gHáz®Gñ?gš™™™™™õ?iëÿÿÿgX9´Èv¾ï?u   ë�ŒíŒŒê¸°ë°˜rd   u   ì§�ì „ê³ ì �ë�ŒíŒŒr6   u   ê³ ì �ì••ë°•u
   MACDë�ŒíŒŒr$  r%  r*  u   ê±°ëž˜ëŸ‰í�­ì¦�(r½   r(  u   ê±°ëž˜ëŸ‰ë�™ë°˜(é7   éD   u
   RSIê°€ì†�(r'  r»   u
   RSIìœ ì§€(ro   rn   g-Cëâ6?gffffffæ?Úopenu   ì¢…ê°€ê°•ì„¸gffffffö?g      @g       @r   gÍÌÌÌÌÌ@)r„   r+  r…   r  rQ   rb   rj   r‚   rK   rL   r}   r†   r<   rÌ   rp   r   r;   )rm   rF   r@   rˆ   r  r  r_   r`   r,  r-  r  r.  r‡   r/  r0  r1  r2  r3  r4  r5  r  Úrecent_breakoutr¾   rÅ   Úcandle_rangeÚclose_strengthr  r  rB   rB   rC   Úanalyze_alt_coin  s¼   








ÿþýüÿ$ÿ 

, 

&
÷r?  c                 C   s    t |ƒ}|dkrt| ƒS t| ƒS )Nr&   )r  r7  r?  )rm   r�   r  rB   rB   rC   Úanalyze_coin�  ó   r@  r&   r5   ÚtargetÚstopÚ	bought_atÚheld_candlesc                 C   s  | d u s
t | ƒdk rdS | d }|jd }|| | d }	t|dƒ}
t|dƒ}t|ƒ\}}}t| ƒ}|dkr?|jd | d nd}t|ƒ}|d u rd|rdt|ƒ}|rdt ¡ |  	¡ d }t
t|d	 ƒdƒ}|	| krrd
d|	d›d�fS |	|krd
d|	d›d�fS |dkr˜t
|d dƒ}t
|d dƒ}d}d}d}nt
|d dƒ}t
|d dƒ}d}d}d}|	|krÝ|d ur¾tt
|d dƒ|ƒ}|j| d …  
¡ }|| | d }||krÝd
d|	d›d�fS |dkrãdnd}|	|k�r||
jd k �r|jd |jd k �rd
d |	d›d�fS |dk�rd!nd"}|dk�rdnd#}|jd |k�r9|jd |jd k �r9|	|k�r9d
d$|	d›d�fS |d u�r‹|dk�rEd%nd}|dk�rQ|jd n|
jd }||k�rs|	|k �rs||k �rsd
d&|d	 › d'|	d›d�fS ||k�r‹|	dk �r‹d
d(|d	 › d'|	d›d�fS dS ))Nr   )FÚ rF   rƒ   rH   r   rc   r   é   Tu   ì†�ì ˆ(ú+.2fz%)u   ëª©í‘œìˆ˜ì�µ(r&   r¼   r   r)  rE   é   r&  r   r$   r#  r   rR   r6   r%   u   íŠ¸ë ˆì�¼ë§�ìŠ¤íƒ‘(g333333ã?r  u   ë‹¨ê¸°ì¶”ì„¸ì�´íƒˆ(éL   r8  ç      ø?u   ê³¼ì—´ë‘”í™”(ç333333Ó?u   ì‹œê°„ì •ë¦¬(u   ë¶„, u   ìž¥ê¸°ë¶€ì§„()r„   r…   rj   rb   r‚   rQ   rþ   r   rè   Útotal_secondsr<   Úintrp   )rm   r5   rB  rC  rD  rE  r  rF   rˆ   Úprofit_rater-  r  r¬   r,  r‡   r  r  Úbought_at_dtÚheld_minutesÚtrail_triggerÚtrail_floorÚtrail_windowÚ
time_cut_1Ú
time_cut_2r6  Údrop_from_highÚtrend_break_floorÚoverheat_rsiÚoverheat_floorÚ
time_floorÚtime_emarB   rB   rC   Úcheck_sell_signal—  sj   	



00
r]  Ú
profit_krwc                 C   s    t | ƒ}|dk r|d S |d S )Nr   r"   r!   )r  )r�   r^  r  rB   rB   rC   Úget_cooldown_barsâ  rA  r_  c                   @   s  e Zd ZdZdZdd„ Zdefdd„Zede	fdd	„ƒZ
edefd
d„ƒZede	fdd„ƒZede	fdd„ƒZdee de	deee	f fdd„ZdBdede	fdd„Zdefdd„Zdejfdd„Zdee deee	f fdd„Zdee deee	f fdd „Zd!eded"B fd#d$„ZdCd%d&„Zdee defd'd(„Zdee deeef fd)d*„Zdeeef fd+d,„Zdee fd-d.„Z dCd/d0„Z!dDd1ed2e	d"B dd"fd3d4„Z"d5ed6edd"fd7d8„Z#d9edeeef fd:d;„Z$dee fd<d=„Z%ded"B fd>d?„Z&defd@dA„Z'd"S )EÚUpbitTraderi|  r)   c                 C   sà   t j dd¡}t j dd¡}|r|rt ||¡| _nd | _d| _d| _d| _d| _	d | _
i | _d| _d| _g | _d| _d| _d | _i | _d| _d| _d | _d | _i | _g | _i | _d| _d | _d | _i | _d| _d| _i | _ d S )	NÚUPBIT_ACCESS_KEYrF  ÚUPBIT_SECRET_KEYFr   r.   iX  r  )!ÚosÚenvironr:   ÚpyupbitÚUpbitÚupbitÚrunningr8   r9   Útotal_tradesÚ
started_atr+   Ú
_last_scanÚ_last_reportÚ_candidatesÚ_report_intervalÚcompoundÚ_http_sessionÚ_allocationsÚ	_strategyÚ_market_trendÚ_last_scan_candleÚ_last_scan_atÚ_last_scan_statsÚ_last_scan_analyzedÚ_daily_screen_cacheÚ_daily_screen_cache_timeÚ_daily_screen_cache_updated_atÚ_last_sell_candleÚ
_cooldownsÚ
paper_modeÚ_virtual_krwÚ_virtual_coins)ÚselfÚ
access_keyÚ
secret_keyrB   rB   rC   Ú__init__ñ  s@   
zUpbitTrader.__init__r-   c                 C   s   | j rdS | jd uS )NT)r}  rg  ©r€  rB   rB   rC   Úis_configured  s   
zUpbitTrader.is_configuredc                 C   s    | j rt| j| j | jƒS | jS )u:   ë³µë¦¬ ëª¨ë“œ: ìˆ˜ì�µê¸ˆ í�¬í•¨ / ì�¼ë°˜: ì´ˆê¸° íˆ¬ìž�ê¸ˆ)ro  r<   r8   r9   ÚMIN_BUYr„  rB   rB   rC   Úeffective_budget  s   zUpbitTrader.effective_budgetc                 C   s$   | j }|dkr	dS tt|d ƒdƒS )u/   ì˜ˆì‚° ê¸°ë°˜ ìµœëŒ€ ë³´ìœ  ì¢…ëª© ìˆ˜ (ë�™ì �)r   r6   r¥   r   )r‡  rp   rN  )r€  ÚbudgetrB   rB   rC   Ú	max_coins%  s   zUpbitTrader.max_coinsc                 C   s   | j dkr| j| j  S dS )u   ê· ë“± ë°°ë¶„ (í�´ë°±ìš©)r   )r‰  r‡  r„  rB   rB   rC   Úinvest_per_coin.  s   zUpbitTrader.invest_per_coinc                 C   s(   t dd„ | j ¡ D ƒƒ}t| j| dƒS )uE   ë‚¨ì�€ íˆ¬ìž� ê°€ëŠ¥ ì˜ˆì‚° = ì´� ì˜ˆì‚° - ì�´ë¯¸ íˆ¬ìž�ì¤‘ì�¸ ê¸ˆì•¡c                 s   s@   � | ]}|d  dkr|  d¡r|  d¡r|d |d  V  qdS )r/   r1   r5   r4   Nr�   ©rŸ   ÚprB   rB   rC   r¡   6  s   €  þýz/UpbitTrader.remaining_budget.<locals>.<genexpr>r   )rÈ   r+   Úvaluesr<   r‡  )r€  ÚinvestedrB   rB   rC   Úremaining_budget3  s   þzUpbitTrader.remaining_budgetÚ
candidatesÚavail_budgetc                    s
  |si S |ˆj k rdˆ_i S tdd„ ˆj ¡ D ƒƒ}ˆj| }|dkr(dˆ_i S ‡fdd„|D ƒ}|s8dˆ_i S |d|… }td	d
„ |D ƒƒt|ƒ }|dkr`td|t|ƒƒ}d|d›d�ˆ_n$|dkrutd|t|ƒƒ}d|d›d�ˆ_nt|t|ƒƒ}d|d›d�ˆ_|dkrž|| ˆj k rž|d8 }|dkrž|| ˆj k s�|d|… }	|	s¨i S tdd
„ |	D ƒƒ}
|
dkrÄ|t|	ƒ ‰ ‡ fdd„|	D ƒS i }|}t|	ƒD ]6\}}|t|	ƒd krÛ|}nt	||d  |
 dƒ}t
|ˆj ƒ}|ˆj k�r|ˆj k�r|||d < ||8 }qÌ|S )uê   ì „ëžµì � ì¢…ëª© ìˆ˜ ê²°ì • + ì �ìˆ˜ ë¹„ë¡€ íˆ¬ìž�ê¸ˆ ê°€ì¤‘ ë°°ë¶„

        - ê³ í™•ì‹  ì‹œê·¸ë„�(í�‰ê·  7+): 1-2ì¢…ëª© ì§‘ì¤‘
        - ì¤‘ê°„ ì‹œê·¸ë„�(5-6): 2-3ì¢…ëª© ë¶„ì‚°
        - ì•½í•œ ì‹œê·¸ë„�(4): ìµœëŒ€í•œ ë¶„ì‚°
        u   ìž”ê³  ë¶€ì¡±c                 S   ó   g | ]
}|d  dv r|‘qS ©r/   r0   rB   r‹  rB   rB   rC   r®   J  s    ÿz1UpbitTrader._calc_allocations.<locals>.<listcomp>r   u   ìŠ¬ë¡¯ ì—†ì�Œc                    s   g | ]}|d  ˆ j vr|‘qS rŽ   ©r+   ©rŸ   Úcr„  rB   rC   r®   Q  s    u   í›„ë³´ ì—†ì�ŒNc                 s   ó   � | ]}|d  V  qdS ©r¾   NrB   r•  rB   rB   rC   r¡   X  r¸   z0UpbitTrader._calc_allocations.<locals>.<genexpr>r   rd   u   ì§‘ì¤‘íˆ¬ìž�(r½   u   ì �)r%   rl   u   ê· í˜•ë¶„ì‚°(u   ê´‘ì—­ë¶„ì‚°(r6   c                 s   r—  r˜  rB   r•  rB   rB   rC   r¡   m  r¸   c                    s   i | ]}|d  ˆ “qS rŽ   rB   r•  )ÚperrB   rC   Ú
<dictcomp>p  s    z1UpbitTrader._calc_allocations.<locals>.<dictcomp>r¾   r  r�   )r†  rr  r„   r+   r�  r‰  rÈ   rp   Ú	enumeraterÐ   r<   )r€  r�  r‘  r1   Úmax_newÚ	availableÚtop_nÚ	avg_scorerB  ÚselectedÚtotal_scoreÚallocationsÚ	remainingÚir–  ÚamountrB   )r™  r€  rC   Ú_calc_allocations=  s\   

ÿ€zUpbitTrader._calc_allocationsÚKRWÚcurrencyc                 Ã   sD   �| j r|dkr| jS | j |d¡S | jsdS t | jj|¡I d H S )Nr§  r.   r   )r}  r~  r  r:   rg  ÚasyncioÚ	to_threadÚget_balance)r€  r¨  rB   rB   rC   r«  ƒ  s   €zUpbitTrader.get_balancec                 Ã   s¤   �| j rCdt| jƒdddœg}| j ¡ D ],\}}|dkr@| j d|› �¡}|r0| d¡r0|d nd}| |t|ƒdt|ƒdœ¡ q|S | jsHg S t	 
| jj¡I d H S )Nr§  Ú0)r¨  ÚbalanceÚlockedÚavg_buy_pricer   úKRW-r5   )r}  Ústrr~  r  Úitemsr+   r:   rÌ   rg  r©  rª  Úget_balances)r€  Úbalancesr3   Úvolr?   ÚavgrB   rB   rC   r³  Œ  s"   €
ÿÿ€zUpbitTrader.get_balancesc                 Ã   s$   �| j d u s
| j jrt ¡ | _ | j S re   )rp  ÚclosedÚaiohttpÚClientSessionr„  rB   rB   rC   Ú_ensure_session�  s   €
zUpbitTrader._ensure_sessionr‹   c           
   
   Ã   s  �|si S |   ¡ I dH }i }d}tdt|ƒ|ƒD ]g}|||| … }zC|jddd |¡id�4 I dH š&}|jdkrO| ¡ I dH }|D ]}	|	 d	d¡||	d
 < qBW d  ƒI dH  n1 I dH s_w   Y  W n	 tyn   Y qw || t|ƒk rt 	d¡I dH  q|S )u   24ì‹œê°„ ê±°ëž˜ëŒ€ê¸ˆ ì¡°íšŒNr  r   úhttps://api.upbit.com/v1/tickerÚmarketsú,©Úparamsr   Úacc_trade_price_24hÚmarketgš™™™™™¹?)
rº  Úranger„   r:   Újoinr/   ÚjsonÚ	Exceptionr©  Úsleep)
r€  r‹   r*   rŒ   Ú
chunk_sizer¤  ÚchunkÚrespÚdataÚitemrB   rB   rC   Ú_get_volume_ranking¢  s8   €þ
€(ù€ÿ€zUpbitTrader._get_volume_rankingc              	   Ã   sÒ   �|si S |   ¡ I dH }i }zP|jddd |¡id�4 I dH š2}|jdkr9| ¡ I dH }|D ]}|d ||d < q.W d  ƒI dH  W |S W d  ƒI dH  W |S 1 I dH sWw   Y  W |S  tyh   Y |S w )	u   í˜„ìž¬ê°€ ì�¼ê´„ ì¡°íšŒNr»  r¼  r½  r¾  r   r©   rÁ  )rº  r:   rÃ  r/   rÄ  rÅ  )r€  r‹   r*   ÚpricesrÉ  rÊ  rË  rB   rB   rC   Ú_fetch_current_pricesº  s6   €þ
ýü
üú
ö
þþz!UpbitTrader._fetch_current_pricesr�   Nc              
   Ã   sv  �|   ¡ I dH }z‘|jd|ddœd�4 I dH š$}|jdkr*	 W d  ƒI dH  W dS | ¡ I dH }W d  ƒI dH  n1 I dH sAw   Y  |sKW dS t d¡I dH  |jd|td	œd�4 I dH š$}|jdkrt	 W d  ƒI dH  W dS | ¡ I dH }W d  ƒI dH  n1 I dH s‹w   Y  t d¡I dH  W n ty³ } zt 	d
||¡ W Y d}~dS d}~ww t
|d |ƒS )uJ   ê³µê°œ Upbit APIë¡œ ìµœê·¼ ì²´ê²°ê³¼ ìƒ�ìœ„ í˜¸ê°€ ìˆ˜ê¸‰ì�„ ì¡°íšŒí•œë‹¤.Nz"https://api.upbit.com/v1/orderbookrG  )r¼  Úcountr¾  r   ç¸…ëQ¸¾?z%https://api.upbit.com/v1/trades/ticks)rÁ  rÏ  z!Order flow lookup failed [%s]: %sr   )rº  r:   r/   rÄ  r©  rÆ  ÚORDER_FLOW_TRADE_COUNTrÅ  ÚloggerÚdebugrâ   )r€  r�   r*   ÚresponseÚ
orderbooksr˜   ÚexcrB   rB   rC   Ú_get_order_flowÍ  sB   €þ
û(úþ
û(ú€þzUpbitTrader._get_order_flowc                 C   s   d| _ d| _dS )uV   ë‹¤ì�Œ ìž�ë�™ë§¤ë§¤ ì£¼ê¸°ì—�ì„œ ìº”ë“¤ ê²Œì�´íŠ¸ë¥¼ ê±´ë„ˆë›°ê³  ë‹¤ì‹œ ìŠ¤ìº”í•œë‹¤.r   N)rk  rt  r„  rB   rB   rC   Úrequest_immediate_rescanì  s   
z$UpbitTrader.request_immediate_rescanc           
      ƒ   sÔ   �dt fdd„‰ i }d}tdt|ƒtƒD ];}|||t … }tj‡ fdd„|D ƒŽ I dH }|D ]\}}}	|||< |	r>|d7 }q/|t t|ƒk rOt t¡I dH  q|| _t 	¡  
¡ | _t ¡ | _t d	t|ƒ|¡ |S )
uR   ì „ì²´ KRW ì¢…ëª©ì�˜ ì�¼ë´‰ ì¶”ì„¸ì™€ ATRì�„ ì œí•œ ì†�ë�„ ë‚´ì—�ì„œ ê°±ì‹ í•œë‹¤.r�   c              
   Ó   s¶   �z;t jtj| dtd�I d H }t|dd�}|d u st|ƒtk r%| d dfW S | t¡}t	|ƒ\}}t
|ƒ}| ||dœdfW S  tyZ } zt d| |¡ | d dfW  Y d }~S d }~ww )	NÚday©ÚintervalrÏ  é   ©rã   F)ÚtrendÚdaily_atr_pctz#Daily screen lookup failed [%s]: %sT)r©  rª  re  Ú	get_ohlcvÚDAILY_FETCH_COUNTrï   r„   ÚDAILY_TREND_BARSÚtailr  rŠ   rÅ  rÒ  rÓ  )r�   rÿ   Údaily_windowrÞ  r¬   rß  rÖ  rB   rB   rC   Ú	fetch_one÷  s6   €üÿ
þý€þz:UpbitTrader._refresh_daily_screen_cache.<locals>.fetch_oner   c                 3   s   � | ]}ˆ |ƒV  qd S re   rB   ©rŸ   r�   ©rå  rB   rC   r¡     r¸   z:UpbitTrader._refresh_daily_screen_cache.<locals>.<genexpr>Nr6   z2Daily market cache refreshed: markets=%d errors=%d)r±  rÂ  r„   ÚDAILY_SCREEN_BATCH_SIZEr©  ÚgatherrÆ  Ú DAILY_SCREEN_BATCH_DELAY_SECONDSrx  Úget_event_loopÚtimery  r   rè   rz  rÒ  Úinfo)
r€  r‹   ÚcacheÚerrorsÚstartÚbatchÚresultsr�   ÚresultÚfailedrB   rç  rC   Ú_refresh_daily_screen_cacheñ  s0   €€€
ýz'UpbitTrader._refresh_daily_screen_cachec                 ƒ   sb   �t  ¡  ¡ }|ˆ j }t‡ fdd„|D ƒƒ}ˆ j p |tkp |}|s%dS ˆ  |¡I d H }d|fS )Nc                 3   s   � | ]}|ˆ j vV  qd S re   )rx  ræ  r„  rB   rC   r¡   ,  s   € 

ÿz9UpbitTrader._ensure_daily_screen_cache.<locals>.<genexpr>)Fr   T)r©  rë  rì  ry  Úanyrx  ÚDAILY_SCREEN_CACHE_SECONDSrõ  )r€  r‹   rè   Ú	cache_ageÚmissing_tickersÚshould_refreshrï  rB   r„  rC   Ú_ensure_daily_screen_cache&  s   €
ÿÿýz&UpbitTrader._ensure_daily_screen_cachec                 Ã   st   �z.t jtjddtd�I dH }t|dd�}|du st|ƒdk r"W dS t| t	¡ƒ\}}||fW S  t
y9   Y dS w )	uB   BTC ì�¼ë´‰ ì¶”ì„¸. í•˜ë�½ ì‹œ ì �ìˆ˜ ê°�ì �, ìƒ�ìŠ¹ ì‹œ ë³´ë„ˆìŠ¤.r   rÙ  rÚ  NrÜ  rÝ  r  r   )r©  rª  re  rà  rá  rï   r„   r  rã  râ  rÅ  )r€  Údf_btcrÞ  ÚbonusrB   rB   rC   Ú_check_btc_trend9  s   €
ÿ
ÿzUpbitTrader._check_btc_trendc                 ƒ   sô  �t jtjdd�I d H }|sg S ˆ  |¡I d H \}}ˆ j d¡}|r'|d }n	ˆ  ¡ I d H \}}|ˆ _‡ fdd„|D ƒ}ˆ  	|¡I d H }t
||ƒ}	g }
g }tt|ƒt|	ƒt|ƒ|d�}|	D �]a}�z<ˆ j |¡}|rz|t ¡ krz|d  d	7  < W q]t|ƒ}ˆ j |¡}|d u r’|d
  d	7  < W q]|d }t|||ƒ}|d u r­|d|› �  d	7  < W q]|d }|d u sÁ||d k sÁ||d krË|d  d	7  < W q]t jtj|ddd�I d H }t|dd�}t  d¡I d H  |d u sðt|ƒtk rú|d  d	7  < W q]| | dd¡¡ t||ƒ}|�r_ˆ  |¡I d H }|d u �r"|d  d	7  < W q]|d �r1|d  d	7  < W q]|d  |7  < |d  |d 7  < |d  |d ¡ ||d< ||d< t|dƒ|d< ||d < |�rˆ|d |d! k�rˆ|d"  d	7  < |
 || dd¡| |d#¡|d$œ|¥¡ n|�r”|d%  d	7  < n|d&  d	7  < W q] t�y¿ } z|d'  d	7  < t d(||¡ W Y d }~q]d }~ww |
j d)d*„ d+d,� t|
ƒ|d"< t ¡ ˆ _!t"t#| $¡ ƒƒˆ _%|ˆ _&|
�sïd-t|	ƒ› d.|› d/�ˆ _'t (d0||ˆ j%¡ |
S )1Nr§  )Úfiatr   rÞ  c                    s   g | ]	}|ˆ j vr|‘qS rB   r”  )rŸ   Útr„  rB   rC   r®   T  s    z+UpbitTrader.scan_market.<locals>.<listcomp>)ÚuniverseÚscannedÚdaily_cache_refreshedÚdaily_cache_errorsÚcooldownr6   Ú
daily_dataÚtrend_rß  r   r    Ú	daily_atrÚminute15rH   rÚ  rG  rÝ  rÐ  Úsignal_datar°  rF  Úorder_flow_datar¿   Úorder_flow_blockedr¾   rÅ   r  rd   Ú
order_flowr   r�  r   )r�   r3   Úvol_24hrm   Úentry_scoreÚsignal_filterrï  zScan skipped [%s]: %sc                 S   s   | d | d fS )Nr¾   r  rB   )ÚxrB   rB   rC   r‘   ª  s    z)UpbitTrader.scan_market.<locals>.<lambda>Tr’   u   KRW ì „ì²´ u!   ì¢…ëª© ìŠ¤ìº” | ì‹œìž¥ê¸°ì¤€ BTC u    | ìƒ�ëŒ€ê°•ë�„ ì‹ í˜¸ ëŒ€ê¸°z9Market scan completed: market_btc=%s analyzed=%s stats=%s))r©  rª  re  Úget_tickersrû  rx  r:   rþ  rs  rÌ  r–   r   r„   rN  r|  r   rè   r  r  rà  rï   rÆ  r+  rÌ   rq   r@  r×  ÚextendrÐ   rÅ  rÒ  rÓ  Úsortru  Údictr•   r²  rv  rw  rr  rí  )r€  r‹   Úcache_refreshedÚcache_errorsÚ	btc_dailyr  r¬   r�  rŒ   Úmarket_tickersr�  Úanalyzed_coinsÚ
scan_statsr�   Úcooldown_untilr  Údaily_screenrÞ  Útrend_adjustmentrß  rm   ró  r  rÖ  rB   r„  rC   Úscan_marketG  sÖ   €

ü
ÿ
ÿ




üû€€ý
ÿÿüzUpbitTrader.scan_marketc                 ƒ   sš  �ˆ j sd S t ¡  ¡ }tdƒ}ˆ j|k�rŠ|ˆ _|ˆ _�zQˆ  ¡ I d H ˆ _ˆ j	r-ˆ j
}nˆ  d¡I d H }t|ˆ jƒ}ˆ  ˆ j|¡ˆ _tdd„ ˆ j ¡ D ƒƒ}ˆ j| }ˆ j�rmˆ jd d… }ˆ jdkrjdˆ j› �nd}	d	tˆ jƒ› d
ˆ j› |	› d�g}
t|dƒD ]­\}}ˆ j |d ¡}|r–d|d›d�nd}|
 d g |› ‘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&d¡d'›‘d(‘|d) d* d+›‘d,‘|d) d- d+›‘d.‘|d) d/ d+›‘d0‘|d) d1 d'›‘d2‘| d3d ¡› ‘d4‘d5 |d6 ¡› ‘¡¡ q�ˆ j�rN‡ fd7d„ˆ jD ƒ}|
 d8t|ƒ› d9d5 |¡› �¡ n|dk�r^|
 d:|d›d;�¡ n|
 d<¡ |d |
¡ƒI d H  W n t�y‰ } zt d=|› �¡ W Y d }~nd }~ww ˆ j�rW|ˆ j ˆ jk�rW|ˆ _z¡d>t  ¡  !d?¡› d�g}
d}ˆ j ¡ D ]_}|d@ dAk�r|dB �rt "t#j$|d ¡I d H }|�r||dB  |dB  dC }||dB  |dD  }||7 }|
 dE|d › dF|dG›dH|dI›dJ|dB d›dK|d›dL|d" › dM|d$ › dN�¡ �q®|
 dO|dI›d�¡ |
 dPˆ j%dI›d�¡ |
 dQˆ j%| dI›d�¡ |d |
¡ƒI d H  W n t�yV } zt dR|› �¡ W Y d }~nd }~ww ˆ j&|k}|�rb|ˆ _&t'ˆ j (¡ ƒD ]Ÿ\‰}|d@ dAk�rv�qi|�s{�qizetj"t#j)ˆdSdCdT�I d H }t*|ddU�}|d u �s›t|ƒt+k �ržW �qit,||dB |d" |d$ | dV¡t-| dV¡ƒ�rÉt.t/t  ¡ t-| dV¡ƒ  0¡ dW ƒdƒnd t1ˆƒdX�\}}|�rßˆ  2|||¡I d H  W n t�yþ } zt dYˆ› dZ|› �¡ W Y d }~nd }~ww t 3d[¡I d H  �qiˆ j�rIt'ˆ j (¡ ƒD ]6\‰}ˆˆ jv�rGt4‡fd\d]„ˆ jD ƒd ƒ}|�rGˆ  5|||¡I d H  ˆ j 6ˆd ¡ t 3d^¡I d H  �qd S d S )_NrG  r§  c                 S   r’  r“  rB   r‹  rB   rB   rC   r®   Ò  s    z-UpbitTrader.execute_cycle.<locals>.<listcomp>r   r  u    | ì‹œìž¥BTC:rF  u   [ë§ˆì¼“ ìŠ¤ìº”] u   ê°œ í›„ë³´ | ì „ëžµ: Ú
r6   r�   ú -> ú,.0fõ   ì›�z. r3   ú | r  u   
   ì �ìˆ˜: r¾   u   ì � | RSI: r  r'  u    | ê±°ëž˜ëŒ€ê¸ˆ: r  r   i áõu   ì–µ
   ì „ëžµ: r  Ú?u    | ëª©í‘œ +r  u   % / ì†�ì ˆ -r  u   % | ì�¼ë´‰ATR rß  r½   u   %
   ìˆ˜ê¸‰: í˜¸ê°€ë§¤ìˆ˜ r  rÀ   rº   u    | ì²´ê²°ë§¤ìˆ˜ rÁ   u    | ëŒ€ëŸ‰ë§¤ìˆ˜ rÂ   u    | ìŠ¤í”„ë ˆë“œ rÃ   u   bp
   ì¶”ì„¸: rÞ  u    | ì‹ í˜¸: ú, rÅ   c                    s:   g | ]}|d  ˆ j v r|d › dˆ j |d   d›d�‘qS )r�   r3   ú(r"  õ   ì›�))rq  r•  r„  rB   rC   r®   ê  s    ÿu   
â†’ ë§¤ìˆ˜ ì˜ˆì • (u	   ì¢…ëª©): u   
â†’ ìž”ê³  ë¶€ì¡± (ê°€ìš©: r(  u%   
â†’ ìŠ¬ë¡¯ ì—†ì�Œ, ë§¤ë�„ ëŒ€ê¸° ì¤‘zScan error: u   [í�¬ì§€ì…˜ ë¦¬í�¬íŠ¸] z%H:%Mr/   r1   r5   rH   r4   ú  ú: rH  ú% (ú+,.0fu	   ì›�)
    u    â†’ u   ì›�
    ëª©í‘œ: +õ   % | ì†�ì ˆ: -ú%õ   
ë¯¸ì‹¤í˜„: õ   ì‹¤í˜„: õ   ì´�ì†�ì�µ: zReport error: r	  rÚ  rÝ  rD  i„  )rD  rE  r  zSell check [ú]: rÐ  c                 3   s    � | ]}|d  ˆ kr|V  qdS )r�   NrB   r•  rŽ   rB   rC   r¡   0  r¹   z,UpbitTrader.execute_cycle.<locals>.<genexpr>ç      à?)7rh  r©  rë  rì  rõ   rt  rk  r  rm  r}  r~  r«  rp   r�  r¦  rq  r„   r+   r�  r‰  rs  rr  r›  r:   rÌ   rÃ  rÅ  rÒ  Úerrorrl  rn  r   rè   r÷   rª  re  Úget_current_pricer9   r{  Úlistr²  rà  rï   r+  r]  rþ   r<   rN  rM  r  Ú_sellrÆ  ÚnextÚ_buyÚpop)r€  Úsend_fnrè   Úsignal_candleÚkrwÚbudget_limitr1   ÚslotsÚtopÚ	btc_labelÚlinesr¤  r–  ÚallocÚ	alloc_strÚbuy_listÚeÚtotal_unrealizedr?   rˆ   ÚrateÚpnlÚdo_sell_checkrm   Úshould_sellÚreasonr¥  ÚcandrB   ©r€  r�   rC   Úexecute_cycle¾  s&  €

ÿþ 8ÿÿÿ
þþþþýüûú
ùùÿ

ÿ"

€€ÿÿÿþþÿ€€ÿ

ÿý þ
ù	€"€ÿ€ùzUpbitTrader.execute_cyclerM  r¥  c                 Ã   sä  �|d }|d }|d u r| j }| j d }t||| jƒ}|| jk r#d S |  d¡I d H }||k r1d S ||dd d d |d |d | d¡| d	¡d
œ
| j|< | jrþ|d }|| j }	||	 }
|
| }|  j	|8  _	| j
 |d¡| | j
|< | j|  d||tƒ dœ¡ |  jd7  _t| ƒI d H  t| j| ƒI d H  |d|d d   }|d|d d   }t| d¡|› d�|d�}|d|› d| j› d|d›d|d›d|d›d|d › d|d›d|d › d| d	d¡› dd  |d! ¡› d"t| jƒ› d#| j› �|d$�I d H  d S t | jj||¡I d H }|�rËt|tƒ�rËd%|v�rËt d&¡I d H  |  |¡I d H }t | jj|¡I d H }| j|  d|�p?|d |tƒ dœ¡ |  jd7  _t| ƒI d H  t| j| ƒI d H  |�pd|d }|d|d d   }|d|d d   }t| d¡|› d'�|d�}|d(|› d| j› d|d›d|d›d|d›d|d › d|d›d|d › d| d	d¡› dd  |d! ¡› d"t| jƒ› d#| j› �|d$�I d H  d S | j|= t|tƒ�rá| d%i ¡ d)t|ƒ¡nt|ƒ}t d*|› d+|› �¡ d S ),Nr�   r3   rK  r§  r2   r  r  r  r  )
r3   r�   r/   r5   r4   rD  r  r  r  r  r  r   r1   )r/   r5   r4   rD  r6   rH   rm   z Buy (PAPER))Útitler5   u   [ê°€ìƒ� ë§¤ìˆ˜] z (#u;   )
â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�
ë§¤ìˆ˜ê°€: r"  u   ì›�
íˆ¬ìž�ê¸ˆ: u=   ì›�
â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�
ëª©í‘œê°€: u   ì›� (+u   %)
ì†�ì ˆê°€: u   ì›� (-u9   %)
â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�
ì „ëžµ: r%  u   
ë§¤ìˆ˜ ê·¼ê±°: r&  rÅ   u   
í�¬ì§€ì…˜: ú/©Úphotor4  r3  z Buyu   [ë§¤ìˆ˜ ì²´ê²°] ÚmessagezBuy failed [r2  )rŠ  rp   r�  r†  r«  r:   r+   r}  ÚFEE_RATEr~  r  Úupdaterù   ri  r   r   r   rÃ  r„   r‰  r©  rª  rg  Úbuy_market_orderÚ
isinstancer  rÆ  Úget_avg_buy_pricer±  rÒ  r4  )r€  rM  r;  r¥  r�   r3   Úmax_per_coinr=  r5   ÚfeeÚactual_amountr@   Útarget_priceÚ
stop_priceÚchartró  Ú	avg_priceÚerrrB   rB   rC   r9  6  sä   €

ú	

üþþýûûúú
ø	÷
ö
öô
üþþýûûúú
ø	÷
ö
öô,zUpbitTrader._buyr?   rL  c                 ƒ   s"  �|d ‰|d }d|d< ˆ j �r/ˆ j |d¡}|dkr"ˆ jˆ= d S t tjˆ¡I d H }|s4d|d< d S ||d  |d  d }||d  | }|d | ˆ j }	|| ˆ j }
||	 |
 }ˆ  j	|| |
 7  _	ˆ j 
|d ¡ ˆ  j|7  _tˆ|ƒ}t ¡ td	| d
� ˆ jˆ< ˆ jˆ= tˆ ƒI d H  tˆƒI d H  ‡ ‡fdd„ˆ jD ƒ}|rÁtˆ j	ˆ jƒ}ˆ  ||¡ˆ _dtˆ jƒ› d�}nˆ  ¡  d}ztjtjˆddd�I d H }t||› d�| d¡|d�}W n tyï   d }Y nw |dkrödnd}|d|› d|› d|› d|d d›d|d›d|d›d|d›d ˆ jd›d!ˆ j	d›d"ˆ j› d#|› �|d$�I d H  d S ˆ  |¡I d H }|dk�rMˆ jˆ= |d%|› d&�ƒI d H  d S |}t tjˆ¡I d H }t ˆ jj ˆ|¡I d H }|�rÀt!|t"ƒ�rÀd'|v�rÀt #d(¡I d H  ˆ  |¡I d H }|dk�r¹||d) k�r¹t ˆ jj ˆ|¡I d H }|�r¹t!|t"ƒ�r¹d'|v�r¹t #d*¡I d H  ˆ  |¡I d H }d+}d+}|�rï|d �rï||d  |d  d }||d  | }|d | ˆ j }	|| ˆ j }
||	 |
 }ˆ  j|7  _tˆ|ƒ}t ¡ td	| d
� ˆ jˆ< ˆ jˆ= tˆ ƒI d H  tˆƒI d H  ‡ ‡fd,d„ˆ jD ƒ}|�rHˆ  d-¡I d H }t|ˆ jƒ}ˆ  ||¡ˆ _dtˆ jƒ› d�}nˆ  ¡  d}ztjtjˆddd�I d H }t||› d.�| d¡|d�}W n t�yw   d }Y nw ||d) k�r�d/nd0}|dk�rŠdnd}|d1|› d|› |› d|› d|d d›d|d›d|d›d|d›d ˆ jd›d"ˆ j› d#|› �|d$�I d H  d S d|d< | d2d¡d3 |d2< t!|t"ƒ�rà| d'i ¡ d4t$|ƒ¡nt$|ƒ}t% &d5|› d6|d2 › d7|› �¡ |d2 d8k�r|d9|› d|› d:�ƒI d H  d|d2< d S d S );Nr�   r3   Úsellingr/   r   r1   r5   rH   rG  ræ   c                    ó*   g | ]}|d  ˆkr|d  ˆ j vr|‘qS rŽ   r”  r•  rN  rB   rC   r®   Î  ó
    ÿz%UpbitTrader._sell.<locals>.<listcomp>u   -> ì¦‰ì‹œ ìž¬íˆ¬ìž� u   ì¢…ëª© ë°°ë¶„u1   -> ë‹¤ì�Œ ìž�ë�™ë§¤ë§¤ ì£¼ê¸°ì—� ì¦‰ì‹œ ë¦¬ìŠ¤ìº”r	  rÚ  z Sell (PAPER))rP  r5   Ú
sell_priceu   ì�µì ˆu   ì†�ì ˆu   [ê°€ìƒ� ë§¤ë�„] z - u>   
â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�
ë§¤ë�„ ì‚¬ìœ : u   
ë§¤ìˆ˜ê°€: r"  u   ì›� -> ë§¤ë�„ê°€: u   ì›�
ìˆ˜ì�µë¥ : rH  u   %
ìˆ˜ì�µê¸ˆ: r,  uS   ì›� (ìˆ˜ìˆ˜ë£Œ ì°¨ê°�)
â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�
ëˆ„ì �ìˆ˜ì�µ: u   ì›�
ê°€ìƒ�ìž”ê³ : u   ì›�
ì´�ê±°ëž˜: u   íšŒ
rR  u   [ë§¤ë�„ ìŠ¤í‚µ] u#    - ìž”ê³  ì—†ì�Œ (ì�´ë¯¸ ì²´ê²°ë�¨)r4  r3  g{®Gáz„?rL  r.   c                    rc  rŽ   r”  r•  rN  rB   rC   r®      rd  r§  z Sellu    (ì�¼ë¶€ ë¯¸ì²´ê²°)rF  u   [ë§¤ë�„ ì²´ê²°] Ú_sell_retryr6   rT  zSell failed [z	] (retry z): rl   u   [ë§¤ë�„ ì‹¤íŒ¨] u   
ìˆ˜ë�™ í™•ì�¸ í•„ìš”)'r}  r  r:   r+   r©  rª  re  r5  rU  r~  r:  r9   r_  r   rè   r   r|  r   r   rm  rp   r�  r¦  rq  r„   rØ  rà  r   rÅ  ri  r«  rg  Úsell_market_orderrX  r  rÆ  r±  rÒ  r4  )r€  r?   rL  r;  r3   Úsell_volumeÚ	cur_pricerO  ÚgrossÚbuy_feeÚsell_feer^  Úcooldown_barsÚremaining_candsr>  Únext_actionÚchart_dfr_  Úresult_emojiÚactual_balanceró  r£  ÚretryÚnew_krwr/   ra  rB   rN  rC   r7  ­  s.  €
ÿ
ÿ


þÿþýýüûùø	÷
öô

ÿ
ÿ


þÿþýýüûùø	÷
õ, þzUpbitTrader._sellr3   c                 Ã   s2  �d|  ¡ › �}| j |¡}|sd|› d�fS |d dkr)d|› d|d › d�fS | jr˜| j |  ¡ d¡}t tj|¡I d H }d	}|rt|d
 rt|dkrt||d
  | }|d
 | | j	 }|| | j	 }	|| |	 }|  j
|| |	 7  _
| j |  ¡ d ¡ |  j|7  _| j|= d}
d|
› d|› d|d›d�fS |  |  ¡ ¡I d H }|dkr±| j|= d|› d�fS t tj|¡I d H }t | jj||¡I d H }|�rt|tƒ�rd|v�rd	}|rû|d
 rû||d
  | }|d
 | | j	 }|| | j	 }	|| |	 }|  j|7  _| j|= dd|› d|d›d�fS dd|› �fS )Nr°  Fu    ë³´ìœ  í�¬ì§€ì…˜ ì—†ì�Œr/   r1   ú u    ìƒ�íƒœr   r.   r5   u   [ê°€ìƒ� ìˆ˜ë�™ë§¤ë�„]Tu   
ìˆ˜ì�µê¸ˆ: r,  u   ì›� (ìˆ˜ìˆ˜ë£Œ ì°¨ê°�)u!    ìž”ê³  ì—†ì�Œ (ì�´ë¯¸ ë§¤ë�„ë�¨)r4  u   [ìˆ˜ë�™ë§¤ë�„] u   ë§¤ë�„ ì‹¤íŒ¨: )Úupperr+   r:   r}  r  r©  rª  re  r5  rU  r~  r:  r9   r«  rg  rg  rX  r  )r€  r3   r�   r?   rµ  rˆ   r^  rj  rk  rl  r   rr  ró  rB   rB   rC   Ú
force_sellT  sN   €zUpbitTrader.force_sellc                 Ã   s\   �g }t | j ¡ ƒD ]!}|d dkr+|  |d ¡I d H \}}| |¡ t d¡I d H  q
|S )Nr/   r1   r3   rL  )r6  r+   r�  rw  rÌ   r©  rÆ  )r€  rò  r?   r¬   ÚmsgrB   rB   rC   Úforce_sell_all€  s   €
€zUpbitTrader.force_sell_allc                 Ã   sÖ  �dd„ | j  ¡ D ƒ}|sdS dd„ |D ƒ}|  |¡I dH }t ¡  d¡}| jr*dn| jr/dnd}d	|› |› �dg}d
}d
}|D ]z}	| |	d ¡}
|
rº|	d rº|	d rº|
|	d  |	d  d }|
|	d  |	d  }|	d |	d  }||7 }||
|	d  7 }|	 d¡p‰t	|	d ƒd }|d
kr�dn|d
k r–dnd}| 
d|› d|	d › d|d›d|d›d|	d d›d|
d›d|› �¡ q@|| }| 
d¡ | 
d|d›d �¡ | 
d!| jd›d �¡ | 
d"| j| d›d �¡ d# |¡S )$u,   1ì´ˆ ì£¼ê¸° ì‹¤ì‹œê°„ ëª¨ë‹ˆí„°ë§� í…�ìŠ¤íŠ¸c                 S   s$   g | ]}|d  dkr|d r|‘qS )r/   r1   r5   rB   r‹  rB   rB   rC   r®   ‹  s    ÿz0UpbitTrader.get_monitor_text.<locals>.<listcomp>Nc                 S   s   g | ]}|d  ‘qS rŽ   rB   r‹  rB   rB   rC   r®   �  r¯   z%H:%M:%Sõ	    [ê°€ìƒ�]õ	    [ë³µë¦¬]rF  u   [ì‹¤ì‹œê°„ í˜„í™©] r   r�   r5   r4   rH   r  r   ú+ú-ú=z  [z] r3   r*  rH  r+  r,  u   ì›�)
      r"  r!  r$  u   ë¯¸ì‹¤í˜„: r#  r0  r1  r   )r+   r�  rÎ  r   rè   r÷   r}  ro  r:   r  rÌ   r9   rÃ  )r€  r1   r‹   rÍ  rè   ÚmoderB  Útotal_investedÚtotal_valuer?   rˆ   rH  rI  rŽ  r  ÚarrowrG  rB   rB   rC   Úget_monitor_text‰  sJ   €"ÿÿÿÿ€

zUpbitTrader.get_monitor_textc                 ƒ   s(  �| j sdS | jrdn| jrdnd}| jr"| jdkr"d| jd›d�nd}d	|› �d
| j› �d| jd›d|› �d| jp;d› dt| j	ƒ› d�d| jd›d�d| j
› d�dt| j	ƒ› d| j› �dg}| jrÐ| j‰ t‡ fdd„dD ƒƒ}| d| j d¡› d| j› �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¡ | jrË| d,d- | j¡ ¡ | d.¡ | jd u rÛ| d/¡ n#t ¡ }d0|jd0  }|t|d1� jddd2�}| d3| d4¡› d5�¡ | d¡ | j	�r§| d6¡ | j	 ¡ D ]•}|d7 d8k�r–|d9 �r–z`t tj |d: ¡I d H }	|	�r}|	|d9  |d9  d; }
|	|d9  |d<  }| d=¡�pRt!|d: ƒd> }| d?|d@ › dA|
dB›dC|d›dD|d9 d›dE|	d›dF|› dG|dH › dI|dJ › dK�¡ W �q t"�y•   | d?|d@ › dL�¡ Y �qw | d?|d@ › dA|d7 › �¡ �qd}| j	 ¡ D ]9}|d7 d8k�ræ|d9 �ræzt tj |d: ¡I d H }	|	�rØ||	|d9  |d<  7 }W �q® t"�yå   Y �q®w �q®| dM|d›d�¡ | dN| j| d›d�¡ | j#�r| dOt| j#ƒ› dP�¡ dQ |¡S )RNuC   ìž�ë�™ë§¤ë§¤ ë¹„í™œì„± ìƒ�íƒœ
/auto_start <íˆ¬ìž�ê¸ˆ> ìœ¼ë¡œ ì‹œìž‘rz  r{  rF  r   u
    (ì´ˆê¸°: r"  r(  u   [ìž�ë�™ë§¤ë§¤ í˜„í™©]u   ì‹œìž‘: u   íˆ¬ìž�ê¸ˆ: r#  u   ì „ëžµ: u   ìŠ¤ìº” ëŒ€ê¸°u    | ë³´ìœ : u   ì¢…ëª©u   ëˆ„ì �ìˆ˜ì�µ: r,  u   ì´�ê±°ëž˜: u   íšŒu   í�¬ì§€ì…˜: rQ  c                 3   s   � | ]	}ˆ   |d ¡V  qdS )r   Nr�   )rŸ   r“   ©ÚstatsrB   rC   r¡   Å  s
   € 
ÿ
ÿz.UpbitTrader.get_status_text.<locals>.<genexpr>)Ú
trend_downÚtrend_neutralÚtrend_upu   ìµœê·¼ ìŠ¤ìº”: z%m-%d %H:%M:%Su    | ì‹œìž¥ê¸°ì¤€ BTC u   ìŠ¤ìº” ê²°ê³¼: í›„ë³´ r�  z / r  u   í•„í„° íƒˆë�½: ì¶”ì„¸/ì‹œìž¥ u    | ë�°ì�´í„° r  r
  u    | ì�¼ë´‰ATR r  u    | 15ë¶„ì‹ í˜¸ r  u
    | ìˆ˜ê¸‰ r  r  u   15ë¶„ ë¶„ì„� ì¢…ëª©: r&  uF   BTCëŠ” ì‹œìž¥ ìœ„í—˜ ê¸°ì¤€ì�´ë©° ì•ŒíŠ¸ì½”ì�¸ì�€ ê°�ê°� ë�…ë¦½ ë¶„ì„�u#   ë‹¤ì�Œ ìŠ¤ìº”: ì¦‰ì‹œ ì‹¤í–‰ ëŒ€ê¸°rG  ræ   )rñ   rò   u   ë‹¤ì�Œ ìŠ¤ìº”: r(   u    ì „í›„u   [ë³´ìœ  í�¬ì§€ì…˜]r/   r1   r5   r�   rH   r4   r  r   r)  r3   r*  rH  r+  u   ì›�)
    ë§¤ìˆ˜: u    â†’ í˜„ìž¬: u   
    ì „ëžµ: u   
    ëª©í‘œ: +r  r-  r  r.  u   : ì¡°íšŒ ì¤‘...r/  r1  u   
ëŒ€ê¸° í›„ë³´: u   ê°œr   )$rh  r}  ro  r9   r8   rj  r‡  rr  r„   r+   ri  r‰  ru  rv  rÈ   r  r÷   rs  r:   rw  rÌ   rÃ  rt  r   rè   rð   r   rq   r�  r©  rª  re  r5  r  rÅ  rm  )r€  r  Úbudget_extrarB  Útrend_rejectedrè   Úminutes_to_nextÚ	next_scanr?   rˆ   rH  rI  r  Ú
unrealizedrB   r„  rC   Úget_status_text²  s¼   €$
øþ ÿ
þ
ýüüÿÿÿ
ÿ

ÿÿþýýÿ€ÿ"€ÿ€
zUpbitTrader.get_status_text)r§  )r-   Nre   )(Ú__name__Ú
__module__Ú__qualname__r†  rU  rƒ  Úboolr…  Úpropertyr;   r‡  rN  r‰  rŠ  r�  r6  r  r±  r¦  r«  r³  r¸  r¹  rº  rÌ  rÎ  r×  rØ  rõ  Útuplerû  rþ  r  rO  r9  r7  rw  ry  rƒ  rŽ  rB   rB   rB   rC   r`  í  sR    ("	F	
þ
ý5þ

ý
wxw (,	)r`  )r)   )rE   )rR   rS   rT   )rc   rd   )rE   rl   re   )NNr&   )Jrc  Úloggingr©  Úcollectionsr   re  Úpandasr}   Únumpyrr   r¸  r   r   Úpersistencer   r   r   Úchart_rendererr   Ú	getLoggerr�  rÒ  ÚENTRY_SCORE_THRESHOLDr+  ÚMIN_ATR_PCTÚMAX_ATR_PCTÚMAX_DAILY_ATR_PCTrâ  rá  r÷  rè  rê  rÑ  rÇ   rÆ   rÏ   r  r  rø   rü   r  r6  r;   r”  r±  rD   ÚSeriesrN  rQ   rb   ri   rj   Ú	DataFramer{   r‚   rŠ   r–   râ   rï   rõ   rù   rþ   r  r  r  r  r   r7  r?  r@  r’  r]  r_  r`  rB   rB   rB   rC   Ú<module>   s:   
	øøõýÿþý
ü#		ÿ
þ
ýÿ
þ
ýyýÿþý
üþÿþ
ýÿþý
üÿþýüûúùø	÷

öu"tùÿþýüûúù

øK