a
    Gc4                     @   s   d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlT d dlZd dlZd dlZd dlZd dlZd dlZd dlZG dd	 d	ZdS )
    )CryptoPlatformExchangeUserConnector)get_contract_size)is_fiatis_stable_coin)log)*Nc                   @   sP  e Zd ZdRddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdSd!d"Zd#d$ Zd%d& Zd'd( ZdTd*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdUd4d5ZdVd6d7ZdWd8d9Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)d S )XUserNewFc                 C   s^  || _ || _| jjdd| j  d| _| jd jd | _| jd jd | _| jd jd | _| jd jd d	kr| j| jd
 | jd jd k d jd | _n| jd jd | _| jd jd | _	|| _
| jjdd| j  d| _| jd j| _i i d| _i i d| _| j| jd dk d jD ]r}| j| jd |k| jd dk@  d jd | jd |< | j| jd |k| jd dk@  d jd | jd |< q"| j| jd dk d jD ]r}| j| jd |k| jd dk@  d jd | jd |< | j| jd |k| jd dk@  d jd | jd |< qt | _i i d| _i | _| jjdd| j  d| _d S )NusersWHERE id = arg	firstnamer   lastnameZlimit_margin_ratioZis_subaccount   idZpro_idemailtrade_thresholdcrypto_users_apisWHERE user_id = platform_id)mainnettestnettestingFapi_keyr   
api_secretTr   Zcrypto_payments)r   databasegetTableZ_UserNew__user_dfvaluesr   r   Zmargin_ratior   r   r   Z_UserNew__user_apis_dfZuser_apis_platformsapi_keysapi_secrets	threadingLockconnectors_mutex
connectorsbalancespayments)selfuser_idr   Zuse_testnetr    r+   ;/var/www/html/myfo-crypto/python/myfo/crypto/common/user.py__init__   s>    .6:6:
zUserNew.__init__c                 C   s2   d }| j rdnd}|| j| v r.| j| | }|S Nr   r   )r   r!   )r)   r   r   networkr+   r+   r,   get_api_keyF   s
    zUserNew.get_api_keyc                 C   s2   d }| j rdnd}|| j| v r.| j| | }|S r.   )r   r"   )r)   r   r   r/   r+   r+   r,   get_api_secretM   s
    zUserNew.get_api_secretc                 C   sH   t |}| jrdnd}|| j| v rD|| j| v rDt|jd urDdS dS )Nr   r   TF)intr   r!   r"   r   	connectorr)   r   r/   r+   r+   r,   is_api_platform_configuredT   s    z"UserNew.is_api_platform_configuredc                 C   s   t |}| j  zj| jrdnd}| |sBtd| d|  n"|| j| vrd| || j| |< | j| | W | j  S | j  0 d S )Nr   r   zAPI platform z not configured for user )	r2   r%   acquirer   r5   InvalidApiKeyErrorr&   _UserNew__create_connectorreleaser4   r+   r+   r,   get_api_connector\   s    


zUserNew.get_api_connectorc                 C   s   |  | S N)r:   is_ip_authorizedr)   r   r+   r+   r,   check_ip_authorizationi   s    zUserNew.check_ip_authorizationc                 C   sR   | j jdd| j d| j d}|d   }|D ]}| |s4|| q4|S )Nr   r   zB AND api_key IS NOT NULL AND api_secret IS NOT NULL AND testing = r   r   )r   r   r   r   uniquetolistr5   remove)r)   user_strategiesplatform_idsr   r+   r+   r,   get_platformsl   s    
zUserNew.get_platformsc                 C   s.   | j jdd| j dd jd }|r*dS dS )Nr   r   r   trade_ongoingr   TFr   r   r   r    )r)   rE   r+   r+   r,   is_trade_ongoingx   s    "zUserNew.is_trade_ongoingc                 C   s   |rP| j d| j d | j d| j d | j d| j d| j d n,| j d| j d | j d| j d d S )NDROP EVENT IF EXISTS user_Z_reset_trade_ongoingz/UPDATE users SET trade_ongoing = 1 WHERE  id = ;CREATE EVENT user_z_reset_trade_ongoing
                                    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 300 SECOND
                                    DO UPDATE users SET trade_ongoing = 0 WHERE id = z/UPDATE users SET trade_ongoing = 0 WHERE  id = r   executer   )r)   Zongoingr+   r+   r,   set_trade_ongoing~   s     zUserNew.set_trade_ongoingc                 C   s.   | j jdd| j dd jd }|r*dS dS )Nr   r   r   trade_lockedr   TFrF   )r)   rN   r+   r+   r,   is_trade_locked   s    "zUserNew.is_trade_lockedc                 C   s   |rP| j d| j d | j d| j d | j d| j d| j d n,| j d| j d | j d| j d d S )NrH   Z_reset_trade_lockedz.UPDATE users SET trade_locked = 1 WHERE  id = rI   rJ   z_reset_trade_locked
                                    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 24 HOUR
                                    DO UPDATE users SET trade_locked = 0 WHERE id = z.UPDATE users SET trade_locked = 0 WHERE  id = rK   )r)   lockedr+   r+   r,   set_trade_locked   s     zUserNew.set_trade_lockedc                 C   s   |  | | j| d S )Nbalance_UserNew__update_balancesr'   r=   r+   r+   r,   get_balance   s    
zUserNew.get_balancec                 C   s   |  | | j| d S )Navailable_balancerS   r=   r+   r+   r,   get_available_balance   s    
zUserNew.get_available_balancec                 C   s   |  | | j| d S )Nmax_investmentrS   r=   r+   r+   r,   get_investment   s    
zUserNew.get_investmentc                 C   s   |  | }|S r;   )r:   get_wallet_transactions)r)   r   Zaumr+   r+   r,   get_aum   s    zUserNew.get_aumNc                 C   sn   d }|t jkrF| jjdd| j d| d}|jsjd|d jd i}n$| || }sj| |	|}|S )Nr   r    AND platform_id = r   addresswallet_addressr   )
r   DELTA_EXCHANGEr   r   r   emptyr    r:   get_wallet_addresscreate_wallet_address)r)   r   currencyr]   	user_apisr+   r+   r,   ra      s    
zUserNew.get_wallet_addressc           	      C   sZ   t j  }t }tjd }t|t| j||||||||d	gg}| j	d| d S )Nr   )	r*   symbolsizeside
order_typer   caller
created_at
updated_atZlog_user_trades)
datetimenowpd	DataFramesysargvconcatr   r   append_to_table)	r)   r   re   rf   rg   rh   rm   Ztrade_valuesri   r+   r+   r,   	log_trade   s    


zUserNew.log_tradec                 C   s\   d}| j jdd| j d}|d  }| j| jd dk }|d  }||d krXd	S d
S )Nr   users_balancesr   r   total_balancepaymentZto_payg?FT)r   r   r   sumr(   )r)   rR   Zuser_balancesZunpaid_paymentsZpayment_sumr+   r+   r,   is_payment_uptodate   s    zUserNew.is_payment_uptodatec                 C   sP   d}| j jdd| j dtj d}t|dkrH|d jd rBdS dS ndS d S )	Nr   r   r   r\   r   Z
has_futureTF)r   r   r   r   BINANCElenr    )r)   rR   rd   r+   r+   r,   has_future_binance   s     zUserNew.has_future_binance   c                 C   s   | j jdd| j ddgd}|jr(dS ttj }|jt	|d | 
 g d jd }t|| d}||krzdS d	S d S )
Ncrypto_arbitragesz0WHERE accepted = 1 AND status = 0 AND user_id = r   rj   )r   columnsTr   mF)r   r   r   r`   np
datetime64rl   rm   locabsidxminr    timedelta64)r)   periodZongoing_arbitragesrm   Zlatestdiffr+   r+   r,   is_trade_period_expired   s    
&zUserNew.is_trade_period_expiredc                 C   s   d | j| j| j| jS )Nz{} - {} {} ({}))formatr   r   r   r   r)   r+   r+   r,   	to_string  s    zUserNew.to_stringc                 C   s   |  ||S r;   )r:   get_position)r)   r   
product_idr+   r+   r,   r     s    zUserNew.get_positionc                 C   s   |  | S r;   )r:   get_positionsr=   r+   r+   r,   r     s    zUserNew.get_positionsc                 C   s   |  ||S r;   )r:   get_active_orders)r)   r   re   r+   r+   r,   r     s    zUserNew.get_active_ordersc           '         s  d}dd |  D }	i }
|  D ]p\}}t|d }|d dkrFq"d}d}d}d}d}d}d}d}||d d	k|d
 |d k@  jdur||d d	k|d
 |d k@  d  | }||d d	k|d |d k@  jdur||d d	k|d |d k@  d  | }t|t| }t|d t|kr4q"||d d	k|d |d k@ |d dk@  jdur||d d	k|d |d k@ |d dk@  d  | }||d d	k|d |d k@ |d dk@  jdur||d d	k|d |d k@ |d dk@  d  | }||d |d k|d dk@  jdur\||d |d k|d dk@  d  }||d |d k|d dk@  jdur||d |d k|d dk@  d  }||d |d k|d dk@  jdur||d |d k|d dk@  d  }||d |d k|d dk@  jdurL||d |d k|d dk@  d  }d}||d d	k|d |d k@  jdurt||d d	k|d |d k@  d  | }||d |d k jdur||d dk |d |d k@  d   }nd}||d |d k jdur:||d dk|d |d k@  d  }nd}t|t| }t|t| t| t| }t|t| }t|d t|t| | krq"tt|d dt| krtt|d dt| krq"|d |
vr@i |
|d < |d dkrdnd|
|d  d< |d dkr.dnd|
|d  d< q"|
|d  d  |d dkrbdnd7  < |
|d  d  |d dkrdnd7  < q"|r|	  D ]l\} td|  fdd|  D }d}d} t d }|	| d }!||d d	k|d |k@  jdurD||d d	k|d |k@ |d dk@  d  }"nd}"||d d	k|d |k@  jdur||d d	k|d |k@ |d dk@  d  }#nd}#||d |k|d dk@  jdurt||d |k|d dk@  d  }nd}||d |k|d dk@  jdurBt||d |k|d dk@  d  }nd}||d |k jdur||d dk |d |k@  d   }nd}||d |k jdur||d dk|d |k@  d  }nd}||d |k|d dk@  jdurt||d |k|d dk@  d  }nd}||d |k|d dk@  jdurlt||d |k|d dk@  d  }nd}||d d	k|d |k@  jdurt||d d	k|d |k@  d  | }nd}|!|" |# | | | | | | | }!td| td| td|! | D ]}$||d d	k|d
 |$k@  jdu	rh||d d	k|d
 |$k@  d  | }nd}||d d	k|d |$k@  jdu	r||d d	k|d |$k@  d  | }nd}||d |$k jdu	r||d dk |d |$k@  d   }%nd}%||d |$k jdu
r@||d dk|d |$k@  d  }&nd}&td | td!| ||$ d d"k
r|||$ d | | |% |& 7 }||$ d d#k	rtd$||$ d  | ||$ d | | |% |& 7 } 	qtd%|  td&| td'|! | | krd(}n| |!krd(}q|S ))NTc                 S   s"   i | ]\}}|d  dkr||qS contract_typeperpetual_futurer+   .0keyvaluer+   r+   r,   
<dictcomp>      z)UserNew.check_hedging.<locals>.<dictcomp>base_asset_symbolr   spotr   option_buy_platform_id   option_buy_symbolre   rf   option_sell_platform_idoption_sell_symbolr   future_symbolrg   buysell
order_sidefuture_platform_id
ףp=
?{Gz?r   r   futuresoptionsc                    s2   i | ]*\}} d  |d  kr|d dkr||qS )r   r   r   r+   r   futurer+   r,   r   }  r   excluded_positions_buyexcluded_positions_sellZnew_future_sizebuy_cross_optionsFcall_option
put_optionz	size sell	puts_size
calls_sizefuture_sizeF)	itemsr   r`   rx   floatroundr   printkeys)'r)   ongoing_cross_optionsdirectionalsstakingsdelta_hedgesdelta_hedges_marginexcluded_positions	positionshedgedr   Zunderlying_symbolsre   positioncontract_sizesell_cross_optionsr   sell_directionnalsbuy_directonnalssell_delta_hedgesbuy_delta_hedgessell_delta_margin_hedgesbuy_delta_margin_hedgestotal_positionssell_stakingsr   r   total_positions_directionalsZtotal_positions_delta_hedgesZtotal_excludedr   r   r   r   r   Zbuy_directionalsZsell_directionalsZoption_symbolexcluded_positions_sell_optionexcluded_positions_buy_optionr+   r   r,   check_hedging  s    &,(,4848(((((((((0,* "<"$*,

$2$2$*$*(&$*$*$.(


$*$*(&

 $



zUserNew.check_hedgingc                 C   sZ  d}d}d}|s|  |}| D ]>}|d dkr4q"| ||d }|d |d< |d |d< q"| D ]\}}|d	 }	|d dkrqj|d }
|d }|d }|d
krt|	| }|| |d< || |d< |
|| k s|
|| krd}qj|	dk rj|d d }| ||d }t|	| }|| |d< || |d< |
|| k sP|
|| krjd}qj|S )NTg{Gz?g      ?r   r   re   marginentry_pricerf   r   Zlower_marginZhigher_marginFr   r   
_PERP_USDT
mark_price)r   r    r:   get_position_marginr   r   get_mark_price)r)   r   r   ZmarginedZlower_factorZhigher_factorr   position_marginre   rf   r   r   r   	thresholdr   Zmark_price_futurer+   r+   r,   check_margin  sB    
zUserNew.check_marginc
           #   	   C   s  d}
i }|  D ]\}}||d |d k }|  D ]\}}|d }||vri ||< |d dkrr|d || d< q|d  || d< q4|d dkr|| d  |d 7  < q4|| d  |d 8  < q4q|	 D ]\}}d	}d	}|d
 dkrqt|d }||d dk|d |k@  jdurJ||d dk|d |k@  d  | }nd	}||d dk|d |k@  jdur||d dk|d |k@  d  | }nd	}||d |k jdur||d d	k |d |k@  d   }nd	}||d |k jdur"||d d	k|d |k@  d  }nd	}||d |d k jdurn||d d	k |d |d k@  d   }nd	}||d |d k jdur||d d	k|d |d k@  d  }nd	}t|t| }t|d t|krqd	}||d dk|d |d k@  jdur<||d dk|d |d k@  d  | }td|d  td| tt|d dt| krtt|d dt| krtd| q||d dk|d |k@  jdur||d dk|d |k@ |d dk@  d  }||d dk|d |k@  jdurD||d dk|d |k@ |d dk@  d  }||d |d k|d dk@  jdurt||d |d k|d dk@  d  }nd	}||d |d k|d dk@  jdurt||d |d k|d dk@  d  }nd	}||d |d k|d dk@  jdurNt||d |d k|d dk@  d  }nd	}||d |d k|d dk@  jdurt||d |d k|d dk@  d  } nd	} t|t| t| t| t| t| t|  t| t| }!tt|d dttt|! krLtt|d dttt|! krLtd| qtd |d  td!| td"|! td#| td$| td%| ||vri ||< |d | | |! | | || d&< q|d | | |! | | || d&< q| D ]\}}"d|"vr,|| d& d	krt	d'| d( d)}
nXd&|"vrLt	d'| d* d)}
n8|"d |"d& krt	d'| d+|"d  d,|"d&   d)}
q|
|fS )-NTarbitrage_idr   product_symbolrh   r   rf   r   r   r   r   r   r   r   r   r   r   re   r   r   Zpositin_sizer   r   r   zCONTINUE FOR SYMBOLr   rg   r   r   gGz?g)\(?Zposition_sizer   r   r   r   r   r   zSymbol 'z"' not found in database arbitragesFz' not found in positionsz#' has mismatching size (Database : z / Platform : )
iterrowsr   r   r`   rx   r   r   r   r   r	   )#r)   Zuser_arbitragesZuser_underlyingsr   r   r   r   r   r   r   Zmatch_deltaZunderlyings_comparisonindex	arbitragearbitrage_underlyingsZ
underlyingre   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z
comparisonr+   r+   r,   check_arbitrages_positions  s    $*$*(&,*(,
<
$0$0(.(.(.(.HL






&&

"z"UserNew.check_arbitrages_positionsc                    s  d}|  }|d}| }	dd | D }||d dk  }
||d dk  }| jjdd	| j d
}td| |	 D ]|\ } dkr dkr d7   	dd}|d } fdd| D }t
|dkrd}n|  d }t|t|
|
d |k d   t||d |k d   dkrt|t||d  k d   t|
|
d |k d   t||d |k d   }n\t|t||d  k d   t|
|
d |k d   t||d |k d   }||d |k|d |jk@   }js"|d jd }nd}||d  k|d |jk@   }js\|d jd }nd}||8 }||8 }tt|tt|krtt|dtt| kstt|dtt| kr|D ],}|d  krtd|  d   d}qq| D ]\ }|d } fdd|	 D } 	dd}t|t|
|
d |k d   t||d |k d   dkrt|t||d  k d   t|
|
d |k d   t||d |k d   }n\t|t||d  k d   t|
|
d |k d   t||d |k d   }t
|dkrRd}n|| d }||d |k|d |jk@   }js|d jd }nd}||d  k|d |jk@   }js|d jd }nd}||8 }||8 }tt|tt|kr
tt|tdt| k sDtt|tdt| kr
td  t| d  ttt|t|  | d ttt|tt|  }|d kr
td|  d  d!| d"| d#	 d}q
|S )$NTSTAKINGc                 S   s"   i | ]\}}|d  dkr||qS r   r+   r   r+   r+   r,   r     r   z1UserNew.check_hedging_staking.<locals>.<dictcomp>rg   r   r   user_position_exclusionr   r   r   USDTBUSDr    rR   c                    s   i | ]\}} |v r||qS r+   r+   r   re   r+   r,   r     r   r   rf   re   spot_symbolr   gGzg)\([z] Badly hedged on Fc                    s&   i | ]\}}  d d|v r||qS )r   r   )replacer   r   r+   r,   r     r   g\(\gRQr      z	 (future z / spot ))r   get_staking_product_positionrU   r   copyr   r   r   r   r   r{   r   rx   PLATFORM_IDr`   r    r   floorr	   r   r   )r)   Zfuture_connectorZspot_connectorr   
arbitragesZdirectionnalsr   Zfuture_positionsZstaking_positionsZspot_positionsZdirectionnals_buysZdirectionnals_sellsr   Zspot_positionZsymbol_cleaned	spot_sizer   Zsize_futureZexcluded_spot_sizeZexcluded_futureZexcluded_future_sizer   future_positionr   r   Z	size_spot
differencer+   r   r,   check_hedging_staking  s~    

F^\&&B
F^\&&D
*
"zUserNew.check_hedging_stakingc                 C   s0   | j jdd| d| j d}| || | jS )Nbuy_crypto_historyzWHERE platform_id =  AND user_id = r   )r   r   r   _UserNew__update_profitsr'   )r)   r   r   r+   r+   r,   update_profits  s    zUserNew.update_profitsc                 C   sP   |  | |  | | j| d }| j| d }d}||d krD|S |d S d S )NrX   rR   i  g?rS   )r)   Zoption_platform_idr   Zoption_max_investmentZfuture_balancer+   r+   r,   is_inter_platform_balanced  s    

z"UserNew.is_inter_platform_balancedc           
      C   s  t |}|| jvri | j|< | |}|s@dddd| j|< d S | |jdd}d}d}| D ](\}}|t|d 7 }|t|d 7 }qb|| j| d< || j| d< d| j| d  }| j| d | }	|	dkrtd	| j| d  |	}	n|	d
 }	t|	| j| d< d S )Nr   )rR   rV   rX   T)as_usdrR   rV   g333333?i  g)\(?g?rX   )r2   r'   r:   rU   r   r   min)
r)   r   r3   r'   rR   rV   re   ZbalZminimum_balance_optionZclient_investmentr+   r+   r,   Z__update_balances  s0    


zUserNew.__update_balancesc                 C   s   t |}|| jvri | j|< | ||}|r8d|vrrd| j| d< d| j| d< d| j| d< d| j| d< nX|d d | j| d< |d d | j| d< |d d | j| d< |d d | j| d< d S )Nr   r   rv   total_deposittotal_withdrawtotal_profit)r2   r'   r:   
get_profit)r)   r   r   Zbalances_platformr+   r+   r,   Z__update_profits,  s    

zUserNew.__update_profitsc                 C   s6   g }| j jdd| d| j d}|js2|d j}|S )Ncrypto_strategies_usersWHERE strategy_id = r   r   r   r   r   r   r`   r    )r)   strategy_idrC   rB   r+   r+   r,   get_strategy_platforms>  s
    
zUserNew.get_strategy_platformsc                    sf   | j jdd| dd j}|   |dkrHt fdd|D rbdS nt fd	d|D rbdS d
S )NZcrypto_strategies_platformszWHERE strategies_id = r   r      c                 3   s   | ]}| v V  qd S r;   r+   r   r   Zuser_platform_idsr+   r,   	<genexpr>J  r   z<UserNew.has_strategy_platforms_configured.<locals>.<genexpr>Tc                 3   s   | ]}| v V  qd S r;   r+   r  r  r+   r,   r  L  r   F)r   r   r    rD   anyall)r)   r  Zstrategy_platform_idsr+   r  r,   !has_strategy_platforms_configuredE  s    z)UserNew.has_strategy_platforms_configuredc                 C   s8   d }| j jdd| d| j d}|js4|d  }|S )Nr   r  r   r   Ztargeted_amountr   r   r   r`   rx   )r)   r  Ztargetted_amountrB   r+   r+   r,    get_targetted_amount_on_strategyP  s
    z(UserNew.get_targetted_amount_on_strategyc                 C   s8   d }| j jdd| d| j d}|js4|d  }|S )Nr   r  r   r   invested_amountr  )r)   r  r  rB   r+   r+   r,   !get_investment_amount_on_strategyW  s
    z)UserNew.get_investment_amount_on_strategyc                 C   s:   d }| j jdd| d| j d}|js6|d jd }|S )Nr   r  r   r   Zuser_thresholdr   r  )r)   r  Zprofit_tolerancerB   r+   r+   r,    get_profit_tolerance_on_strategy^  s
    z(UserNew.get_profit_tolerance_on_strategyc                 C   s
   t | |S r;   r   r=   r+   r+   r,   Z__create_connectore  s    zUserNew.__create_connectorc                 C   s   | j  d| j d| j S )N-)r   r   r   r   r+   r+   r,   __str__h  s    zUserNew.__str__)F)N)r}   )N)N)N)*__name__
__module____qualname__r-   r0   r1   r5   r:   r>   rD   rG   rM   rO   rQ   rU   rW   rY   r[   ra   rt   ry   r|   r   r   r   r   r   r   r   r   r   r   r   rT   r   r  r  r  r  r  r8   r  r+   r+   r+   r,   r      sR   
6


 K
-
 
]'r   )&myfo.crypto.connector.common.platformsr   r   Z$myfo.crypto.connector.user_connectorr   Zmyfo.crypto.strategies.commonr   myfo.crypto.connector.corer   r   myfo.crypto.common.loggerr	   myfo.crypto.exceptionspandasrn   numpyr   r#   rl   jsonrp   r   r+   r+   r+   r,   <module>   s   