o
    f                  
   @   s>  d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlZddlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ dadddddddZdddZdddZdddddZdddd d!Zd"d#d$d%dd&d'Zd(d)d*d+d,d-Zd.d/d0d1d2Zd3Z d4Z!d5Z"d.d0d6d/d1d7d8d9d:d;	Z#G d<d= d=eZ$dS )>z5
Created on Sun Sep 25 2022

@author: Janisar Munshi
    N)
NorenApiPyOrder)Broker)ScriptsBrokerAccounts)isBlankOrNonegetStructKey)datetime)shared_task)MessageQueue)PubSubFCOMPLETEREJECTEDCANCELEDOPENPARTIAL)r   r   r   PENDINGr   r   NORMALZAMO)NoYesBUYSELL)BSLIMITMARKETzSL-LIMITz	SL-MARKET)LMTMKTzSL-LMTzSL-MKTDAYIOCEOSGTT)r   r   r    r!   ZINTRADAYDELIVERYZCOBOMARGIN)ICHr#   Mr(   ZEquityZ
DerivativeZ	CommodityZCurrencyALL)ZCASHZFOZCOMZCURr)   NSEMCXBSECDS)r*   r+   r,   r-   LTP_A_OLTP_B_O	LTP_BOS_OZNFOZBFOZBCDZNCOZBCO)	Znse_cmZbse_cmZnse_foZmcx_foZcde_foZmcx_sxZbcs_foZnse_comZbse_comc                       s   e Zd Z fddZdefddZd&ddZd	d
 Zdd Zdd Z	dg fddZ
d'ddZd(ddZdd Zdd Zd)ddZdd  Zd!d" Zd*d$d%Z  ZS )+BNRathic                    s8   t  | || _tjj|d | _d | _t	 | _
d S )N)id)super__init__BrokerIdr   objectsfilterfirstAccountConnectionObjectr   pubsub)selfbrokerId	accountId	__class__ RD:\Janisar\Projects\Python\Genie\myGenie\trading\views\Entities\Brokers\bnrathi.pyr4   l   s
   zBNRathi.__init__returnc                 C   s*   t | jjst| jj}| S td)NzNot Valid TOTP can be generated)r   r9   factor2SecretpyotpTOTPnow	Exception)r<   totprA   rA   rB   getTOTPx   s   zBNRathi.getTOTPFc                 C   s  d }| j rtjtjd zt| j}t| j jr|  }n| j j}| j j	r4|j
| j j| j j| j j	d}n!|j| j j| j j|| j j| j jdd}|rU|d| j _	| j   zd }|dd}|rg|| _|W W S W n tyw   |ruY W d S Y nw |d u r|j| j j| j j|| j j| j jdd}|d| j _	| j   || _|W S || _|W S    dd	| j j d
}Y qdd| j j d
}|| _| jS )N)level)useridpassword	usertokenabc1234)rL   rM   twoFAvendor_code
api_secretimei
susertokenr*   2885i  z*erro while getting connection for account:)statusmessagei  zNo Account with id:)r9   loggingbasicConfigDEBUGr   r5   r   factor2rJ   acccessTokenset_sessionclientIdrM   login
vendorCodeapiKeygetsave
get_quotesr:   rH   r2   ZErrors)r<   sessionOnlyerrorapir[   r_   quoteretrA   rA   rB   getConnectionObject   s^   	



zBNRathi.getConnectionObjectc                 C   s0   z|d u r| j d}|  W dS    Y dS )N
ConnectionTF)
connectionrb   close_websocket)r<   wsrA   rA   rB   closeWebSocket   s   zBNRathi.closeWebSocketc              	   C   s  t | j}||dd|d}i d| | jjj| jj|ddd| jj	d|dd	t
|d
dt|ddt|dd|dd|dd|jd|dd|dd|dddd|ddt|dd|d}|S )Nexch tsymQueueIdOr>   orderId
norenordnoproductTypeZpcodevalidityri   tranTypetrantypeexchSegsymboltoken
limitPriceprcZ
tradePriceavgprcqtyZremQtyr   Z	filledQtyrV   ZordDateTimeexch_tm)r   r5   	getScriptrb   
getQueueIdr9   userusernamer^   r2   PRODUCT_TYPEVALIDITY	TRAN_TYPEr}   STATUS)r<   rW   brokerscriptorderrA   rA   rB   formatOrderCallbakcMessage   sH   
 


	





z"BNRathi.formatOrderCallbakcMessagec                 C   s   |  | jjj| jj|dd| jj|dd|dd|dd|dd|d	d|d
d|dd|dd|dd|ddd}|S )Nrp   Terq   tklpr   pcvohlcZap)rs   r>   exchanger}   ZltppercvolumeopenhighlowcloseZavgTP)r   r9   r   r   r^   rb   r2   )r<   rW   tickrA   rA   rB   formatTickCallbackMessage   s   









z!BNRathi.formatTickCallbackMessageTc                    sX   fdd}fdd} fdd}|r!j j|||d_d S j j||d_d S )	Nc                    s2   t dt|    | } j|d| d S )Nzorder event: rs   )printstrr   r;   publishrb   )rW   r   r<   rA   rB   event_handler_order_update   s   
z?BNRathi.subscribeWebSockets.<locals>.event_handler_order_updatec                    s:   t | dddkr | } j|d| d S d S )Nr   r   rs   )floatrb   r   r;   r   )rW   r   r   rA   rB   event_handler_Tick_update   s   
z>BNRathi.subscribeWebSockets.<locals>.event_handler_Tick_updatec                     sJ   g }  D ]}|  |d  d|d   qt| dkr!j|  dad S )Nr   |r}   r   T)appendlenr:   	subscribesocket_opened)ZlstSubsriber   lstTicksr<   rA   rB   open_callback  s   z2BNRathi.subscribeWebSockets.<locals>.open_callback)order_update_callbacksubscribe_callbacksocket_open_callback)r   r   )r:   start_websocketrn   )r<   ZorderCallbackr   r   r   r   rA   r   rB   subscribeWebSockets   s   
zBNRathi.subscribeWebSocketsrq   Allc           
      C   s  | j }g }|dv r| }|r|D ]}|d dkrqt|s'|dd|kr'q|d}|d}i d| jjd	| jd	 d
tddt|dddt	|dddt
dd|dddd|ddddt|ddddddddddd|ddt|d  d!|dd"|d"d#i d$d d%d#d&d d'd d(d d)d d*d d+dd,t|ddd-|d d.d d/td0d1td0d2|d3d4d5d d6d }	||	 q|d7v rt|r| }n|j|d8}|r|D ]}|d dkrq|d}|d}i d| jjd	| jd
t|d9dt|d dt	|d dt
|d: d|d;dd|d<ddt|d d|d=ddd|d>dddd|ddt|d  d!|dd"|d"d#i d$d d%d#d&d d'd d(d d)d d*d d+dd,t|d d-|d d.d d/t|d/ d1t|d/ d2|d3 d5d d6d }	||	 q|| _|S )?N)r!   r   statOkal_idrv   rp   rr   sourceAccountIdr=   varietyr   	priceTypeZplace_order_paramsprctyprw   prddurationr!   ZaveragePricer   r   ZtriggerPricedquantityr   ZdisclosedQuantityZ	squareOffstopLossZtrailingStopLossr|   ry   rz   r   r}   rq   ZorderTaginstrumentTypeZstrikePrice
optionTypeZ
expiryDatelotSizeZ
cancelSizeZfilledSharesZunfilledSharesru   textrV   r   ZorderStatusZOrderedTimeZnorentmr   ZExecutionTimeZsourceOrderId)Normalr   )ordernoamori   r   trgprcdscqtyblprc)r:   get_pending_gtt_ordersr   rb   accountr2   rl   VARIETY
PRICE_TYPEr   r   intr   r   r   get_order_booksingle_order_historyr9   r5   orders)
r<   ru   ZOrderCatagoryconn	lstOrdersr   ordr   r|   r   rA   rA   rB   readOrderBook  s@  




	




 !#%




	



 !#%zBNRathi.readOrderBookc                 C   sX  | j d dkr| j d }nd S g }| }|D ]}|ddkr!qi d| jjd| j d d|d	d
t|ddt|dd|ddddd dt|dddddd|dd|ddd dt|dt|d dt|d d!t|dt	|d|d"|d#|d$d%}|
| q|S )&NrV      rk   r   r   r   r=   r   rp   Zproducttyper   r   r   tradingsymbolrr   Zinstrumenttyperq   Zsymbolgroupstrikepricer   Z
optiontypeZ
expirydateZ	marketlotls	precisionpp
multiplierZ
tradevalueZflprcZflqtyry   rz   Z	fillpricerv   ZflidZfltm)ZfillsizeZorderidZfillidZfilltime)rl   get_trade_bookrb   r   r2   r   r   r   r   r   r   )r<   ru   r   r   ZOrdersr   r   rA   rA   rB   readTradeBook  sd   


	


zBNRathi.readTradeBookc                 C   sf  t |tkrd S g }|D ]#}|d dkr/t| j}||d |d |d }|r.|d }q3q|d }t|d }|d dkrDd|d< |d	 }	|d }
|d
 }|d }|d }|d }|d }|d }tt|d }|d }|d}|d}|dd}|dd}|	 dv r|r|||dkrt
nt||dkrt|nt|d  tt|tt||	tt|
dd |ddd}nt|dtt|tt||||	|tt|
|d |dd}|| |	 dv r0|dkr d S |r||||dkrt
nt||dkrt|nt|d  tt|tt||	tt|
dd |ddd}n||||	tt|
|d}|| q|S ) Nr{   r-   r}   r|   r   r   r   pricer   ry   rw   r   	stopPricedisclosedQtyr   rx   ru   isGTTgttBuyBuffergttSellBufferNEWCREATEr   g        r!   )r   r   
alert_typealert_pricebuy_or_sellproduct_typer   
price_typer   remarks	retentionrx   discloseqtyrq   )r   r   r   r   r   r   r   r   r   trigger_pricer   r   UPDATEMODIFYCHANGE)r   r   r   r   r   r   r   r   r   r   r   r   rx   r   )r   r   r   newquantitynewprice_typenewprice)typelistr   r5   r   EXCHNAGE_MAPrb   r   r   upperALERT_TYPE_BELOWALERT_TYPE_ABOVEr   r   r   r   r   )r<   actionverboseOrderorderParamsr   r   r   r|   r   r   r   ry   prodTyper   r   r   disclQtyofflineOrderrx   ru   r   r   r   paramrA   rA   rB   prepareOrderParams  s   





 
zBNRathi.prepareOrderParamsc                 C   s   g }|D ]t}|   dv rP|d d|d |dtt|dtt|dtt|dttt|d	d
d|ddd|ddd}|	| |   dv rx|dtt|dttt|d	d
|dd}|	| q|S )Nr   r   :tradingSymbolr   r   ry   rw   r      r   r   Falsestoplossr|   r   r   siderw   r~   r   rx   r   r  r   
takeProfitr   ru   r2   r   r~   r   
r   rb   r   r   r   r   r   roundr   r   )r  	orderBookr  r   r  paramsrA   rA   rB   prepareOrderParamsOB  s4   

zBNRathi.prepareOrderParamsOBr   c                 C   s  g }|D ]}|  dv rY|d d|d |d|dkr%tt|ntt|dtt|dtt|d	ttt|d
dd|ddd|ddd}|	| |  dv r|d|dkrltt|ntt|dttt|d
d|dd}|	| q|S )Nr   r   r
  r  ZfillSizerq   r   ry   rw   Z	fillPricer  r   r   r  r  r  r   ru   r  r  )r<   r  Z	tradeBookr   r  trader  r  rA   rA   rB   prepareOrderParamsTB8  s4    
 
zBNRathi.prepareOrderParamsTBc           
      C   sv  g }t |dkr|d }|ddk}|r'd|d< | jjdi |}d|i}n:t|d|d	|d
|d|d|d|d|d|d|d|d|dd}| j|}|dddkrr|d ddd}n	d |ddd}|| |S | jjdi |}|ddkr|d}|D ]}	|	dd|	dd|	ddd}q|| |S )N   r   rx   r!   r   r   rv   r   r   r   r   r   r   r   r   r   r   order_idrq   createdokru   rW   rV   emsgerrsdatabodyr2   rW   rA   )r   rb   r:   place_gtt_orderr   place_orderr   Zplace_basket_orders)
r<   r  Z	lstNewOrdr  r   responser   r  	orderDatar"  rA   rA   rB   createOrders\  sH   



zBNRathi.createOrdersc           	      C   s<  g }t |dkre|d }|ddk}|r2| j|d |d | jjdi |}d|i}|S | jjdi |}|ddkrR|d|d	|dd
}n|d|ddd
}|| |S | jjdi |}|ddkr|d}|D ]}|dd|dd|ddd}|| q||S )Nr  r   rx   r!   r   rv   r   r   resultr  r  r   r!  r  r"  r#  r2   rW   )ZordderIdrW   rV   rA   )	r   rb   r:   cancel_gtt_orderpopr$  modify_orderr   Zmodify_basket_orders)	r<   r  ZlstModifiedr  r   r&  modifiedr'  r"  rA   rA   rB   modifyOrders  s@   


zBNRathi.modifyOrdersr   c                    s   |dkrd}| d}| d}tt|d }tt|d }t| jj |||d}	 fdd|	D }
|
S )Nr      z%d/%m/%Y)intervalc                    sD   g | ]} t |d  d|d |d |d |d |d d	qS )timez%d-%m-%Y %H:%M:%SintoZinthZintlintcZintv)	r{   r|   r}   ZhistDater   r   r   r   r   )r	   strptime).0itemr{   r|   r}   rA   rB   
<listcomp>  s    z-BNRathi.getHistoricalData.<locals>.<listcomp>)	strftimer1  mktimer	   r4  	timetuplereversedr:   get_time_price_series)r<   r{   r|   r}   fromdatetodater0  ZfdateZtdater"  Z
candleDatarA   r7  rB   getHistoricalData  s   

zBNRathi.getHistoricalData)F)rq   r   )rq   )r   )r   )__name__
__module____qualname__r4   r   rJ   rj   ro   r   r   r   r   r   r	  r  r  r(  r.  r@  __classcell__rA   rA   r?   rB   r1   k   s     
>	
-
o%j
$71r1   )%__doc__rX   !trading.NorenRestApiPy.api_helperr   r   %trading.views.Entities.Brokers.brokerr   trading.modelsr   r   mainapp.views.utilsr   r   rE   r1  	threadingr	   celeryr
    trading.views.Redis.messageQueuer   trading.views.Redis.redisPubSubr   r   r   r   r   r   r   r   ZSEGMENT_TYPEr   r  r   ALERT_TYPE_OCOZEXCHANGE_SEGMENTr1   rA   rA   rA   rB   <module>   s   
	
	