a
    *cԴ                     @   s   d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
mZ d dlZd dlZd dlZG dd deeZG dd dZdd
dZdS )    )get_contract_sizeformat_order_book_buyformat_order_book_sell
format_ask
format_bidformat_bid_ask_sellformat_bid_ask_buy)log)EnumNc                   @   s   e Zd ZdZdZdZdS )OptionParityTable)main)Zlive)super_tradeN)__name__
__module____qualname__MAINLIVESUPER_TRADE r   r   R/var/www/html/myfo-crypto/python/myfo/crypto/strategies/option_parity/arbitrage.pyr      s   r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	edd Z
dS )OptionParityArbitragec                 C   s   || _ || _|| _|| _|| _|| _|| _d| _t|| _	t
tj | j j| _d| _d| _d| _d | _d | _d| _d | _d | _d | _d | _d | _d | _d S )N   i,  Fr   )databasesidespot_symbolcall_symbol
put_symbolstrikesettlement_datestrategy_idr   contract_sizeabsdatetimedatetodaydaysperiodarbitrage_expiration_timeoutis_apy_computedbatch_ididnamesize
spot_price
call_price	put_price
investmentinvestment_marginprofit)selfr   r   r   r   r   r   r   r   r   r   __init__   s,    
zOptionParityArbitrage.__init__c                 C   sd  t  }| jsd S | jdkrt|d dksNt|d dksNt|d dkrRd S zt|||\}}}W n   Y d S 0 |js|js|jrd S t|| j\}| _	| _
| _| _| _| _t|| j\}	| _| _| _| _| _| _t|| j\}
| _| _| _| _| _| _d}|rt| j| j	| j | j  d }| j	| j| jd| j| j| jdt| j| j| jd	}t |t |gg}t| j| j| j | j  d }|dkrdnd}|r6| j| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j	| j | j  d }|dkr2dnd}|r| j	| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j	| j | j  d }|dkrdnd}|rZ| j	| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j| j | j  d }|dkrVdnd}|r| j| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j| j | j  d }|dkrdnd}|r~| j| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j| j | j  d }|dkrzdnd}|r| j	| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}t| j| j	| j | j  d }|dkrdnd}|rp| j| j| jt || | j| j| j|| j d	 t| j| j| jd	}t |t |gg}||d
 dk|d dk@  ! }|d " }||d |k ! }|d j#d | _$|d j#d | _%|d j#d | _&t'(d| j| j|| j)| j&| j%| j$\}}}}}nt|d dksHt|d dksHt|d dkrLd S zt*|||\}}}W n   Y d S 0 |js|js|jrd S t|| j\}| _+| _,| _-| _.| _/| _0t|| j\}	| _1| _2| _3| _4| _5| _6t|| j\}
| _7| _8| _9| _:| _;| _<d}|rt| j| j1| j+ | j7  d }| j1| j+| j7d| j4| j:| j.dt| j.| j:| j4d	}t |t |gg}t| j| j1| j- | j7  d }|dkrdnd}|r2| j1| j-| j7|| | j4| j:| j0|| j d	 t| j0| j:| j4d	}t |t |gg}t| j| j3| j+ | j7  d }|dkr.dnd}|r| j3| j+| j7|| | j6| j:| j.|| j d	 t| j.| j:| j6d	}t |t |gg}t| j| j1| j+ | j9  d }|dkrdnd}|	rN| j1| j+| j9|| | j4| j<| j.|| j d	 t| j.| j<| j4d	}t |t |gg}t| j| j3| j- | j7  d }|dk	rJdnd}|	r| j3| j-| j7|| | j6| j:| j0|| j d	 t| j0| j:| j6d	}t |t |gg}t| j| j3| j+ | j9  d }|dk	rdnd}|
rj| j1| j+| j9|| | j4| j<| j.|| j d	 t| j.| j<| j4d	}t |t |gg}t| j| j1| j- | j9  d }|dk
rfdnd}|
r| j1| j-| j9|| | j4| j<| j0|| j d	 t| j0| j<| j4d	}t |t |gg}t| j| j3| j- | j9  d }|dk
rdnd}|rT| j3| j-| j9|| | j6| j<| j0|| j d	 t| j0| j<| j6d	}t |t |gg}||d
 dk|d dk@  ! }|d " }||d |k ! }|d j#d | _%|d j#d | _$|d j#d | _&t'(d| j| j|| j)| j&| j%| j$\}}}}}|| _=|| _>|| _?|| _@|| _A|| _B|| _Cd| _D| j)d tE| j d tE| j d d tE| j= | _Fd| _G| j=S )Nbuysellr   T   皙?)	perpetual_price_askput_price_askcall_price_bidratioZcall_size_bidZput_size_askZperpetual_size_askannualized_yieldmin_sizeFm  r<   g333333?r=   r>   r:   r;   r9   )	call_price_askperpetual_price_bidput_price_bidr<   Zcall_size_askZput_size_bidZperpetual_size_bidr=   r>   r@   rB   rA   
   _strike_period_days_annual_yield)Hpd	DataFramer&   r   lenr   emptyr   r    Zperpetual_price_ask_1Zperpetual_price_ask_2Zperpetual_price_ask_3Zperpetual_size_ask_1Zperpetual_size_ask_2Zperpetual_size_ask_3r   Zcall_price_bid_1Zcall_price_bid_2Zcall_price_bid_3Zcall_size_bid_1Zcall_size_bid_2Zcall_size_bid_3Zput_price_ask_1Zput_price_ask_2Zput_price_ask_3Zput_size_ask_1Zput_size_ask_2Zput_size_ask_3floatr   minconcatr!   copymaxvaluesr/   r.   r-   r   compute_apyr   r   Zperpetual_price_bid_1Zperpetual_price_bid_2Zperpetual_price_bid_3Zperpetual_size_bid_1Zperpetual_size_bid_2Zperpetual_size_bid_3Zcall_price_ask_1Zcall_price_ask_2Zcall_price_ask_3Zcall_size_ask_1Zcall_size_ask_2Zcall_size_ask_3Zput_price_bid_1Zput_price_bid_2Zput_price_bid_3Zput_size_bid_1Zput_size_bid_2Zput_size_bid_3apyarbitrage_yieldr0   r1   r2   max_leverager,   option_leveragestrr+   r(   )r3   perpetual_orderbookcall_orderbookput_orderbookZ"best_investment_contract_adjustedscall_orderbook_bidput_orderbook_askperpetual_orderbook_askZorder_book_size_perpZorder_book_size_callZorder_book_size_putZcontinue_fillingZinvestment_contract_adjusted_1Z!best_investment_contract_adjustedZinvestment_contract_adjusted_2Zinvestment_contract_adjusted_3Zinvestment_contract_adjusted_4Zinvestment_contract_adjusted_5Zinvestment_contract_adjusted_6Zinvestment_contract_adjusted_7Zinvestment_contract_adjusted_8max_sizeZ
traded_apyZtraded_investmentZtraded_investment_marginZtraded_profitZtraded_yieldcall_orderbook_askput_orderbook_bidperpetual_orderbook_bidr   r   r   compute_arbitrage_apy+   sF   &&&  
 
 
 
 
 
 
 2&&&         .6z+OptionParityArbitrage.compute_arbitrage_apyc              	   C   s`  d}| j std| jdkr dnd}|tjkr| d}| d|| j| j| jdd | d||| j| j	d	d | d|| j| j| j
d	d n|tjkr| d
}| d|| j| j| jdd | d||| j| j	d	d | d|| j| j| j
d	d nh|tjkr\| d}| d|| j| j| jdd | d||| j| j	d	d | d|| j| j| j
d	d |S )Nr   zArbitrage not computedr5   r6   crypto_arbitrages_super_trades*crypto_arbitrages_underlyings_super_tradesTr   Fcrypto_arbitrages_live"crypto_arbitrages_underlyings_livecrypto_arbitragescrypto_arbitrages_underlyings)r(   	Exceptionr   r   r   (_OptionParityArbitrage__insert_arbitrage)_OptionParityArbitrage__insert_underlyingr,   r   r   r   r   r   )r3   tablearbitrage_idZ	call_sider   r   r   to_database  s(    




z!OptionParityArbitrage.to_databasec                 C   s  t j  t j| jd }t j }t j  }|dkrt| j| j	| j
| j| jt| j| j| j| j| j| j| j| j| j| j| j|| j| j|||dg}n|dkr
t| j| j	| j
| j| jt| j| j| j| j| j| j| j| j| j| j| j|| j| j|||dg}nt|dkr~t| j	| j
| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j|| j| jdd| j|||dg}|j|| jj d	d
d | jj!d| ddd\\}|sd}|dkr| j!d| d| d| j d| d| d |S )N)Zsecondsrc   )symbolr)   	spot_namer   max_size_amountr^   maturity_daystarget_yieldr   r   r   r-   r.   r/   rV   APYr#   r   r   
expired_at
created_at
updated_atre   )ro   r)   rp   r   rq   r^   rr   rs   r   r   r   r.   r/   r-   rV   rt   r#   r   r   ru   rv   rw   rg   r7   )r)   rp   r0   r1   r   r,   Zleveragerr   rs   r   r   r   r.   r/   r-   rV   rt   r#   r   r   ZacceptedZstatusZtarget_profitru   rv   rw   appendFZconZ	if_existsindexSELECT MAX(id) FROM ;TfetchzCREATE EVENT Z_expiration_zQ
                                    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL z6 SECOND
                                    DO UPDATE z SET expired = 1 WHERE id = )"r"   nowZ	timedeltar'   r#   r$   rH   rI   r   r)   r+   r   r1   npfloorrU   r&   rT   r   r   r-   r.   r/   rV   rS   r   r   r0   r,   r2   to_sqlr   engineexecute)r3   rl   ru   r$   r   	arbitragerm   r   r   r   Z__insert_arbitrage  s    







z(OptionParityArbitrage.__insert_arbitragec           
   	   C   sX   t ||||||dg}|j|| jjddd | jjd| ddd\\}	|	sTd	}	|	S )
N)rm   
order_typeproduct_symbolr,   	is_futureplatform_idrx   Fry   r{   r|   Tr}   r7   )rH   rI   r   r   r   r   )
r3   rl   rm   r   r,   ro   r   r   Z
underlyingunderlying_idr   r   r   Z__insert_underlying	  s    

z)OptionParityArbitrage.__insert_underlyingc                 C   sJ  t |}t |}t |}t |}t |}t |}d}d}	t|}
| dkr*|| }||	 }t |t | dk rzt||}n|d }|| | | |
 }|| | |
 }d| |
 | }td| d| td| d|  d| d  tt||d d|  |
 | }t||}t ||
 | | | }n|| }||	 }t |t | dkr\t||}n|d }|| | | |
 }|| | |
 }d| |
 | }td| d| td| d|  d| d  tt||d d|  |
 | }t||}| t ||
  | | }|||  d	 }|d
|  }t|| }|| }|||||fS )Nr   r8   r5   ?guZ?a2U0*3?Mb@?ffffff?d   r?   )rL   r   rP   rM   r!   )Z	spot_sider   r&   r,   ro   r-   r.   r/   Zoption_margin_ratioZfuture_margin_ratior    call_marginperpetual_marginr1   investment_contract_adjustedfees_classicfees_cappedfeesr2   
put_margincurrent_yieldcurrent_apyr0   r   r   r   rR     sJ    
P
P
z!OptionParityArbitrage.compute_apyc                 C   s  |t jkrd}d}n,|t jkr(d}d}n|t jkr<d}d}nd S | j|d| d}| j|d	| d}|d
 jd }|d jd }|d jd }	|d jd }
||d dk d jd }||d dk d jd }|d jd }||d dk|d |k@  d jd }|d jd }||d dk|d |k@  d jd }|d jd }|d jd }|d jd }|d jd }t| ||||||}||_|d t| d t|j	 d d t| |_
||_||_||_||_||_||_|S )Nrc   rd   re   rf   rg   rh   zWHERE id = )argzWHERE arbitrage_id = r   r   r   r)   r   r   r7   r   r   r-   r.   r/   rt   rq   r^   rD   rE   rF   rG   )r   r   r   r   getTablerQ   r   r*   rW   r&   r+   r-   r.   r/   rS   r0   r,   )r   rl   rm   Zarbitrage_tableZunderlyings_tableZarbitrage_dfZunderlyings_dfr   r   r)   r   r   r   r-   r   r.   r   r/   rS   rq   r^   r   r   r   r   from_database[  sH    


&&0z#OptionParityArbitrage.from_databaseN)r   r   r   r4   rb   rn   rj   rk   staticmethodrR   r   r   r   r   r   r      s     \g
=r   Fc           >      C   sV  |d j d }|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 dks,t|d dks,t|d dks,t|d dks,t|d dks,t|d dkr8td dS t|}||d |k d j d }d}d}|dkrFzt|||\}}}W n   Y dS 0 t|||||\}}}}} }!td| d|  td| d|  td|! d|   || }"|| }#t	|t	| dk rt
|#|"}"n|#d }"| | |" |# | }$|dkrRt||$ }%nt|||!}%|| |  | }&d| | |% }'t
d| d| t
d| d|   d| d  t
t
| |d d|  | |% }(t|'|(})t	|| |& |% |) }*|"}+|},|}-| }.|jdgdgd}|jdgdgd}|jdgdgd}|}|}|}nzt|||\}/}0}1W n   Y dS 0 t||1|/|0|\}2}3}4}5}6}7td|3 d|2  td|5 d|4  td|7 d|6  ||6 }8|2| }#t	|t	|2 d krt
|#|8}8n|#d }8|4|6 |8 |# | }$|dkr,t||$ }%nt||5|7}%|4|2 |6 | }&d|2 | |% }'t
d|2 d|4 t
d|2 d|6  d|2 d  t
t
|6|4d d|2  | |% }(t|'|(})|& t	||  |% |) }*|8}+|2},|4}-|6}.|1jdgdgd}1|0jdgdgd}0|/jdgdgd}/|/}|0}|1}|*|$|%  d! }9|9d|  }:|d" t| d# t|	 d$ d% t|: };|d! }<|&| |% }=|$|% }$|
d&kr0|:d'k rtd(|: dS |r|:d)kr|%|=|$|:|9|;|#|+|*|,|-|.|||fS |:|d&|<  k r|:d)k rtd*|:|| dS |%|=|$|:|9|;|#|+|*|,|-|.|||fS n"|%|=|$|:|9|;|#|+|*|,|-|.|||fS d S )+Nr   r   r   r   rr   is_testrs   r?   r   r0   r,   r5   r6   z'Orderbook malformed, skipping arbitrage)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   zOrderbook spot: z at zOrderbook call: zOrderbook put: r   r   r   r   ZpriceT)Z	ascendingFr   r   rD   rE   rF   rG   r7   rC   z*[ERROR] Arbitrage yield is bellow 10% ({})   z7[ERROR] Arbitrage yield is ({}) expecting ({} +/- {} %))rQ   get_api_connectorget_orderbookrJ   r	   r   r   r   printrL   rP   r   r   rM   Zsort_valuesr   r   rW   format)>userr   r   ZunderlyingsZyield_toleranceZis_super_trader   r   r   r&   r   Zinitial_yieldZinitial_periodZinitial_apyZinitial_strikeZinitial_investmentZ
trade_sizeplatform_connectorrX   rY   rZ   r    r   call_margin_ratioperpetual_margin_ratior[   r\   r]   Zcurrent_perpetual_ask_priceZcurrent_perpetual_ask_sizeZcurrent_call_bid_priceZcall_bid_sizeZcurrent_put_ask_priceZput_ask_sizer   r   r1   rU   r   r   r   r   r2   Zoption_marginr-   r.   r/   r_   r`   ra   Zcurrent_perpetual_bid_priceZcurrent_perpetual_bid_sizeZcurrent_call_ask_priceZcall_ask_sizeZcurrent_put_bid_priceZput_bid_sizer   r   r   Z
trade_nameZyield_tolerance_factorr0   r   r   r   check_yield  s    



$

P

P
,

"$r   )F)myfo.crypto.strategies.commonr   r   r   r   r   r   r   myfo.crypto.common.loggerr	   enumr
   pandasrH   numpyr   r"   rW   r   r   r   r   r   r   r   <module>   s   $      