U
    ~rh                     @   s  d dl 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mZmZ d dlm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d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)Z)d dl*Z*d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3Z3e34e5Z6dZ7G dd deZ8eddd0ddZ9d1dd Z:eddd2d"d#Z;d$d% Z<e=e>d&d'd(Z?d)d* Z@eddd3d.d/ZAdS )4    )JobbingSettingsStrategyStatus	Strategis
JobbingLog)Telegram)StrategyN)isBlankOrNoneconvertUTCtoIST)shared_task)datetime)Thread)Broker)BrokerAccount)Decimal)PubSub)getRedisInstance)UserSocialProfile)User)BrokerAccounts	Exchanges)sleep)Q)BytesIO)settings)	MSGATTRIB)EMail)transactionZJOBBINGc                   @   s   e Zd Zd2ddddZd3ddZd4ddZd	d
 Zd5ddZedd Z	edd Z
dd Zdd Zd6ddZd7ddZdd Zd8ddZd9ddZeed eed dddddd!fd"d#Zd:d%d&Zd;d,d-Zd<d.d/Zd=d0d1ZdS )>JobbingN)returnc                 C   s   t | _|| _tjj| jd }|| _t| jj	| _
|s\| j
d| j  td| j || _|j| _| | d| _t | _d S )Ncodez#Err: No strategy defined with code zNo strategy defined with code ZDUMMY)STRATEGY_CODEr    exchanger   objectsfilterfirstr   r   idtelegramsendMessage	ExceptionStrategyMasterisActivegetActiveSetupZMasterQueuer   )selfuserr"   r*    r/   E/home/worker/MarketYantra/Yantra/yantra/trading/Strategies/jobbing.py__init__.   s    
zJobbing.__init__c                 C   s   g }g }t j j| jddddd| _|s4| j}|rH| jj|d| _| jD ]V}|jj	|krl|
|jj	 |jj	|jj|jjj|j|j|jd}||krN|
| qN|| _|| _| jS )NT)r.   r+   Ztarget__isActive	target_idr"   )exchange__code)	accountIdclientIdbrokerIdr"   tokensymbol)r   r#   select_relatedr$   r   order_bySetupsr"   targetr&   appendr5   brokerr6   r7   r8   ActiveAccountsActiveScripts)r-   r"   ZlstActiveAccountslstActiveScriptssetupZactiveScriptr/   r/   r0   r,   >   s,    "
zJobbing.getActiveSetupc                 C   sR   | j jsdS |s| j}|d krB| jd| j  td| j |  }|d kS )NFz"No user defined for strategy code )r*   r+   r   r'   r(   r    r)   r,   )r-   r.   setupsr/   r/   r0   r+   ]   s    zJobbing.isActivec                 C   s   g S Nr/   r-   r/   r/   r0   getScriptForTickCallbackk   s    z Jobbing.getScriptForTickCallbackOPENc                 C   s   t jj|dS )Nstatus)r   r#   r$   r-   rI   r/   r/   r0   	getOrderso   s    zJobbing.getOrdersc                 C   s   dS NTr/   rE   r/   r/   r0   requireOrderCallbacks   s    zJobbing.requireOrderCallbackc                 C   s   dS )NFr/   rE   r/   r/   r0   requireTickCallbackw   s    zJobbing.requireTickCallbackc                 C   s*   t jj| j| jd }|r"|jS d S d S )Nr.   strategy)r   r#   r$   r   r*   r%   
currStatusrJ   r/   r/   r0   	getStatus{   s    zJobbing.getStatusc                 C   sD   t jj| j| jd }|r$||_nt | j| j|dd}|  d S )NrO    )r.   rP   rQ   taskId)r   r#   r$   r   r*   r%   rQ   save)r-   rI   statr/   r/   r0   	setStatus   s    zJobbing.setStatusc              
   C   s^   z(|  d | jd| j d | jW S  tk
rX } zt| W Y dS d }~X Y nX d S )NZ	Initiatedz	Strategy z
 InitiatedF)rW   r'   r(   r    r+   r)   print)r-   r"   excr/   r/   r0   initiate   s    
zJobbing.initiatec              
   C   s   zf| j | j d | | | j | j d | | td | | | j | j d W n6 tk
r } zt	dt
|  W 5 d }~X Y nX d S )Nz : execution startedz : Order tracking started   z : Initial Order Placedzjobbing start error )r'   r(   r    processOrderCallbackprocessTickCallbackr   createInitialOrderr)   loggerdebugstr)r-   brokerAccountr"   er/   r/   r0   start   s    


zJobbing.startc                 C   sD  g }| j D ]}|jj|kr
||jj q
|D ]<}||}| d}|r.dd |D }|| td q.| j D ]}|j}d}	|j	}
|j
}|j}|j}tjj| j|j|jdjdd  tjj| j|j|jdd	gd
d }|rJ|jdkr|j}| j| j d|  n |j}| j| j d| d |jdkr|d}	n2|jdkr^|j}n|j}| j| j d|  |  dkr dS d}d}|j|j krd}|j|j!krd}zL| "| jj|j|jj|j|j#||
|||||||	d|j$|j%|j&|j'|j( W qr t)k
r< } zt*| W Y qrW 5 d}~X Y qrX qrdS )z
        1. Identify unique borker accounts 
        2. Cancel old orders for each broker accounts
        3. Create Initial Order pair for each setup 
        rG   c                 S   s   g | ]
}|j qS r/   orderId).0ordr/   r/   r0   
<listcomp>   s     z.Jobbing.createInitialOrder.<locals>.<listcomp>   F)r.   r"   r7   COMPLETErH   PARTIAL)r.   r"   r7   Z
status__in
-updatedOnr   z : Override Price z : Base Price z as per last TransactionSELLTz$ : no prev record, setup base price 	TERMINATEN)+r;   r<   r&   r=   getBrokerObjectrK   ZcancelOrdersr   simulatebuyLotsellLotbuyTicksellTickr   r#   r$   r   r"   r7   excludedeleter:   r%   priceCurrentr'   r(   r    price	orderType	priceBaserR   stockCurrentstockMaxstockMinexecuteOrderPair	dayOrdersorderCatagorygttBuyBuffergttSellBufferwaitcountr)   rX   )r-   rb   Z	lstAccIdsrB   accId	brokerObjorderslstOrd
simulationflagReverseTicklotSizelotSizeSelltickSizetickSizeSelllog	basePricebuyOnlysellOnlyrY   r/   r/   r0   r^      s    




$(                zJobbing.createInitialOrderc                 C   s   |s
| j }| jg kr| | g }| jr| jD ]@}|rF|d|krFq.|d|dd}||kr.|| q.g }|D ]b}tjdkrtt	| j
t|d|dj
fd}|| qxt	| j
t|d|dj
 qx|D ]}|  qdS )Nr"   r4   )r4   r"   THREADr<   argsT)r"   r@   r,   rM   getr=   r   TRADING_HANDLE_TASKSr   workerS1OrderCallbackr    ra   delayrd   )r-   r"   	lstUniquescriptdictZ
lstThreadsitemt1r/   r/   r0   r\   2  s.    



&$
zJobbing.processOrderCallbackc                 C   s
   | j rdS rL   )rN   )r-   r"   r/   r/   r0   r]   V  s    zJobbing.processTickCallbackAsia/Kolkatark   c	                 C   s   t | j||f|d}	|r&|	t |dM }	|r8|	t |dM }	|rJ|	t |dM }	|r\|	t |dM }	|rn|	t |dM }	tj|	d}
|
S )N)r.   ZtradeDate__rangerI   )r"   re   r2   )r7   )r8   	updatedOn)r   r   r   r#   r$   r:   )r-   Z	startDateZendDater"   r7   r8   rf   brokerAccountIdrI   qFilterlogsr/   r/   r0   getOrderLog\  s    zJobbing.getOrderLogrS   c                 C   s   t jj|||d }|rXttd|_|d |_	|d |_
|dkrN||_|  n~|dkrdd}t ||tjj|d d|d	 |d
d|ttd|d |d |d |d dkrdndd||d d}|  |S )N)user_idr2   rf   r   quantityry   rS   rG   exchSegr   r7   r8   tranTypevarietyNORMALTFr   orderCategory)r   r2   r"   r7   r8   rf   	tradeDater   ry   rz   intraday	currStockrI   r   )r   r#   r$   r%   r   nowpytztimezoner   r   ry   rI   rU   r   r   )r-   useridrf   r   ZverboseOrderrI   r   r/   r/   r0   createOrderLogu  s8    



zJobbing.createOrderLogFr   TNormalrj   c                 C   s   t |jj}||ddrPt| j||j|||||||	|
|||||||||| nBtt| j||j|||||||	|
||||||||||fd}|  d S )Nrj   r   )	r   r>   r6   canPlaceOrderworkerOrderPairr    r&   r   rd   )r-   r   r<   r"   r7   numberOfOrdersr   
lotSizeBuytickSizeBuyr   r   r   r   r   r   	createLogr   r   r   r   r   r>   r   r/   r/   r0   r     s^                                  zJobbing.executeOrderPairc                 C   s  d zĐzd}t jj| jj|||dd}|s:W W  dS |j|d}|D ]8}	|D ],}
|
d |	jkrT|
d|	jkrTt	|
dsT|
d dkr|
d|	_|	
  td	|	j d
|
d    W W  dS |rTddd|jtj|jji}d|
d|jjt|jj|
d|
d|
ddd t|
d|
dddddddd|
dd|
dd}|| |j|j| d}qTqJW n< tk
r } ztd t|  d}W 5 d }~X Y nX W 5 |  S X  )!NFrG   )r   r2   r3   r   rI   TZOrderCatagoryrf   rI   )REJECTEDZCANCELEDrk   order status for orderid  updated to MTYPEORDZQIDZomr"   r8   r   r   rj   r   ZaveragePriceMrS    PENDINGZModAckZLMTDAY0ZOrderedTime)tZ
norenordnouidZactidexchtsymZtrantypeZqtyZprcZpcodeZremarksZ	rejreasonrI   Z
reporttypeZprctypretZ	exchordidZdscqtyZexch_tmz,failed to update missing order message sync )r   r#   r$   r   r&   readOrderBookrf   r   rI   r   rU   r_   r`   OrderQr   Z	ACCOUNTIDAccountr5   ra   updatepubsubpublishr)   error)r-   r   r   targetIdr"   r   Z	defStatuscheckLoglstOrderr   rh   
identifierZlordrc   r/   r/   r0   updateLogStatusFromOrderBook  sn    


,     
            
z$Jobbing.updateLogStatusFromOrderBookc                 C   sz  |  | | jD ]b}||}| }| }| }| jj|d}|D ]}	|	d}
|
D ]}|j|d|dd	 }|r\t
|d|_|D ]H}|d|dkr|d|dkrt|d|_|   q\qq\qJ|D ]}|j|d|dd	 }|rt
|d	|_|D ]N}|d|dkr"|d|dkr"t|d|_|   qq"qqd S )
Nr   Z	exch_tsymr   r7   )r"   r7   ppr"   Z	fillpriceZnetqty)r,   r?   rp   ZgetHoldingsZgetPositionsZreadTradeBookr;   r$   r   r%   intr|   r   rx   rU   )r-   rb   r"   r4   r   ZholdingsZ	positionsZ	tradeBookrC   ZholdingZtsymsr   rB   tradepositionr/   r/   r0   resyncStrategyValues  s6    


(
,zJobbing.resyncStrategyValues)N)N)N)rG   )N)N)N)N)rS   )FFFr   r   FTr   r   r   r   rj   )F)N)__name__
__module____qualname__r1   r,   r+   rF   rK   propertyrM   rN   rR   rW   rZ   rd   r^   r\   r]   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   r   -   sR   





,
f
$
      

'                     
$
.r   T)bindc                 C   sj  t |}tjj|d }|s"d S t|jj}t	|j||}t
|j|}	|	|d |	|}
|
d kr|d td|jj  |jj|d }t|	jd jj}t }||	jd jj|	jd j}|r||j ntd|	jd j  dS ||r2| }|d kr$td	 qzt| |d
ddkrtj |d|j |j kr|d||kr|d||krtd|j  d| d|  |!  W q2|ddkr|"|}|d|krtd|d d|  W qt#|drtd|  W qd}d}d}d}|d dkrP|d dkrTd}nW q|jj|d |d |d }|r|j$}nDd}td|d  d |d   |d|d  d |d   W qt%jj||d d! }|r|j&dkrW q|j'dkrW q|j(}|j)}t*|d" }|d# d$kr:||j+7 }||_$nd}||j+8 }||_$|d|_&||_,t-.t/0d%|_1|2  td&|j& d'|j3 d(|  ||_4|2  d)|j d*|d#  d+|j5j  d|d,  d-|j+ d.| d/}|| t6| |r|r|j$|j7krd}|j$|j8kr&d}td0|j5j  d|j9 d'|  |:|rt;|j |j<j|j=j|j5j |j9d1|||j>|||j?|j@|j)| nJtAt;|j |j<j|j=j|j5j |j9d1|||j>|||j?|j@|j)|fd2}|B  td3|j5j  d|j9 d'|  W q tCk
r. } zt| W 5 d }~X Y qX q|d4| d5 tDE|j<j| |d6| d7 d S )8Nr&   Tz%Error while connecting broker accountz/Error while connecting broker account for user r   r   z"could not get broker instance for Fg      ?typerS   ro   rP   r"   r4   zTermianted :z:Accr   r   r   zother exchange: ord:z: rf   zinvalid order data rI   )rk   rk   r7   )r3   r7   r2   zNo setup found for z : )r2   rf   Z
limitPricer   BUYr   zafter saving in db r   z Qty:zUser:z, -r8   z	 - Qty ( z @ z )zwork order pair initiating for rj   r   zwork order pair completed for zProcess for Exchange z is completedz#Email with trade list for Exchange z is sent)Fr   r   r#   r$   r%   r   r.   r&   r   getStrategyInstancer   Connectrp   r(   r_   r   usernamer;   r   r>   r6   r   ZgetBrokerInstance	subscriber   nickNameZisMarketOpenZget_messager   warningr   r`   r    Zclear_messageZformatOrderCallbackr   r|   r   rI   r+   rr   rs   r   r   r   r   r   r   r   r   rU   rf   rx   r"   infor}   r~   r7   r   r   r   r<   rt   rq   ru   r   rd   r)   sendTradesbyEmailr   )r-   strategyCoder   r"   Z	cancelOldr4   bar'   rP   rb   ZconnObjrB   r>   r   Zbroker_instrh   r   r   ZlogTrader   r   ZcurrLogr   r   r   messager   rY   r/   r/   r0   r     s    



:



 :

	"                   &r   c                 C   sT   |d krt  }nt |d}t| d}|t| dM }tj|ddd}|S )N%Y%m%d)r   )ZtradeDate__dater"   r7   r   )	r   r   strptimer   dater   r#   r$   r:   )r   logDater   r   r/   r/   r0   getLogs  s    

r   rS   c              
   C   s2  |dkrt  }nt |d}t||}tjj|d }tjj|d }|r.t	 }t
jdd}	|	d}
|
ddd	 |
dd
d |
ddd |
ddd |
ddd |
ddd |
ddd |
ddd |
ddd |
ddd d
}|D ]}|
|dt|jd |
|d
|jj |
|d|j |
|d|j |
|d|j |
|d|j |
|d|j |
|d|j |
|d|j |
|d|jd krdnt|jd |d
7 }q|	| t }d|d }d|j d }|jg}|||||d!|d" d#d$ d S )%NrS   r   r   )r.   zutf-8)encodingZTradeLogr   z
Trade Daterj   zExch/Segr[   Token   Name   zOrder Id   z
Trade Type   ZQty   ZPrice   Status	   zExecuted onz%d-%m-%Y %H:%M:%SzDhananjay: Trade Log z%d/%m/%Yz
                Dear  a#  ,
                Enclosed the trade log for the subject date. 
                Trade log is for reference and do not claim to be absolutely true.
                In case you find any issue please reply to this mail.

                Thanks, 
                Team Dhananjay'
                ZtradeLogz%d%m%Yz.xlszapplication/ms-excel) r   r   r   r   r   r#   r$   r%   r   r   xlwtZWorkbookZ	add_sheetwriter	   r   strftimer"   r    r7   r8   rf   rz   r   ry   rI   r   rU   r   
first_nameemailsend)r-   r   r"   r   Z
objLogDater   r.   socialZ	excelfilewbwsZcurrRowr   r  subjectbodyZemailtor/   r/   r0   r     sR    


*
	r   c                   C   s   d S rD   r/   r/   r/   r/   r0   thread1TickCallback  s    r  )r   rf   c                 C   s$   | D ]}| d|kr|  S qd S )Nrf   )r   )r   rf   rh   r/   r/   r0   getOrder  s    
r  c                 C   sD   |  d| d| d| d| d| d| }dt |   S )Nr   zlock:orderpair:)hashlibmd5encode	hexdigest)r   r   r   r7   r"   r   ry   Z
hash_inputr/   r/   r0   get_redis_lock_key%  s    ,r  Fr   rj   c           +      C   s  t jj|d }t|||}t||}||d t	d|j
  t }t|jd jj}||||dkrtd|j
 d| d|  g S ||}g }|dkr|	}|dkr|}d}tjj|||||d	d
}|j|d}|D ]l} |D ]b}!|!d | jkr|!d| jkrt|!ds|!d| _|   t	d| j d|!d  qqtjj|||||d	d
dd}|jdd }"|jdd }#|rtt|t| d}$tt|t|	 d}%n,tt|t|	 d}$tt|t| d}%|dkrh|"} | rd|| j|}|d }&|&rJ|&ddkr@d}'| j}nd}'d}ntd| j d|  nd}'d}t	d|'  t|||||d|$}(|j|(ddt j!drX|j"|'|d||dddd |$|dd!ddd||||d"})t|)d sh|)dd}||||}*t#|*dkrLt	d#|  |j$|j j%|||)d	d$} t	d%| d&|'  |&|) ntd'|  |
dkr|#} | r|j|| jd(d)}|d }!|!r|!ddkrd}'| j}nd}'d}ntd| j d|  nd}'d}t|||||d|%}(|j|(ddt j!drt	d*|'  |j"|'|d||dddd |%|dd!ddd||||d"})t|)d s|)dd}||||}*t#|*dkrt	d#|  |j$|j j%|||)d	d$} t	d%| d&|'  |&|) d S )+Nr   TzBroker Account connected for r   FzOrder place timed out r   rS   rG   )r   r2   r3   r7   r   rI   r   rf   rI   r   r   z
-tradeDaterm   r   )rz   rn   r[   )rG   ZUpdateZCreatezorder not found in order book z token z"order paid: buy order with action 1)Znxexr   LIMITZDELIVERYr   )r   r   zorder created with id rH   zorder updated in log for id z action z,Skipping duplicate workerOrderPair task for All)Z	OrderTypez*sell order processing started with action )'r   r#   r$   r%   r   r   r   r   r_   r`   r   r   r   r   r>   r6   r   r   rp   r   r   rf   r   rI   r   rU   r:   roundfloatr   r  setr   REDIS_LOCK_EXPIRYZsubmitOrderlenr   r&   r=   )+r-   r   r   r   r"   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   rP   rb   redisr>   r   r   rf   r   r   r   rh   ZbuyLogZsellLogZbuyPriceZ	sellPriceorderactionZlock_keyOrderZlstOrderBookr/   r/   r0   r   )  s
   	

	," 	
             
             r   )T)N)rS   )FFFr   r   FTr   r   r   r   rj   )Btrading.modelsr   r   r   r   Zsocial.views.telegramr   trading.Strategies.strategyr   pandaspdutils.viewsr   r	   celeryr
   r   	threadingr   trading.Entities.Brokers.brokerr   -trading.Entities.BrokerAccounts.brokerAccountr   r   decimalr   trading.Redis.pubsubr   r   Zsocial.modelsr   django.contrib.auth.modelsr   r   r   timer   django.db.modelsr   ior   r  r  django.confr   Z trading.Entities.Brokers.bnrathir   Zsocial.views.emailr   	django.dbr   logging	getLoggerr   r_   r!   r   r   r   r   r  listra   r  r  r   r/   r/   r/   r0   <module>   sn   
   r 8

<                     