o
    i`,                     @   s   d 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mZ G dd	 d	eZG d
d deZdS )u[   
Created on 2016年9月25日
@author: Jimmy Liu
@group : waditu
@contact: jimmysoa@sina.cn
    N)Thread)vars)utils)upass)
set_brokerc                   @   s   e Zd ZdZd)ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
d*ddZd*ddZdd Zdd Zdd Zdd Zd+dd Zd,d!d"Zd#d$ Zd%d& Zd'd( ZdS )-	TraderAPIuQ  
    股票实盘交易接口
    提醒：本文涉及的思路和内容仅限于量化投资及程序化交易的研究与尝试，不作为个人或机构常规程序化交易的依据，
    不对实盘的交易风险和政策风险产生的影响负责，如有问题请与我联系。
    投资有风险，下单须谨慎。
     c                 C   s~   |dkrd S || _ tjtjd tjd tjd f | _d| _t	 | _
tjr5t| jd| _| jd d S t| jdd| _d S )Nr   httpscsccscloginT)target)r   daemon)brokervs
CSC_PREFIXP_TYPEDOMAINSPAGEStrade_prefixheart_activerequestssessionssixPY2r   send_heartbeatheart_thread	setDaemon)selfr    r   H/opt/alphahud/venv/lib/python3.10/site-packages/tushare/trader/trader.py__init__   s   
zTraderAPI.__init__c                 C   s   | j jtj | j tjtjd tjd tj	d f  | j tj
tjd tjd tj	d f }| td|du rAtd |   d S )Nr	   r
   r   cscshvimgFuS   请确认账号或密码是否正确 ，或券商服务器是否处于维护中。 )r   headersupdater   AGENTgetr   r   r   r   
V_CODE_URL_loginr   	get_vcodeprint	keepalive)r   resr   r   r    login,   s   zTraderAPI.loginc                 C   sx   t | j}|d d }t||||dddd|d d d	}| jjtjtjd tj	d f |d	}|j
d
dkr:dS dS )Nuserr   falser   passwd)	inputid
j_username	j_inputid
AppendCodeisCheckAppendCodeloginedf_tdxj_cpu
j_passwordr	   r
   paramsu   消息中心TF)up
get_brokerr   dictr   postr   CSC_LOGIN_ACTIONr   r   textfind)r   v_code
brokerinfor/   login_paramsr7   r   r   r    r)   8   s*   
zTraderAPI._loginc                 C   s"   | j  r
d| _d S | j   d S )NT)r   is_aliver   startr   r   r   r    r,   N   s   

zTraderAPI.keepalivec                 C   sH   	 | j rz|  }| | W n   |   Y td ntd q)NTd   
   )r   	heartbeatcheck_account_liver.   timesleep)r   responser   r   r    r   U   s   

zTraderAPI.send_heartbeatc                 C      | j S NbaseinforJ   r   r   r    rM   b      zTraderAPI.heartbeatc                 C   s
   d| _ d S )NF)r   rJ   r   r   r    exitf   s   
zTraderAPI.exitr   c              
   C   6   t | ||||dd}|d dkrd}|S d}|S )u   
    买入证券
        params
        ---------
        stkcode:股票代码，string
        pricce:委托价格，int
        count:买入数量
        amount:买入金额
        BbuyresulttrueTFr   	get_jdata_tradingr   stkcodepricecountamountjsonobjr-   r   r   r    rZ   j   s   
zTraderAPI.buyc              
   C   rX   )u   
    卖出证券
        params
        ---------
        stkcode:股票代码，string
        pricce:委托价格，int
        count:卖出数量
        amount:卖出金额
        Ssellr[   r\   TFr]   r`   r   r   r    rg   z   s   
zTraderAPI.sellc                 C   s   | j tjtjd tjd tjd |||t f }t	|}|d d }	|	d }
|	d }|	d }|
d ur}|d	krJtj
}|rA|n|| d
 d
 }ntj}|rQ|n|| }t|||
||d||t d	}| j jtjtjd tjd tjd f |d}|S d S )Nr	   r
   
tradecheck
returnListr   
buysSecuidfundavlstknamerY   rK   r   )	rl   ra   secuidbuytypebsflag	maxstkqtybuycountbuyprice_trader;   )r   r'   r   TRADE_CHECK_URLr   r   r   r   nowtime_strr^   BUYSELLr@   rA   	TRADE_URL)r   ra   rb   rc   rd   	tradeflag	tradetypetxtdatare   listrm   rk   rl   rn   tradeparamstradeResultr   r   r    r_      sH   
zTraderAPI._tradingc                 C      |   S )u-  
    获取持仓列表
        return:DataFrame
        ----------------------
        stkcode:证券代码
        stkname:证券名称
        stkqty :证券数量
        stkavl :可用数量
        lastprice:最新价格
        costprice:成本价
        income :参考盈亏（元）
        )_get_positionrJ   r   r   r    position   s   zTraderAPI.positionc                 C   s\   | j jtj | j tjtjd tjd tj	d f }t
|}tj|d tjd}|S )Nr	   r
   r   datacolumns)r   r$   r%   r   r&   r'   BASE_URLr   r   r   r   r^   pd	DataFramePOSITION_COLSr   r|   re   dfr   r   r    r      s   
zTraderAPI._get_positionc                 C   sR   | j tjtjd tjd tjd t f }t	|}t
j|d tjd}|S )u  
       获取委托单列表
       return:DataFrame
       ----------
       ordersno:委托单号
       stkcode:证券代码
       stkname:证券名称
       bsflagState:买卖标志
       orderqty:委托数量
       matchqty:成交数量
       orderprice:委托价格
       operdate:交易日期
       opertime:交易时间
       orderdate:下单日期
       state:状态
        r	   r
   entrustlistr   r   )r   r'   r   ENTRUST_LIST_URLr   r   r   r   rv   r^   r   r   ENTRUST_LIST_COLSr   r   r   r    entrust_list   s   
zTraderAPI.entrust_listNc              
   C   s   d}|du |du @ rd}n	t j||f }d}| jt jt jd t jd t jd ||t	 f }t
|}tj|d t jd	}|S )
u0  
    获取成交列表
        params
        -----------
        begin:开始日期  YYYYMMDD
        end:结束日期  YYYYMMDD
        
        return: DataFrame
        -----------
        ordersno:委托单号
        matchcode:成交编号
        trddate:交易日期
        matchtime:交易时间
        stkcode:证券代码
        stkname:证券名称
        bsflagState:买卖标志
        orderprice:委托价格
        matchprice:成交价格
        orderqty:委托数量
        matchqty:成交数量
        matchamt:成交金额
        r   NintraDayallr	   r
   deallistr   r   )r   DEAL_DATE_RANGEr   r'   DEAL_LIST_URLr   r   r   r   rv   r^   r   r   DEAL_LIST_COLS)r   beginend	daterange
selecttyper|   re   r   r   r   r    	deal_list   s   
zTraderAPI.deal_listc                 C   sl   |dk|dk@ r4t ||t d}| jjtjtjd tjd tj	d f |d}t
|j}|d d S d	S )
u  
                 撤单
        params
        -----------
        ordersno:委托单号，多个以逗号分隔，e.g. 1866,1867
        orderdata:委托日期 YYYYMMDD，多个以逗号分隔，对应委托单好
        return
        ------------
        string
        r   )ordersno	orderdaters   r	   r
   cancelr;   msgMapResultSucessN)r@   r   rv   r   rA   r   
CANCEL_URLr   r   r   r^   rC   )r   r   r   r<   r[   re   r   r   r    r     s   &zTraderAPI.cancelc                 C   r   )uO  
    获取帐户基本信息
        return: Series
        -------------
        fundid:帐户ID
        gpsz: 股票市值
        fundvalue:基金市值
        jihelicai:集合理财
        fundbal:帐户余额
        marketvalue:总资产
        fundavl:可用余额
        daixiao:代销份额
        otc:OTC份额
        )_get_baseinforJ   r   r   r    rU   $  s   zTraderAPI.baseinfoc                 C   sf   | j jtj | j tjtjd tjd tj	d f }t
|}|d d }|d |d< t|S )Nr	   r
   baseInfor   
moneytype0fundid)r   r$   r%   r   r&   r'   r   r   r   r   r   r^   r   Series)r   r|   re   stkdatar   r   r    r   5  s   *

zTraderAPI._get_baseinfoc                 C   s$   t |dr|ddkrtd S d S )Nr'   error_noz-1)hasattrr'   NotLoginError)r   return_datar   r   r    check_login_status>  s   zTraderAPI.check_login_status)r   )r   r   r   )NN)r   r   )__name__
__module____qualname____doc__r!   r.   r)   r,   r   rM   rW   rZ   rg   r_   r   r   r   r   r   rU   r   r   r   r   r   r    r      s(    


&


'	r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                    s   t t|   || _d S rS   )superr   r!   r[   )r   r[   	__class__r   r    r!   D  s   
zNotLoginError.__init__c                 C   rR   rS   rT   rJ   r   r   r    rM   G  rV   zNotLoginError.heartbeatrS   )r   r   r   r!   rM   __classcell__r   r   r   r    r   C  s    r   )r   r   pandasr   r   rO   	threadingr   tushare.traderr   r   r   tushare.utilr   r>   tushare.util.upassr   objectr   	Exceptionr   r   r   r   r    <module>   s     1