U
    .]h&                  
   @   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ZddlmZ ddlmZ dd	lmZ dd
lmZ ddlZee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=Z(G d>d? d?Z)G d@dA dAZ*G dBdC dCeZ+dS )Dz5
Created on Sun Sep 25 2022

@author: Janisar Munshi
    N)
NorenApiPyOrder)Broker)ScriptsBrokerAccounts)isBlankOrNonegetStructKey)datetime)shared_task)PubSub)getBrokerAccountF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-   ZLTP_A_OZLTP_B_OZ	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dZdZdZdS )MSGCATEGORYZM0ORZTKN)__name__
__module____qualname__ZMANAGERORDERTICK r5   r5   K/home/worker/MarketYantra/Yantra/yantra/trading/Entities/Brokers/bnrathi.pyr.   o   s   r.   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
MSGTYPEsisswssbstwt00coN)r0   r1   r2   ZINITSTRATEGYZSTARTSTRATEGYZSUBSCRIBEWSZSUBSCRIBECNZSUBSCRIBETKWAITZSUICIDEZCANCELORDERSr5   r5   r5   r6   r7   v   s   r7   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!S )"	MSGATTRIBZqIdcttpZtksZscr;   aIdZbIdZoIdptpZvdZttpexsytkprZlmpZltpZatpprcvlZqtZfqtZrqtr<   ocr=   ZodtohlcN)#r0   r1   r2   ZQUEUEIDCATEGORYTYPEZTICKSZSTRATEGYCODEZ	SUBSCRIBE	ACCOUNTIDZBROKERIDZORDERIDZPRODUCTTYPEVALIDITYZTRANTYPEEXCHANGESYMBOLTOKENZPRICEZ
LIMITPRICETRADEDPRICEAVERAGEPRICE
PERCENTAGEVOLUMEZQTYZ	FILLEDQTYZ	REMAINQTYSTATUSZORDCALLBACKr@   ZORDDATETIMEr   HIGHLOWCLOSEr5   r5   r5   r6   rA      s@   rA   c                       s   e Zd Z fddZedddZd.ddZd	d
 ZedddZ	edddZ
dg fddZd/ddZdd Zd0ddZdd Zdd Zd1dd Zd!d" Zd#d$ Zg d%fed&d'd(Zd2d*d+Zd3d,d-Z  ZS )4BNRathic                    sd   t  | || _tjj|d | _d | _| 	d| jj
jd| _| 	d| jj
jd| _t | _d S )N)idQOT)super__init__BrokerIdr   objectsfilterfirstAccountConnectionObject
getQueueIduserra   OrderQTickQr   pubsub)selfbrokerId	accountId	__class__r5   r6   rf      s    zBNRathi.__init__)returnc                 C   s.   t | jjs"t| jj}| S tdd S )NzNot Valid TOTP can be generated)r   rk   factor2SecretpyotpZTOTPnow	Exception)rr   Ztotpr5   r5   r6   getTOTP   s    zBNRathi.getTOTPFc                 C   s  d }| j rnz<t| j}t| j jr0|  }n| j j}| j jr^|j| j j| j j	| j jd}nB|j
| j j| j j	|| j j| j jdd}|r|d| j _| j   z&d }|dd}|r|| _|W W S W n  tk
r   |rY W d S Y nX |d kr<|j
| j j| j j	|| j j| j jdd}|d| j _| j   || _|W S || _|W S W n    dd| j j d	}Y nX nd
d| j j d	}|| _| jS )N)useridpasswordZ	usertokenZabc1234)r}   r~   ZtwoFAZvendor_codeZ
api_secretZimeiZ
susertokenr*   2885i  z*erro while getting connection for account:)statusmessagei  zNo Account with id:)rk   r   rg   r   factor2r|   acccessTokenZset_sessionclientIdr~   login
vendorCodeapiKeygetsave
get_quotesrl   r{   ra   ZErrors)rr   sessionOnlyerrorapir   r   quoteretr5   r5   r6   getConnectionObject   sj    


      

    

zBNRathi.getConnectionObjectc                 C   s6   z"|d kr| j d}|  W dS    Y dS X d S )N
ConnectionTF)
connectionr   Zclose_websocket)rr   r:   r5   r5   r6   closeWebSocket   s    zBNRathi.closeWebSocketc                 C   s   i }|  |dd|d}|r| j|d|dt|dt|dt|d|d|d|j|d	|d
|dd|dt|d|dd}n"t	d|d d|d  |S )Nexch tsymrD   
norenordnopcoder   trantyperJ   avgprcqtyr   r   exch_tm)QueueIdrt   orderIdproductTypevaliditytranTypeexchSegsymboltoken
limitPriceZ
tradePricer   ZremQtyZ	filledQtyr   ZordDateTimezScript not found for Exchangez token )
	getScriptr   ro   PRODUCT_TYPErT   	TRAN_TYPEr   r\   loggerr   )rr   r   orderscriptr5   r5   r6   formatOrderCallback  s,    "zBNRathi.formatOrderCallbackc                 C   s   t |}| |dd|d}tjtjtj|tj|ddtj	|ddtj
|jtj|ddtj|ddtj|d	dtj|d
dtj|ddtj|ddtj|ddtj|ddi}|S )Nr   r   r   erH   lpr   pcvrM   rN   rO   rP   Zap)r   r   r   rA   rQ   r.   r4   rS   rU   rW   rV   symbolFinvasiarX   rZ   r[   r   r]   r^   r_   rY   )rr   rt   r   bar   tickr5   r5   r6   formatTickCallback  s<       
 
  
 
 
 
 
 
 
 
zBNRathi.formatTickCallbackTc                    s   fdd}fdd} fdd}j j}|djj d}|r|djj d	 |rjj|||d
_t	
djj djj  qވjj||d_t	
djj djj  nt	
djj d d S )Nc                    s6   ddd j tj jji}| |  j j |  d S )NMTYPEORDQID)ro   rA   rS   rk   ra   updaterq   publish)r   
identifierrr   r5   r6   event_handler_order_update9  s       
z?BNRathi.subscribeWebSockets.<locals>.event_handler_order_updatec                    s<   t | dddkr8| tj jji  j j	|  d S )Nr   r   )
floatr   r   rA   rS   rk   ra   rq   r   rp   )r   r   r5   r6   event_handler_Tick_updateC  s    z>BNRathi.subscribeWebSockets.<locals>.event_handler_Tick_updatec                     sJ   g }  D ] }|  |d  d|d   qt| dkrBj|  dad S )Nexchange|r   r   T)appendlenrl   	subscribesocket_opened)ZlstSubsriber   lstTicksrr   r5   r6   open_callbackI  s    z2BNRathi.subscribeWebSockets.<locals>.open_callbackZWSrunning
   )Zorder_update_callbacksubscribe_callbacksocket_open_callbackzorder and tick subscribed for :)r   r   ztick subscribed for z&WebSocket already running for account z. Skipping.)rq   ZRedisZsetnxrk   ra   expirerl   Zstart_websocketr:   r   debugnickNamer   )rr   ZorderCallbackr   r   r   r   rlockr5   r   r6   subscribeWebSockets6  s(    
  zBNRathi.subscribeWebSocketsr   Allc           
   #   C   s  | j }g }|dkrh| }|rh|D ]>}|d dkr:q&t|sT|dd|krTq&|d}|d}| jj| jd td	t|d
dt	|d
dt
d|d
dd|d
ddt|d
ddddd|dt|d |d|ddd dd d d d d dt|d
d|d d tdtd|ddd d d!}	||	 q&|dkrt|r| }n|j|d}|r|D ]}|d dkrq|d}|d}| jj| jt|dt|d t	|d t
|d |dd|ddt|d |dd|d dd|dt|d |d|ddd dd d d d d dt|d |d d t|d! t|d! |d d d d!}	||	 q|| _|S )"N)r!   r   statOkZal_idr   r   r   rs   r   Zplace_order_paramsprctypprdr!   rJ   r   dr   r   r   r   r   Znorentmr   )!sourceAccountIdrs   variety	priceTyper   durationaveragePriceZtriggerPricequantityZdisclosedQuantityZ	squareOffstopLossZtrailingStopLossr   r   r   r   ZorderTaginstrumentTypeZstrikePrice
optionTypeZ
expiryDatelotSizeZ
cancelSizeZfilledSharesZunfilledSharesr   textr   ZorderStatusOrderedTimeZExecutionTimeZsourceOrderId)Normalr   )ordernoamor   r   ZtrgprcdscqtyZblprcr   )rl   Zget_pending_gtt_ordersr   r   accountra   r   VARIETY
PRICE_TYPEr   rT   intr   r\   r   Zget_order_bookZsingle_order_historyrk   rg   orders)
rr   r   OrderCatagoryconn	lstOrdersr   ordr   r   r   r5   r5   r6   readOrderBookk  s    





%











%zBNRathi.readOrderBookc                 C   s   | j }| }|S N)rl   Zget_positions)rr   r   	positionsr5   r5   r6   getPositions  s    zBNRathi.getPositionsc                 C   s   | j }g }| }|D ]}|ddkr*q| jj| jj|d|dt|dt|d|ddd t|d	dd|d
|dd t|dt|d t	|dt|dt
|d|d|d|dd}|| q|S )Nr   r   r   r   r   r   r   r   rJ   lsppZflprcZflqtyr   r   ZflidZfltm)r   rs   r   r   Zproducttyper   tradingsymbolZinstrumenttypeZsymbolgroupZstrikepriceZ
optiontypeZ
expirydateZ	marketlot	precision
multiplierZ
tradevaluer   	fillpriceZfillsizeZorderidZfillidZfilltime)rl   Zget_trade_bookr   rk   ra   	broker_idr   r   r   r   r   r   )rr   r   r   r   ZOrdersr   r   r5   r5   r6   readTradeBook  s>    zBNRathi.readTradeBookc                 C   sr  t |tkrd S g }|D ]R}|d dkr`t| j}||d |d |d }|r|d }qhqn|d }t|d }|d dkrd|d< |d	 }	|d }
|d
 }|d }|d }|d }|d }|d }tt|d }|d }|d}|d}|dd}|dd}|	 dkr|r|||dkr2t
nt||dkrHt|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kr|dkr d S |rJ||||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   r   r   r   	stopPricedisclosedQtyr   r   r   isGTTgttBuyBuffergttSellBufferNEWCREATEr   g        r!   )r   r   
alert_typealert_pricebuy_or_sellproduct_typer   
price_typer   remarks	retentionr   discloseqtyr   )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  r   r  )r   r   r   ZnewquantityZnewprice_typeZnewprice)typelistr   rg   r   EXCHNAGE_MAPr   r   r   upperALERT_TYPE_BELOWALERT_TYPE_ABOVEr   r   r   r   r   )rr   actionverboseOrderorderParamsr   brokerr   r   r   r   r   r   prodTyper   r   r   disclQtyofflineOrderr   r   r  r  r  paramr5   r5   r6   prepareOrderParams  s    




 

 zBNRathi.prepareOrderParamsc                 C   s   g }|D ]}|   dkr|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kr|dtt|dttt|d	d
|dd}|	| q|S )Nr  r   r   tradingSymbolr   r   r   r   r      r   r   Falsestoplossr   r   r  sider   r   r   r   r   r!  r   
takeProfitr  r   ra   r  r   r   
r  r   r   r   r   r   strroundr   r   )r  	orderBookr  r   r"  paramsr5   r5   r6   prepareOrderParamsOBl  s2    
zBNRathi.prepareOrderParamsOBr   c                 C   s  g }|D ]}|  dkr|d d|d |d|dkrLtt|ntt|dtt|dtt|d	ttt|d
dd|ddd|ddd}|	| |  dkr|d|dkrtt|ntt|dttt|d
d|dd}|	| q|S )Nr  r   r   r$  ZfillSizer   r   r   r   Z	fillPricer%  r   r   r&  r'  r(  r  r   r+  r,  )rr   r  	tradeBookr   r  trader"  r0  r5   r5   r6   prepareOrderParamsTB  s2    
 
 zBNRathi.prepareOrderParamsTBc           
      C   sp  g }t |dkr|d }|ddk}|rJd|d< | jjf |}d|i}ntt|d|d	|d
|d|d|d|d|d|d|d|d|dd}| j|}|dddkr|d ddd}nd |ddd}|| nn| jjf |}|ddkrl|d}|D ]6}	|	dd|	dd|	ddd}q*|| |S )N   r   r   r!   r   r  r   r
  r  r   r   r   r   r  r  r  r  Zorder_idr   createdokr   r   r   emsgerrsdatabodyra   r   )r   r   rl   place_gtt_orderr   Zplace_orderr   Zplace_basket_orders)
rr   r  Z	lstNewOrdr"  r  responser   r6  	orderDatar<  r5   r5   r6   createOrders  sV    
        



zBNRathi.createOrdersc           	      C   s.  g }t |dkr|d }|ddk}|r^| j|d |d | jjf |}d|i}n^| jjf |}|ddkr|d|d	|dd
}n|d|ddd
}|| nl| jjf |}|ddkr*|d}|D ]>}|dd|dd|ddd}|| q|S )Nr5  r   r   r!   r   r   r   r   resultr8  r9  r:  r;  r7  r<  r=  ra   r   )ZordderIdr   r   )	r   r   rl   Zcancel_gtt_orderpopr>  Zmodify_orderr   Zmodify_basket_orders)	rr   r  ZlstModifiedr0  r  r?  modifiedr@  r<  r5   r5   r6   modifyOrders  s<    


zBNRathi.modifyOrdersN)r   c                 C   s   d zz||  dd}|s"W W  dS |D ]N}|ddkr&|d|ksN|g kr&|rb|d|krbq&| j|d q&W W 8 dS  tk
r } ztt| W 5 d }~X Y nX W 5   dS X  )	NTr   r   Fr   r   r   r   )r   r   rl   Zcancel_orderr{   printr-  )rr   r   r   r/  r   r   r5   r5   r6   cancelOrders  s    $"zBNRathi.cancelOrdersr   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histDateopenhighlowclosevolume)r	   strptime).0itemr   r   r   r5   r6   
<listcomp>=  s   z-BNRathi.getHistoricalData.<locals>.<listcomp>)	strftimerJ  mktimer	   rR  	timetuplereversedrl   get_time_price_series)rr   r   r   r   fromdatetodaterI  ZfdateZtdater<  Z
candleDatar5   rU  r6   getHistoricalData+  s    

zBNRathi.getHistoricalDatac                 C   s   | j |S r   )rl   Zget_holdings)rr   r  r5   r5   r6   getHoldingsL  s    zBNRathi.getHoldings)F)r   r   )r   )r   )r   )N)r0   r1   r2   rf   r   r|   r   r   dictr   r   r   r   r   r   r#  r1  r4  rA  rE  r  rG  r^  r_  __classcell__r5   r5   ru   r6   r`      s$   
?5
o
#j
$71
!r`   ),__doc__logging!trading.NorenRestApiPy.api_helperr   r   trading.Entities.Brokers.brokerr   trading.modelsr   r   utils.viewsr   r   ry   redisrJ  	threadingr	   celeryr
   trading.Redis.pubsubr   Ztrading.views.utilsr   	getLoggerr0   r   r   r\   r   r   r   rT   r   ZSEGMENT_TYPEr  r  r  ZALERT_TYPE_OCOZEXCHANGE_SEGMENTr.   r7   rA   r`   r5   r5   r5   r6   <module>   s   

	
	
'