
    eD              
       @   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
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.d/d0d1Zd2Zd3Zd4Z d-d/d5d.d0d6d7d8d9d:	Z! G 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)MessageQueueFCOMPLETEREJECTEDCANCELEDOPENPARTIAL)r   r   r   PENDINGr   r   NORMAL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"   INTRADAYDELIVERYCOBOMARGIN)ICHr&   Mr+   Equity
Derivative	CommodityCurrencyALL)CASHFOCOMCURr0   NSEMCXBSECDS)r5   r6   r7   r8   LTP_A_OLTP_B_O	LTP_BOS_ONFOBFOBCDNCOBCO)	nse_cmbse_cmnse_fomcx_focde_fomcx_sxbcs_fonse_combse_comc                        e Zd Z fdZdefdZddZd Zd Zd Z	d	g fd
Z
ddZddZd Zd ZddZd Zd ZddZ xZS )BNRathic                 :   t                                          |           || _        t          j                            |                                          | _        d | _        t          | j        j
        j        | j        j        z   dz             | _        d S )N)idr5   )super__init__BrokerIdr   objectsfilterfirstAccountConnectionObjectr   userusernameclientIdQueue)selfbrokerId	accountId	__class__s      XC:\Janisar\Development\Python\Genie\StockGenie\trading\views\Entities\Brokers\bnrathi.pyrO   zBNRathi.__init__j   s|    """!%-44)4DDJJLL $!$,"3"<t|?T"TW\"\]]


    returnc                     t          | j        j                  s2t          j        | j        j                  }|                                S t          d          )NzNot Valid TOTP can be generated)r   rT   factor2SecretpyotpTOTPnow	Exception)rZ   totps     r^   getTOTPzBNRathi.getTOTPt   sH    T\788 	?:dl899D88::=>>>r_   Fc                 v   d }| j         rt          j        t          j                   	 t	          | j                  }t          | j         j                  r|                                 }n| j         j        }| j         j	        r7|
                    | j         j        | j         j        | j         j	                  }n}|                    | j         j        | j         j        || j         j        | j         j        d          }|r8|                    d          | j         _	        | j                                          	 d }|                    dd          }|r	|| _        |S n# t(          $ r |rY d S Y nw xY w||                    | j         j        | j         j        || j         j        | j         j        d          }|                    d          | j         _	        | j                                          || _        |S || _        |S #  dd	| j         j         d
}Y nxY wdd| j         j         d
}|| _        | j        S )N)level)useridpassword	usertokenabc1234)rk   rl   twoFAvendor_code
api_secretimei
susertokenr5   2885i  z*erro while getting connection for account:)statusmessagei  zNo Account with id:)rT   loggingbasicConfigDEBUGr   rP   r   factor2rh   acccessTokenset_sessionrX   rl   login
vendorCodeapiKeygetsave
get_quotesrU   rf   rM   Errors)rZ   sessionOnlyerrorapirz   r}   quoterets           r^   getConnectionObjectzBNRathi.getConnectionObject{   sm   < 7	Xgm4444+s // !566 3"llnnGG"l2G<, 	,OO!%!64<CXdhdpd} ,  EE  II!%!64<CXbi&*l&=DLL_fo & q qE  ,49IIl4K4K1))+++$ ENN588E" #03-"
# ! $ $ $" $#tt$ $$
 =))!\2t|?T^e"&,"9H[bk $ m mC 140E0EDL-L%%''',/D)J,/D)Js"%2p_c_k_n2p2prr!.UDLO.U.UWWE$$s=   DH :"E H E0*H -H /E00BH 9H Hc                 x    	 || j                             d          }|                                 dS #  Y dS xY w)N
ConnectionTF)
connectionr   close_websocket)rZ   wss     r^   closeWebSocketzBNRathi.closeWebSocket   sH    	z_((66   4	55s   04 9c           	      6   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productTypepcodevalidityr   tranTypetrantypeexchSegsymboltoken
limitPriceprc
tradePriceavgprcqtyremQtyr   	filledQtyru   ordDateTimeexch_tm)r   rP   	getScriptr   
getQueueIdrT   rV   rW   rX   rM   PRODUCT_TYPEVALIDITY	TRAN_TYPEr   STATUS)rZ   rv   brokerscriptorders        r^   formatOrderCallbakcMessagez"BNRathi.formatOrderCallbakcMessage   s   &&!!'++f"5"5bV9L9LMM
doodl.?.HI^_f_j_jkq_r_rsvww
dlo
 gkk,77
 l..w{{7/C/CDD	

 hll7;;u+=+=>>
 immGKK
,C,CDD
 gkk&11
 gkk&11
 fl
 gkk%00
 gkk(33
 gkk%00
 a
 gkk%00
 fjjX)>)>??
  gkk)44!
$ r_   c                 L   |                      | 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 )Nr   Ter   tklpr   pcvohlcap)r   r\   exchanger   ltppercvolumeopenhighlowcloseavgTP)r   rT   rV   rW   rX   r   rM   )rZ   rv   ticks      r^   formatTickCallbackMessagez!BNRathi.formatTickCallbackMessage   s    //$,*;*DT\EZ[b[f[fgm[n[norss,/!++c"--!++d2..!++d1--!++d1--!++c!,,!++c!,,!++c!,,!++c!,,!++c!,,!++d1--
 
 r_   Tc                       fd} fd} fd}|r$ j                             |||           _        d S  j                             ||           _        d S )Nc                     t          dt          |           z                                  |           }j                            ||                    d                     d S )Nzorder event: r   )printstrr   rY   lpushr   )rv   r   rZ   s     r^   event_handler_order_updatez?BNRathi.subscribeWebSockets.<locals>.event_handler_order_update   sY    /CLL011133G<<EJUEIIi$8$899999r_   c                     t          |                     dd                    dk    rE                    |           }j                            ||                    d                     d S d S )Nr   r   r   )floatr   r   rY   r   )rv   r   rZ   s     r^   event_handler_Tick_updatez>BNRathi.subscribeWebSockets.<locals>.event_handler_Tick_update   si    W[[a(())A--55g>>
  txx	':':;;;;; .-r_   c                      g } D ](}|                      |d          d|d                     )t          |           dk    rj                            |            dad S )Nr   |r   r   T)appendlenrU   	subscribesocket_opened)lstSubsriber   lstTicksrZ   s     r^   open_callbackz2BNRathi.subscribeWebSockets.<locals>.open_callback   sz    K" N N""fZ&8#L#L6'?#L#LMMMM;!##%//<<< MMMr_   )order_update_callbacksubscribe_callbacksocket_open_callback)r   r   )rU   start_websocketr   )rZ   orderCallbackr   r   r   r   s   ` `   r^   subscribeWebSocketszBNRathi.subscribeWebSockets   s    	: 	: 	: 	: 	:	< 	< 	< 	< 	<		! 		! 		! 		! 		! 		!  
	+;;*D*C*7 <  DGGG +;;*C*7 <  DGGGr_   r   Allc           	         | j         }g }|dv r|                                }|r|D ]}|d         dk    rt          |          s|                    dd          |k    r:|                    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 }	|                    |	           |d7v rt          |          r|                                }n|                    |8          }|rc|D ]_}|d         dk    r|                    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 }	|                    |	           a|| _        |S )?N)r"   r   statOkal_idr   r   r   sourceAccountIdr[   varietyr   	priceTypeplace_order_paramsprctypr   prddurationr"   averagePricer   r   triggerPricedquantityr   disclosedQuantity	squareOffstopLosstrailingStopLossr   r   r   r   r   r   orderTaginstrumentTypestrikePrice
optionType
expiryDatelotSize
cancelSizefilledSharesunfilledSharesr   textru   r   orderStatusOrderedTimenorentmr   ExecutionTimesourceOrderId)Normalr   )ordernoamor   r   trgprcdscqtyblprc)rU   get_pending_gtt_ordersr   r   accountrM   r   VARIETY
PRICE_TYPEr   r   intr   r   r   get_order_booksingle_order_historyrT   rP   orders)
rZ   r   OrderCatagoryconn	lstOrdersr  ordr   r   r   s
             r^   readOrderBookzBNRathi.readOrderBook  s    $	M))0022F /,! ., .,C6{d** (11 !cgggl6S6SW^6^6^ "wwvH WWV__F$)dlo$"doj.I$ "gkk$.?.?$ $jnnSWWEY=Z=Z=^=^_g=h=h.i.i	$ &l.>.>swwG[?\?\?`?`af?g?g.h.h$ #hll5.A.A$ 'cgg6J.K.K.O.OPUVW.X.X$ 'cgg6J.K.K.O.OPSTU.V.V$ #c#'':N2O2O2S2STY2Z2Z.[.[$ ,a$ $a$ #a$ +a$ !cggfoo$  #immC
O.L.L!$" #cggfoo#$$  cgggb.A.A%$ $& #d'$( )b)$* &d+$, %d-$. %d/$0 "d1$2 %d3$4 'a5$6 )c#'':N2O2O2S2STY2Z2Z.[.[7$8 "c'l9$: d;$< !fjj.@.@=$> &fjj.@.@?$@ &cggi	.J.JA$B (dC$F (dG$ $EJ $$U++++,,,W%% D,,..2272CC -,! ,, ,,C6{d** "wwvH WWV__F$)dlo$"dm$ "gkk#''%...I.I$ $jnnS].K.K	$ &l.>.>s5z.J.J$ #hll3u:.F.F$ 'cgghq.A.A$ 'cgghq.A.A$ #c#e*oo$ ,cggh.?.?$ $a$ #cggga.@.@$ +a$ !cggfoo$  #immC
O.L.L!$" #cggfoo#$$  cgggb.A.A%$ $& #d'$( )b)$* &d+$, %d-$. %d/$0 "d1$2 %d3$4 'a5$6 )c#e*oo7$8 "c,.?9$: d;$< !fjjX.G.G=$> &fjjX.G.G?$@ &c)nA$B (dC$F (dG$ $EJ $$U++++r_   c           	         | j         d         dk    r| j         d         }nd S g }|                                }|D ],}|                    d          dk    r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                    z  dt                              |                    d                     d!t          |                    d                    t          |                    d                    |                    d"          |                    d#          |                    d$          d%}|
                    |           .|S )&Nru      r   r   r   r   r[   r   r   producttyper   r   r   tradingsymbolr   instrumenttyper   symbolgroupstrikepricer   
optiontype
expirydate	marketlotls	precisionpp
multiplier
tradevalueflprcflqtyr   r   	fillpricer   flidfltm)fillsizeorderidfillidfilltime)r   get_trade_bookr   r  rM   r   r  r   r   r  r   )rZ   r   r  r  Ordersr  r   s          r^   readTradeBookzBNRathi.readTradeBook  sq   ?8$++?<0DD4	$$&& 	$ 	$Cwwv$&&!dlodoj&A cggfoo l&6&6swwu~~&F&F	
 jnnSWWX5F5F&G&G  cggfoo !b d eCGGENN&;&; b b cggdmm cggdmm d eCGGG,<,<&=&=cgggFVFV@W@W&W  immCGGJ4G4G&H&H!" eCGGG,<,<&=&=#$ '*#'''*:*:&;&;&)ggl&;&;&)ggfoo&)ggfoo+  E. U####r_   c                    t          |          t          k    rd S g }|D ]F}|d         dk    rIt          | j                  }|                    |d         |d         |d                   }|r	|d         }n	X|d         }t
                              |d                   }|d         dk    rd|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    rt          nt          ||dk    rt          |          nt          |dz            z
  t          t          |          t          t          |          |	t          t          |
          dd |ddd}nst                              |                    d                    t          t          |          t          t          |          |||	|t          t          |
          |d |dd}|                    |           |	                                dv r|dk    r d S |r||||dk    rt          nt          ||dk    rt          |          nt          |dz            z
  t          t          |          t          t          |          |	t          t          |
          dd |ddd}n||||	t          t          |
          |d}|                    |           H|S ) Nr   r8   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_typer4  remarks	retentionr   discloseqtyr   )r  r@  rA  r   r  r   rE  rB  r4  trigger_pricerD  rC  UPDATEMODIFYCHANGE)r  r  r   r>  r?  r@  rA  r   rB  r4  rC  rD  r   rE  )r   r  r  newquantitynewprice_typenewprice)typelistr   rP   r   EXCHNAGE_MAPr   r	   r  upperALERT_TYPE_BELOWALERT_TYPE_ABOVEr   r   r   r  r   )rZ   actionverboseOrderorderParamsr   r   r   r   r   r   r   r   prodTyper4  r   r5  disclQtyofflineOrderr   r   r7  r8  r9  params                           r^   prepareOrderParamszBNRathi.prepareOrderParams  s   %%4! `	* `	*EY5((..))%	*:E'NERZO\\ "8_FFx#''i(899H[!X--!"g $J/H#K0I#J/H#M2H#GnE#J/H#K0I#N3H*753CDDL#J/H#ii	22G#ii00E#ii::L#ii;;M||~~"222 ,2,4@HE@Q@Q,<,<Wg,1XY^M^M^eL6I6I6Idijwz|j|d}d},~,8H,M,M,8x,P,P,4,8I,N,N,/,0,4,1+, EE$ +2++eii	6J6J*K*K*6y(*K*K*6|X*N*N*2*0*2*2*6z)*L*L*/*.*2*, E ""5)))||~~">>>b==44 ,3,2,4@HE@Q@Q,<,<Wg,1XY^M^M^eL6I6I6Idijwz|j|d}d},~,8H,M,M,8x,P,P,4,8I,N,N,/,0,4,1,- EE$ +3*0*1*2*6z)*L*L*/ E ""5)))r_   c                 "   g }|D ]}|                                  dv r5|                    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 r|                    d          t          t          |                    d                    t          t          t          |                    d	                    d
                    |                    d          d}|	                    |           
|S )Nr:  r   :tradingSymbolr   r   r   r   r4     r   r   Falsestoplossr   r   rN  sider   r   r5  r   r6  rY  r   
takeProfitrG  r   rM   rN  r   r   
rQ  r   r	   r  r   r   r   roundr   r   )rT  	orderBookrV  r   rZ  paramss         r^   prepareOrderParamsOBzBNRathi.prepareOrderParamsOB  s    	+ 	+E||~~"222).:)>)>&]&]?A[A[&]&]&+ii
&;&;&2:eii>T>T&U&U&29UYYz=R=R&S&S&2<=AYAY&Z&Z&)%eii6H6H0I0I!*L*L&M&M&'&+ii
&;&;&'&-&+ii
&;&;&'  ""6***||~~">>>9--)*UYY{5K5KLL"%eE%))G2D2D,E,Ea&H&H"I"I 99Z00	  ""6***r_   r   c                    g }|D ]>}|                                 dv rP|                    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    rt          t          |          n't          t          |                    d                    t          t          t          |                    d
                    d                    |                    d          d}|	                    |           @|S )Nr:  r   r]  r^  fillSizer   r   r   r   	fillPricer_  r   r   r`  ra  rb  rG  r   re  rf  )rZ   rT  	tradeBookr   rV  traderZ  ri  s           r^   prepareOrderParamsTBzBNRathi.prepareOrderParamsTB0  s7    	+ 	+E||~~"222 */:)>)>&]&]?A[A[&]&]&+ii
&;&;MVZ\__l:y&I&I&Ibnoyz  {D  {D  EP  {Q  {Q  cR  cR&29eii
>S>S&T&T&2<=AYAY&Z&Z&)%eii6L6L0M0Ma*P*P&Q&Q&'&+ii
&;&;&'&-&+ii
&;&;&'  ""6***||~~">>> ',ii	&:&:MVZ\__l:y&I&I&Ibnoyz  {D  {D  EP  {Q  {Q  cR  cR&)%eii6L6L0M0Ma*P*P&Q&Q&+ii
&;&;	  ""6***r_   c                 4   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    r|d         ddd}nd |                    d          dd}|                    |           n | j        j        di |}|                    d          dk    r|                    d          }|D ]z}	|	                    d                              d          |	                    d                              d          |	                    d                              d          d}{|                    |           |S )N   r   r   r"   r   rB  r   r@  rA  r   r  r   r4  rF  rE  rD  rC  order_idr   createdokr   rv   ru   emsgerrsdatabodyrM   rv    )r   r   rU   place_gtt_orderr   place_orderr   place_basket_orders)
rZ   rV  	lstNewOrdrZ  r7  responser   rt  	orderDatarz  s
             r^   createOrderszBNRathi.createOrdersT  s    	{q  NEIIj))U2E D&+l#@40@II5II((3IIm,,UYY~-F-FuyyQ[G\G\IIo..uyy/F/F		R\H]H]IIg&&		/(B(BEIImD\D\IIk**EIIi,@,@%))JWYBZBZ	   0<<UCC||L,,22"*<"8"+"&  #'"*,,v"6"6"'  W%%%% At,@OO;OOH||C  D(($LL00	%  D&*hhv&6&6&:&:4&@&@&*hhv&6&6&:&:9&E&E&*hhv&6&6&:&:3&?&? GG
   )))r_   c                 *   g }t          |          dk    r*|d         }|                    d          dk    }|rZ| j                            |                    d                     |                    d            | j        j        di |}d|i}n | j        j        di |}|                    d          dk    r@|                    d          |                    d	          |                    d          d
}n,|                    d          |                    d          dd
}|                    |           n | j        j        di |}|                    d          dk    r|                    d          }|D ]}|                    d                              d          |                    d                              d          |                    d                              d          d}|                    |           |S )Nrr  r   r   r"   r  r   r   r   resultrv  rw  rx  ry  ru  rz  r{  rM   rv   )ordderIdrv   ru   r|  )	r   r   rU   cancel_gtt_orderpopr}  modify_orderr   modify_basket_orders)	rZ   rV  lstModifiedri  r7  r  modifiedr  rz  s	            r^   modifyOrderszBNRathi.modifyOrders  s+    {q   ^FJJz**e3E -%66vzz)7L7LMMM

9%%%@40@JJ6JJ((3=40=GGGG<<''4//&,jj&;&;&.ll8&<&<&.ll6&:&:   HH '-jj&;&;&.ll6&:&:&+   H ""8,,,, Bt,APPKPPH||C  D(($LL00	% 1 1D&*hhv&6&6&:&:4&@&@&*hhv&6&6&:&:9&E&E&*hhv&6&6&:&:3&?&?   H
  &&x0000r_   r   c           	         |dk    rd}|                     d          }|                     d          }t          j        t          j        |d                                                    }t          j        t          j        |d                                                    }t          | j                            |||                    }	fd|	D             }
|
S )Nr      z%d/%m/%Y)intervalc                     g | ]E}t          j        |d          d          |d         |d         |d         |d         |d         d	FS )timez%d-%m-%Y %H:%M:%Sintointhintlintcintv)	r   r   r   histDater   r   r   r   r   )r
   strptime).0itemr   r   r   s     r^   
<listcomp>z-BNRathi.getHistoricalData.<locals>.<listcomp>  ss         #*"("'"*"3DLBU"V"V"&v,"&v,"&v,"&v,"&v,
 
  r_   )	strftimer  mktimer
   r  	timetuplereversedrU   get_time_price_series)rZ   r   r   r   fromdatetodater  fdatetdaterz  
candleDatas    ```       r^   getHistoricalDatazBNRathi.getHistoricalData  s     uH !!*--
++H-eZ@@JJLLMMH-eZ@@JJLLMM-CCGUTY[`ltCuuvv       $  
 r_   )F)r   r   )r   )r   )r   )__name__
__module____qualname__rO   r  rh   r   r   r   r   r   r  r2  r[  rj  rp  r  r  r  __classcell__)r]   s   @r^   rK   rK   i   sO       ^ ^ ^ ^ ^? ? ? ? ?<% <% <% <%|    .  " 372 % % % %Rm m m m^# # # #Jg g gT  >! ! ! !H5 5 5n/ / /b       r_   rK   )#__doc__rw   !trading.NorenRestApiPy.api_helperr   r   %trading.views.Entities.Brokers.brokerr   trading.modelsr   r   mainapp.views.utilsr   r	   rc   r  	threadingr
   celeryr    trading.views.Redis.messageQueuer   r   r   r  r   r  r   r   SEGMENT_TYPErP  rS  rR  ALERT_TYPE_OCOEXCHANGE_SEGMENTrK   r|  r_   r^   <module>r     s"   
  ? ? ? ? ? ? ? ? 9 8 8 8 8 8 2 2 2 2 2 2 2 2 ; ; ; ; ; ; ; ;                      9 9 9 9 9 9 
 
   
	 	 	 
 	      	     
 
 r	 r	 r	 r	 r	f r	 r	 r	 r	 r	r_   