
    oj                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m	Z	m
Z
mZ dZdZd dZ e       Zed   Zed   Zed	   Zd!d
Zd Zd"dZd Zd Zd Zd Zd Zedk(  rej8                  dd Zes ee         ej>                  d       ed   Z e dk(  r e        ye dk(  r e!e      dk\  r eded          ye dk(  r e!e      dk\  r eded          ye dk(  r e!e      dk\  r}ed   ed   ed   ed   f\  Z"Z#Z$Z% ee# e&e$       e&e%      e"      Z'e'r2 ee'e# e&e$       e&e%      e"      r ed        ej>                  d        ed        ej>                  d       y ee        yy)#uo  
格蕾丝 一键下单脚本 — OKX BTC-USDT-SWAP 逐仓20x
用法:
  python3 grace_execute.py long   0.06  <entry约价>   # 市价开多
  python3 grace_execute.py short  0.06  <entry约价>   # 市价开空
  python3 grace_execute.py oco    0.06  <entry> <tp> <sl>   # 为已有持仓挂OCO
  python3 grace_execute.py close                        # 市价平仓
    N)datetimetimezone	timedeltazhttps://www.okx.comzBTC-USDT-SWAPc                 X   i }t        |       5 }|D ]  }|j                         }|sd|v s|j                  d      r-|j                  dd      \  }}|j                         j                  d      j                  d      ||j                         <    	 d d d        |S # 1 sw Y   |S xY w)N=#   "')openstrip
startswithsplit)pathenvflinekvs         %/root/quant_pipeline/grace_execute.pyload_envr      s    
C	d Aq 	AD::<DtDOOC,@zz#q)1!"!5!;!;C!@AGGI		AA JA Js   BBBABB)OKX_API_KEYOKX_SECRET_KEYOKX_PASSPHRASEc                 ^   t        j                  t        j                        j	                  d      d d dz   }d}|r)ddj                  d |j                         D              z   }||z   }|| z   |z   |z   }t        j                  t        j                  t        j                         |j                         t        j                        j                               j!                         }t"        ||t$        dd	}	t'        j(                  | t*        |z   |	|r|nd d
      }
|
j-                         S )Nz%Y-%m-%dT%H:%M:%S.%fZ ?&c              3   0   K   | ]  \  }}| d |   yw)r   N ).0r   r   s      r   	<genexpr>zokx.<locals>.<genexpr>$   s     B41aqc1#JBs   zapplication/json)zOK-ACCESS-KEYzOK-ACCESS-SIGNzOK-ACCESS-TIMESTAMPzOK-ACCESS-PASSPHRASEzContent-Type   )headersdatatimeout)r   nowr   utcstrftimejoinitemsbase64	b64encodehmacnewSECRETencodehashlibsha256digestdecodeAPI_KEYPASSrequestsrequestBASEjson)methodr   paramsbodytsqsfullmsgsigr&   rs              r   okxrG       s    	hll	#	,	,-C	DSb	IC	OB	B388B6<<>BBB"9D
v+
t
#C


488FMMOSZZ\7>>RYY[
\
c
c
eC '3&($13G 	gDDVZdfgA668O    c                      t        j                  t         dt         d      } t	        | j                         d   d   d         S )Nz/api/v5/market/ticker?instId=r%   )r(   r'   r   last)r:   getr<   INSTfloatr=   )rF   s    r   
get_tickerrN   .   s>    v:4&A2NA&!!$V,--rH   c           
          t        ddt        j                  t        t	        |       dd            }t        d|j                  d      |j                  dd	             y )
NPOSTz/api/v5/account/set-leverageisolated)instIdlevermgnModer@   u   设置杠杆:coderD   r   )rG   r=   dumpsrL   strprintrK   )rS   rF   s     r   set_leveragerZ   2   sH    F2tc%jZXY	[A	/155=!%%r*:;rH   c                 n   t        d       t        d| dt        |      d}t        ddt	        j
                  |            }t        dt	        j
                  |d	
             |j                  d      dk(  r"t        d|d   d   d           |d   d   d   S t        d|j                  d              y)u(   side: buy=开多 sell=开空 (net模式)   rQ   market)rR   tdModesideordTypeszrP   z/api/v5/trade/orderrU   u   下单:Fensure_asciirV   0u   ✅ 开仓成功 ordId=r'   r   ordIdu   ❌ 开仓失败: rD   N)rZ   rL   rX   rG   r=   rW   rY   rK   )r_   ra   r@   rF   s       r   open_posrf   7   s    j$s2w0DF)

40@AA	)TZZ67uuV}'&	!W(='>?@y|G$$	quuU|n
-.rH   c           
         |dk(  rdnd}|dk(  rdnd}t         dt        |       t        |      dt        |      dd|d	}t        dd	t        j                  |      
      }t        dt        j                  |d             |j                  d      dk(  r:t        d|d   d   j                  d              |d   d   j                  d      S t        d|j                  d              y)u  挂OCO: 止盈+止损 (One-cancels-the-other) — net模式
    side: 持仓方向 'long'/'short'
    tp/sl 为价格
    net模式下: 平多 side=sell, 平空 side=buy, 不带posSide
    ordType 必须用 oco (conditional 只支持单向, 会丢 tp/sl)
    longsellbuyrQ   z-1oco)	rR   r^   ra   tpTriggerPxtpOrdPxslTriggerPxslOrdPxr`   r_   rP   z/api/v5/trade/order-algorU   zOCO:Frb   rV   rd   u   ✅ OCO挂载成功 algoId=r'   r   algoIdu   ❌ OCO失败: rD   N)rL   rX   rG   r=   rW   rY   rK   )ra   tpslr_   tp_sidesl_sider@   rF   s           r   
attach_ocoru   D   s     fEGfEG"g2w2w
D 	F.TZZ5EFA	&$**QU34uuV}+AfIaL,<,<X,F+GHIy|))	OAEE%L>
*+rH   c                      t        dddt        i      } | j                  d      dk7  ry | j                  dg       D ]=  }|j                  d      t        k(  st        |j                  dd	            d	k7  s;|c S  y )
NGETz/api/v5/account/positionsrR   r?   rV   rd   r'   posr   )rG   rL   rK   rM   )rF   ps     r   get_positionr{   `   ss    E.$7GHAuuV}UU62 55?d"uQUU5!_'='BH rH   c           	         t        ddt        dd      }|j                  d      dk7  rt        d|j                  d	              y
|j                  dg       D ]h  }|j                  d      | k(  s|j                  d      t	        |      k(  s6|j                  d      t	        |      k(  sTt        d|  d| d|         y t        d|  d| d| d       y
)uD   验证OCO已真实挂载(查API pending algo单), 防止日志伪造rw   z!/api/v5/trade/orders-algo-pendingrk   )rR   r`   rx   rV   rd   u    ❌ OCO验证失败(API错误): rD   Fr'   rp   rl   rn   u   ✅ OCO已确认挂载 algoId=z tp=z sl=Tu   ❌ OCO未找到! algoId=u
    期望tp=u    — 风控裸奔!!)rG   rL   rK   rY   rX   )algo_idra   rq   rr   r_   rF   as          r   
verify_ocor   i   s    E6$[`?abAuuV}0u?@UU62 55?g%!%%*>#b'*IaeeTaNbfijlfmNm27)4t4tLM 
%gYjDDW
XYrH   c                  j   t               } | st        d       y t        | d         dkD  rdnd}t        d| j	                  dd      |d	| j	                  d      d
}t        ddt        j                  t        d| j	                  dd      d            }t        dt        j                  |d             y )NNO_POSITIONry   r   ri   rj   rQ   posSidenetr]   )rR   r^   r   r_   r`   ra   rP   z/api/v5/trade/close-position)rR   rT   r   rU   u   平仓:Frb   )r{   rY   rM   rL   rK   rG   r=   rW   )rz   r_   r@   rF   s       r   	close_posr   v   s    Am1U8_q(6eDjQUU9e=TXQUU5\CDF2t
quuU^`eOfgh	jA	)TZZ67rH   __main__r	   closerh      rj   shortri   rk            OCO_OKOCO_FAIL)z/root/.hermes/.env)Nr   )r\   )(__doc__sysostimer0   r4   r.   r=   r:   r   r   r   r<   rL   r   r   r8   r2   r9   rG   rN   rZ   rf   ru   r{   r   r   __name__argvargsrY   exitcmdlenr_   ra   rq   rr   rM   algor"   rH   r   <module>r      s   2 1 1 1  2 2 j
m
		
.<
8
8 z88AB<Dg
q'C
g~	3t9>Q 	CINa!	#d)q.7DGT!Wd1g=b"b"eBirD9JtRrE"ItD(OCHHQKjg+ rH   