a
    cҙ                     @   sp   d dl 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ZG dd dZdS )	    )logget_contract_sizeformat_order_book_sellformat_order_book_buy
format_ask
format_bid)compute_apy)dateNc                   @   s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZdS )	Arbitragec                 C   st   || _ d| _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _tt | j	 j| _d| _d S )NFi,  )platform_connectoris_computedspot_idspot_symbolcall_idcall_symbolput_id
put_symbolstrikesettlement_datebatch_idstrategy_idcontract_sizedatabaseabsr	   todaydaysperiodarbitrage_expiration_timeout)selfr   r   r   r   r   r   r   r   r   r   r   r   r    r   O/var/www/html/myfo-crypto/python/myfo/crypto/strategies/option_parity/common.py__init__
   s     zArbitrage.__init__c                 C   s  d| _ | j| jd }| j| j}| j| j}t }td| j td| j td| j |dkrft	|d dkst	|d dkst	|d dkrd 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}|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}|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}|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}|r8| 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r4d	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rXd	nd}|r| 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| t-d| j"| j&|| j| j,| j+| j*\}}}}}nt	|d dkst	|d dkst	|d dkrd S zt.|||\}}}W n   Y d S 0 |js|js|jrd S t|| j\}	| _/| _0| _1| _2| _3| _4t|| j\}
| _5| _6| _7| _8| _9| _:t|| j\}| _;| _<| _=| _>| _?| _@d	}|rt!| j"| j5| j/ | j;  d
 }| j5| j/| j;d
| j8| j>| j2dt#| j2| j>| j8d	}t$|t|gg}t!| j"| j5| j1 | j;  d
 }|dkrd	nd}|r| j5| j1| j;|| | j8| j>| j4|| j& d t#| j4| j>| j8d	}t$|t|gg}t!| j"| j7| j/ | j;  d
 }|dkrd	nd}|	r| j7| j/| j;|| | j:| j>| j2|| j& d t#| j2| j>| j:d	}t$|t|gg}t!| j"| j5| j/ | j=  d
 }|dk	rd	nd}|	r| j5| j/| j=|| | j8| j@| j2|| j& d t#| j2| j@| j8d	}t$|t|gg}t!| j"| j7| j1 | j;  d
 }|dk	rd	nd}|
r0| j7| j1| j;|| | j:| j>| j4|| j& d t#| j4| j>| j:d	}t$|t|gg}t!| j"| j7| j/ | j=  d
 }|dk
r,d	nd}|
r| j5| j/| j=|| | j8| j@| j2|| j& d t#| j2| j@| j8d	}t$|t|gg}t!| j"| j5| j1 | j=  d
 }|dk
rd	nd}|rL| j5| j1| j=|| | j8| j@| j4|| j& d t#| j4| j@| j8d	}t$|t|gg}t!| j"| j7| j1 | j=  d
 }|dkrHd	nd}|r| j7| j1| j=|| | j:| j@| j4|| j& d t#| j4| j@| j:d	}t$|t|gg}||d dk|d dk@  ' }|d ( }||d |k ' }|d j)d | _A|d j)d | _B|d j)d | _Ctd| t-d| j"| j&|| j| jC| jA| jB\}}}}}|| _D|| _E|| _F|| _Gd| _Htd| td| d	| _ | jES )NFUSDTzself.spot_symbolzself.call_symbolzself.put_symbolbuysellr   T   g?)	perpetual_price_askput_price_askcall_price_bidratioZcall_size_bidZput_size_askZperpetual_size_askannualized_yieldmin_sizeim  r)   g333333?r*   r+   r'   r(   r&   max_size)	call_price_askperpetual_price_bidput_price_bidr)   Zcall_size_askZput_size_bidZperpetual_size_bidr*   r+   r-   r/   r.   
   
traded_apytraded_investment_margin)Ir   r   get_orderbookr   r   r   pd	DataFrameprint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   r   copymaxvaluesr'   r(   r&   r   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_3r-   r/   r.   apyarbitrage_yieldinvestment_marginmax_leverageoption_leverage)r   sideZperpetual_orderbookZcall_orderbookZput_orderbookZ"best_investment_contract_adjustedsZcall_orderbook_bidZput_orderbook_askZ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_8r,   r1   Ztraded_investmentr2   Ztraded_profitZtraded_yieldZcall_orderbook_askZput_orderbook_bidZperpetual_orderbook_bidr   r   r    compute_arbitrage_yield   sP   
&&&  
 
 
 
 
 
 
 
0&&&         
,

z!Arbitrage.compute_arbitrage_yieldc                 C   s@   |j d| jjddd td| | jd|| j| d S )Ncrypto_arbitrages_super_tradesappendFcon	if_existsindexzAdd super trade expiration : {}zCREATE EVENT arbitrage_super_trade_expiration_{}
                                ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL {} SECOND
                                DO UPDATE crypto_arbitrages_super_trades SET expired = 1 WHERE id = {};)to_sqlr   enginer   formatexecuter   )r   super_tradearbitrage_idr   r   r    update_super_trades  s
    
zArbitrage.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 : {}z3SELECT MAX(id) FROM crypto_arbitrages_super_trades;Tfetchr%   seconds)r   rN   r   rO   Tradesr4   r5   datetimenow	timedeltar   )r   
trade_namerQ   trade
expired_atr   r   r    initiate_super_trades  s    zArbitrage.initiate_super_trades2   c                 C   sZ  t  | _d | dkr t  S | jd t| j d t| j d d t| j }| j|kr<| 	|\}}}t || j| j
|| j| jt| j| j| j| j| j| j| j| j| j| j| jt | j| j|dg}| || ||d| j| j| jdd	|}||d| j| j| jdd	|}	||d| j| j| jd
d	|}
nr|| j| j| j| jd| j| j| jd| j| j| jd| j| j| jt| j| j| j| jd}t | jt |gg| _d | dkrt  S | jd t| j d t| j d d t| j }| j|kr| 	|\}}}t || j| j
|| j| jt| j| j| j| j | j| j!| j| j"| j| j| jt | j| j|dg}| || ||d| j| j| jdd	|}||d| j| j| jdd	|}	||d| j| j| jd
d	|}
nr|| j| j| j| jd| j"| j| jd| j | j| jd| j!| j| jt| j| j| j| jd}t | jt |gg| _| jS )Nr$   Z_strikeZ_period_Zdays_annual_yield)idsymbolr   	spot_namer   max_size_amountr,   maturity_daystarget_yield
call_pricer   	put_pricer   
spot_pricer   rC   APYr	   r   r   r]   r#   r      r%   )r[   r   yieldrj   r   spot_order_typeri   r   r   call_order_typerg   r   r   put_order_typerh   r   rd   r,   rC   r   r   )#r4   r5   	dataframerE   r   strr   r   r?   r^   r   rA   npfloorrB   r@   r-   r   r/   r   r.   r   rC   r	   r   r   r   rR   update_underlyingr   r   r;   r(   r'   r&   )r   platform_idsuper_trade_thresholdr[   rQ   r\   r]   rP   call_underlying_idput_underlying_idspot_underlying_id	arbitrager   r   r    get_dataframe  s    
4

 
4

 
zArbitrage.get_dataframeN)r_   )__name__
__module____qualname__r!   rE   rR   r^   r{   r   r   r   r    r
      s     hr
   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
rW   c                 C   s   || _ || _d| _d S )Ni  )tradesr   r   )r   r   r   r   r   r    r!   0  s    zTrades.__init__c	              
   C   s   |dkrNt ||||||dg}	|	jd| jjddd | jjddd	\\}
n||d
krt |||||||dg}	|	jd| jjddd d}
n<|dkrt ||||||dg}	|	jd| jjddd d}
|
S )Nr   )rQ   
order_typeproduct_symbolsecurity_id	is_futureru   Zcrypto_arbitrages_underlyingsrG   FrH   z2SELECT MAX(id) FROM crypto_arbitrages_underlyings;TrS   r%   )rQ   r   r   r   sizer   ru   Z"crypto_arbitrages_underlyings_liverk   *crypto_arbitrages_underlyings_super_trades)r4   r5   rL   r   rM   rO   )r   rQ   r   rb   r   r   r   Zis_liveru   
underlyingunderlying_idr   r   r    rt   5  sF    

	
zTrades.update_underlyingc                 C   s:   |}||t  d}t|g}|jd| jjddd d S )N)r   amountr	   Z%crypto_arbitrages_underlyings_marginsrG   FrH   )r	   r   r4   r5   rL   r   rM   )r   r   r   r   r   
new_marginZcall_arbitrage_marginZcall_arb_marginr   r   r    update_margin^  s    zTrades.update_marginc                 C   sJ  |j |d |kdf jd }|j |d |kdf jd }|j |d |kdf jd }|j |d |kdf jd }|j |d |kdf jd }|j |d |kdf jd }	|j |d |kd	f jd }
| jjd
g dd}|jrd}n|d  d }||jdk  }||j|	k|j	|k@ |j
|
k@ |j|k@ |j|k@ |j|k@  jdur|j |j|	k|j	|k@ |j
|
k@ |j|k@ |j|k@ |j|k@ df jd }td| n|}|sd}td| | jjddd\\}|sd}|d7 }tj tj| jd }t||||	||j |d |kdf jd |j |d |kdf jd |j |d |kdf jd |j |d |kdf jd |j |d |kdf jd ||j |d |kdf jd ||j |d |kdf jd ||j |d |kdf jd |t|j |d |kdf jd |t ||
d||j |d |kdf jd dg}|||||fS ) Nr[   r   r   r   r   
trade_sizeZprofitr   ZaDateZcrypto_arbitrages)
ra   r   user_idr   r   r   r   r   r   proposed)columnsr%   r   Tzbatch_id : {}z&SELECT MAX(id) FROM crypto_arbitrages;rS   rU   
investmentrA   r   rl   rg   rh   ri   rC   Zannual_yieldFr   )ra   r   rc   r   r   r   rA   re   rf   rg   r   rh   r   ri   r   rC   leveragerj   r   r	   target_profitr   Zexpiredr]   r   )locr>   r   getTabler8   r=   r   r<   r   r   r   r   r   r   r   rN   rO   rX   rY   rZ   r   r4   r5   intr	   r   )r   r   r[   r   r   r   r   r   r   r   r   
arbitragesZ	max_batchr   rQ   r]   trade_arbitrager   r   r    update_arbitragesj  sl    HL
zTrades.update_arbitragesN)r|   r}   r~   r!   rt   r   r   r   r   r   r    rW   .  s   )rW   )"myfo.crypto.strategies.common.corer   r   r   r   r   r   r   rX   r	   pandasr4   numpyrr   r
   rW   r   r   r   r    <module>   s        *