a
    *cF                     @   sl   d dl mZmZmZ d dlmZ d dlmZ d dlZ	d dlZG dd dZ
dd Zd	d
 ZG dd dZdS )    )get_contract_size format_order_book_active_hedgingformat_bid_ask_active_hedging)log)dateNc                   @   s   e Zd Zdd ZdS )Tradesc                 C   s   || _ || _d| _d S )N  )tradesdatabase!active_hedging_expiration_timeout)selfr
   r	    r   Y/var/www/html/myfo-crypto/python/myfo/crypto/strategies/active_hedging_strategy/common.py__init__	   s    zTrades.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                 C   sX   t | d }t |d }|ddg d|ddg< |ddg d|ddg< ||fS )NbuysellsizepriceZfloat64)pd	DataFrameZastype)Zorder_books_putZorder_books_perpetualorder_books_put_bidorder_books_perpetual_askr   r   r   format_order_book_sell   s
    r   c                 C   sF   t | d  }t |d  }|j|d |kdf jd }|||fS )Nr   r   r   )floatminlocvalues)r   r   Zperpetual_price_askZput_price_bidZput_size_bidr   r   r   format_bid_ask_sell   s    r    c                   @   s@   e Zd Zdd Zdd Zdd Zdd Zdd
dZdddZdS )ActiveHedgingc                 C   s   || _ || _d| _|| _|| _|| _|| _|| _t|	| _	|
| _
|| _|| _|| _tt | j
 j| _|| _|| _|| _|| _d| _|| _d| _d S )NF   r   )future_connectoroption_connectoris_computedspot_id	future_idspot_symbolput_idoption_symbolr   strikesettlement_datebatch_idstrategy_idr
   absr   todayZdaysperiodband_rangesrange_periodrange_costsspotstransaction_cost_idraising_levelsr   )r   r
   r$   r#   r&   r'   r(   r)   r*   r+   r,   r-   r.   r2   r3   r4   r5   r7   r   r   r   r      s*    
zActiveHedging.__init__c                 C   s  d| _ | j| jd }| j| j}t| j}t|d dkspt|d dkspt|d dkspt|d dkrtd S zt||\}}}W n   Y d S 0 |j	s|j	s|j	rd S t
||\| _| _| _| _| j| | _| j| | _| j| | _t| j}| j}| j| }t| j| j d }	| jj| jd | jkdf jd }
td|
 |
d	krTd S |
d
krbd
}
|	dkrtd| j td|	 td|
 | jj| jd | jk| jd |
k@ | jd | jk@  }|jdgdd}|j|d |	kdf jd }| jj| jd | jkdf jd }| jj| jd |k| jd | jk@ | jd |
k@   }| j| j |	 | }d}d}|| ||  | _t| j| j dkr|| jt| j| j   ||  }n|| j ||  }|d jd | | j }|| }td| td| td|| jt| j| j    td| |  || j d | _td| td| td| td | j td!| j td"|d jd  td#| j td$| td%| j | jdkrd| _ n| jd&| j  | _ d| _ | jS d S )'NFZBUSDr   r   r"   period_rangeidrange_period_id(      g333333?z
PUT symbolstrike_distancer&   	period_idr6   T)	ascendingZmean_additional_performancesymbol333333?皙?band_1_cost_mean
profit_pnlprofit_costzRmax_leverage*(self.put_bid_price -(float(self.strike) - self.perpetual_ask_price))z&additional_raising*notional_investmentd   profitmax_leveragenotional_investmentzself.perpetual_ask_pricezself.put_bid_pricezself.average_costsz self.investmentpnl_percentagezself.active_hedging_yieldm  )!r%   r#   get_orderbookr(   r$   r*   r   lenr   emptyr   perpetual_ask_priceperpetual_ask_sizeput_bid_priceput_bid_sizer+   r/   r3   r   r1   r   printr7   r&   r6   sort_valuesr5   r2   copy
investmentr   active_hedging_yieldapy)r   perpetual_orderbookput_orderbookcontract_sizeput_orderbook_bidperpetual_orderbook_bidperpetual_orderbook_askrH   rI   r=   r:   Zadditional_raisingsZadditional_raising	symbol_idaverage_costsrJ   put_margin_ratioperpetual_margin_ratiorD   rE   rG   r   r   r   compute_active_hedging_yield6   s    
 

"





6"8$

 



z*ActiveHedging.compute_active_hedging_yieldc                 C   s@   |j d| jjddd td| | jd|| j| d S )NZ"crypto_active_hedgings_super_tradeappendF)con	if_existsindexzAdd super trade expiration : {}zCREATE EVENT active_hedging_super_trade_expiration_{}
                                ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL {} SECOND
                                DO UPDATE crypto_active_hedgings_super_trade SET expired = 1 WHERE id = {};)to_sqlr
   enginer   formatexecuter   )r   super_tradeactive_hedging_idr   r   r   update_super_trades   s
    
z!ActiveHedging.update_super_tradesc                 C   sd   t d| | jjddd\\}|s*d}|d7 }t| jt }tj tj	| j
d }|||fS )NzFound super_trade : {}z7SELECT MAX(id) FROM crypto_active_hedgings_super_trade;T)Zfetchr"   )Zseconds)r   rj   r
   rk   r   r   r   datetimenowZ	timedeltar   )r   
trade_namerm   trade
expired_atr   r   r   initiate_super_trades   s    z#ActiveHedging.initiate_super_trades2   c                 C   s6  t  | _d |  krt  S | jd t| j d t| j d d t| j }| j|kr| 	|\}}}t || j| j
|| j| j| j| j| j| j| j| j| j| j| jt | j| jd|dg}| || n^|| j| j| j| jd| j| j| j| jd| j| j| j| j| j| jd}t | jt |gg| _| jS )	N_strike_period_days_annual_yieldr   )r9   r@   r-   Z	spot_namer+   max_size_amountmaturity_daystarget_yieldoption_price	option_id
spot_pricer&   r(   r*   APYr   r,   r.   Ztradedrs   r   )rq   r+   yieldr   r&   Zspot_order_typer   r(   Zperpetual_sizer~   Zput_order_typer}   r*   Zput_sizerz   r1   r,   )r   r   Z	dataframerc   r(   strr+   r1   rX   rt   r-   rV   rW   rQ   r)   rO   r'   r*   r   r0   r,   r.   rn   rP   rR   concat)r   Zsuper_trade_thresholdrq   rm   rr   rs   rl   active_hedgingr   r   r   get_dataframe   sb    
4

zActiveHedging.get_dataframeFc           )      C   s  t | |d jd }|d jd }|d jd }|d jd }|d jd }|d jd }	|d|	  }
|d jd }|d	 jd }|d
 jd }t d| | j|d }| j|}t d| t d| t|}d}d}zt||\}}}W n   Y d S 0 |js|js|jrd S t||\}}}}|| }|| }t d| t d| t d| t d| t| j	}t
|d d d d}|| }t d| |dkrtt|| || }nttt|||| }t d| || }|| } | jj| jd | jkdf jd }!|!dkrd}!| jj| jd | j	kdf jd }"t d|" t d|! t d| j t d| | jj| jd  |"k| jd! | jk@ | jd" |!k@   }#d}d}|| ||  | _t d#|#d$ jd  || |#d$ jd | |  }$| |#d$ jd  d% | _|}%| jd|	  }&|d& t
| d' t
| d( d) t
|& }'|d% }(d*}t d+|& t d| t d,| j |d*kr|&d-k rt d.|& d/S |r|| j|&| j|'|$|%fS |&|
d*|(  k r|&d0k rt d1|&|
| d/S || j|&| j|'|$|%fS n|| j|&| j|'|$|%fS d S )2Nr(   r   r*   r{   is_testr|   rK   r+   rV   r   USDTrZ   rY   rA   rB   current_perpetual_ask_pricecurrent_put_bid_price
trade_sizeinitial_investment.investment_marginrH   r8   r9      r@   r_   r:   zself.transaction_cost_idrI   r&   r6   r>   r`   rC   rF   rv   rw   rx   ry   r"   current_apyzself.investment
   z/[ERROR] Active hedging yield is bellow 10% ({}))r   r   r   r   r   r   r      z<[ERROR] Active hedging yield is ({}) expecting ({} +/- {} %))rS   r   r#   rL   r$   r   r   rN   r   r(   r   findintroundr   r3   r   r1   r5   r6   r2   rU   rV   rW   rj   ))r   r   Zyield_toleranceZis_super_trader(   r*   r1   r   Zinitial_yieldZinitial_periodZinitial_apyZinitial_striker   r   rY   rZ   r[   ra   rb   r\   r]   r^   r   Zcurrent_perpetual_ask_sizer   rR   Z
put_marginZperpetual_marginZnumber_of_contact_digitsr   rH   rI   rJ   r:   r_   r`   rG   r   r   rq   Zyield_tolerance_factorr   r   r   check_yield  s    










"
"


8,



zActiveHedging.check_yieldN)ru   )F)	r   r   r   r   rc   rn   rt   r   r   r   r   r   r   r!      s   r
@r!   )Zmyfo.crypto.strategies.commonr   r   r   myfo.crypto.common.loggerr   ro   r   pandasr   r   r   r    r!   r   r   r   r   <module>   s   	