admin
2025-04-08 70b51a2636858fb8cfbf39d3764d88d07286d8ad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
B
Â[gíPã@s¸dZddlZddlZddlZddlZddlZddlZddlZddlm    Z    ddl
m Z m Z m Z mZmZddlmZmZddlmZmZmZddlZGdd„dƒZejjd    d
Ze ¡Zejd œd d „Zdd„Z edœdd„Z!e"dœdd„Z#da$dd„Z%dd„Z&Gdd„dƒZ'dZ(dZ)dZ*dZ+iZ,d d!„Z-d"d#„Z.d:d%d&„Z/e*dfd'd(„Z0d)d*„Z1d;d+d,„Z2iZ3d<d-d.„Z4dde*fd/d0„Z5de*fd1d2„Z6d=d3d4„Z7d>d5d6„Z8d7d8„Z9e:d9kr´e;e7ƒƒdS)?u
交易API
éN)Úasync_log_util)Úhx_logger_trade_debugÚhx_logger_trade_loopÚhx_logger_trade_callbackÚ logger_tradeÚ logger_system)Úhuaxin_trade_data_updateÚmiddle_api_protocol)Ú socket_utilÚ huaxin_utilÚtoolc@seZdZdZdd„ZdS)Ú TradeCallbacku
    äº¤æ˜“回调
    cCsdS)N©)ÚselfÚ
order_inforrõ8D:\量化低吸\low_suction_hx\trade\huaxin_trade_api.pyÚon_orderszTradeCallback.on_orderN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rrrrrr sr é)Ú max_workers)ÚqueuecCsØdd„}t dt ¡›¡|dk    rÔx®yœ| ¡}|rÀt |¡}|d}|dkrv|d}t td|›¡t     
||¡nJ|dkrÀz>|d    }|d}t t|›¡|d
krºt rºt   | d    ¡¡WdXWq&Yq&Xq&WdS) NcSs8d|kr dSt td|d›¡t|d|dƒdS)NÚ
request_iduresponse:request_id-Údata)rÚinforÚ set_response)Ú    data_jsonrrrÚ__set_response#sz.__run_recv_queue_trade.<locals>.__set_responseu0huaxin_trade_api __run_recv_pipe_trade çº¿ç¨‹ID:ÚtypeÚresponseruresponse:request_id-Útrade_callbackrr) rrr Ú get_thread_idÚgetÚjsonÚloadsrrÚ__response_thread_poolÚsubmitr"r)rrÚvalrÚtype_rÚctyperrrÚ__run_recv_queue_trade!s2
 r,c Csft d¡xVtdƒD]J}t d¡t ¡}tdddddd    |d
d t d¡tddd |d    d qWdS)Né<éééÚ000333édgð?éFg®Gáz®ï?)Ú
price_typeÚblockingÚ    order_refÚ shadow_priceZ123123)ÚorderRefr5)ÚtimeÚsleepÚranger Úcreate_order_refÚorderÚ cancel_order)Úir6rrrÚ __test_orderLs
 
 
r@)Útrade_callback_cs&ˆa|atj‡fdd„dd ¡dS)u€
    :param trade_callback_: è®¢å•回调
    :param queue_strategy_r_trade_w_: æŽ¥æ”¶äº¤æ˜“结果数据队列
    :return:
    cstˆƒS)N)r,r)Úqueue_strategy_r_trade_w_rrÚ<lambda>cózrun_trade.<locals>.<lambda>T)ÚtargetÚdaemonN)Úqueue_strategy_r_trade_wr"Ú    threadingÚThreadÚstart)rBrAr)rBrÚ    run_tradeXsrK)Údata_strcCst |¡dS)uD
    è®¾ç½®äº¤æ˜“响应数据
    :param data_str:
    :return:
    N)rGÚ
put_nowait)rLrrrÚadd_trade_callback_datafsrNcCsdS)NTrrrrrÚis_pipe_channel_normaltsrOcCsTt dd¡}t|ƒ}|ddkr<|ddd|kr<dadStd7atdkrPdad    S)
Nri@BÚcoderÚsidTr0r2F)ÚrandomÚrandintÚ__test_trade_channelÚtrade_pipe_channel_error_count)rQÚresultrrrÚtest_trade_channelys  rWc@s”eZdZdZdZdZdZdZdZdZ    iZ
iZ iZ e dd    „ƒZe d
d „ƒZe d d „ƒZe dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZdS)ÚClientSocketManagerÚtradeZ delegate_listZ    deal_listZ position_listZmoneyZdealZl2_cmdcCs>||jkr"||jkr:|j |¡Sn||jkr:|j |¡gSgS)N)ÚCLIENT_TYPE_TRADEÚsocket_client_dictr$)ÚclsÚ_typerrrÚ list_client“s 
 
 
zClientSocketManager.list_clientcCsr||jkrR||jkrg|j|<|j| ||f¡t ¡|j|<t d|›¡n||f|j|<t ¡|j|<dS)Nz add_client:)rZr[ÚappendrHÚLockÚsocket_client_lock_dictrr)r\r]ÚridÚskrrrÚ
add_clients
 
 
zClientSocketManager.add_clientcCs||jkr|j| ¡SdS)N)raÚlocked)r\rbrrrÚis_client_locked«s
z$ClientSocketManager.is_client_lockedc    s4|ˆjkrÐ|ˆjkrÎtˆj|‡fdd„dd}t dt|ƒ›¡t dtˆj ¡ƒ›¡xÐ|D]f}|dˆjkrdy2ˆj|djdd    r¦t d
|d›¡|SWqdt    j
k
rÈt  d ¡YqdXqdWn`|ˆjkr0y:ˆj|}|dˆjkrˆj|djdd    r|SWnt    j
k
r.YnXdS) Ncs"|dˆjkrˆj |d¡SdS)Nr)Úactive_client_dictr$)Úx)r\rrrC¶sz4ClientSocketManager.acquire_client.<locals>.<lambda>T)ÚkeyÚreverseu#acquire_client client_list数量:u/acquire_client socket_client_lock_dict数量:rF)r5zacquire_client success:zacquire_client TimeoutError) rZr[ÚsortedrrÚlenraÚkeysÚacquirerHÚ TimeoutErrorÚerror)r\r]Z client_listÚdr)r\rÚacquire_client±s0
 
 
 
z"ClientSocketManager.acquire_clientcCsXd}||jkr.d}|j| ¡r.|j| ¡|rDt d|›¡nt d|›¡dS)NFTzrelease_client success:zrelease_client fail:)rareÚreleaserr)r\Z    client_idZsucessrrrÚrelease_clientÏs
z"ClientSocketManager.release_clientcCsä||jkr|j |¡xÈ|jD]¾}t|j|ƒtkr†x¦|j|D]@}|d|kr@y|d ¡Wn YnX|j| |¡Pq@Wqt|j|ƒtkr|j|d|kry|j|d ¡Wn YnX|j |¡PqWdS)Nrr0)raÚpopr[r ÚlistÚcloseÚremoveÚtuple)r\rbÚtrqrrrÚ
del_clientÜs(
    zClientSocketManager.del_clientcCst ¡|j|<dS)N)r9rg)r\rbrrrÚheartùszClientSocketManager.heartcCs8x2|j ¡D]$}t ¡|j|dkr | |¡q WdS)Nr.)rgrmr9r{)r\ÚkrrrÚdel_invalid_clientsýsz'ClientSocketManager.del_invalid_clientsN)rrrrZÚCLIENT_TYPE_DELEGATE_LISTÚCLIENT_TYPE_DEAL_LISTÚCLIENT_TYPE_POSITION_LISTÚCLIENT_TYPE_MONEYZCLIENT_TYPE_DEALZCLIENT_TYPE_CMD_L2r[rargÚ classmethodr^rdrfrrrtr{r|r~rrrrrX†s$
    rXr0r3g@Tc    Cs*d|›dtt ¡dƒ›dt dd¡›S)NÚr_Ú_i'ri †)Úroundr9rRrS)r rrrÚ__get_request_idsr‡c
CsPt ||¡}ytj|dd}t||ƒWn"tk
rJ}zWdd}~XYnXdS)ub
    è¯·æ±‚仿真交易
    :param request_id:
    :param type:
    :param data:
    :return:
    i$')ÚportN)r    Zload_simulation_tradeÚrequestrÚ    Exception)rr rZfdatarVÚerrrÚ__request_delegates  rŒFc    
Cs,|s t|ƒ}yœ|r"t tdd|¡|||t ¡dœ}t |¡}t ¡}tjt    |||fdd 
¡t t ¡|dƒ}|dkr”t td|›d    |›¡|r¦t td
|¡Wn~t k
râ}zt td |t |ƒ¡|‚Wd d }~XYnFtk
r&}z&t td |t |ƒ¡t |¡|‚Wd d }~XYnX|S)uÿ
    è¯·æ±‚,将交易(包含下单/撤单)与查询(包含查持仓/账户可用金额/委托列表/成交列表)队列分离
    @param _type:
    @param data:
    @param request_id:
    @param log_enable:
    @param is_trade:
    @return:
    u/请求发送开始:client_id-{} request_id-{}r)r rrr9T)rEÚargsrFièé
u发送耗时:request_id-u è€—时时间:u"请求发送成功:request_id-{}u+请求发送异常:request_id-{} error-{}Nu,请求发送异常: request_id-{} error-{})r‡rrrr9r
Zencryp_client_params_signrHrIrŒrJÚintÚBrokenPipeErrorÚstrrŠÚloggingÚ    exception)    r]rrÚ
log_enableÚis_tradeZ    root_dataÚ
start_timeZuse_timer‹rrrÚ    __request's2
 
 
r—cCs€|r|t ¡}zlxft d¡|tkrBt |¡}|r>t td|¡|St ¡||kr|rdt td|¡td|›ƒ‚qWWdXdS)Ng{®Gázt?u#请求读取成功: request_id-{}u#请求读取超时: request_id-{}u读取内容超时: request_id=)r9r:Ú__request_response_dictrurrrrŠ)rr5Útimeoutr”r–rVrrrÚ__read_responseNs 
 
ršcCs*|r&t td|›d|›¡|t|<ndS)Nu请求响应: request_id-u å†…容-)rrrr˜)rr!rrrres
rc
Cs¦tt ¡dƒ}
|s$d|›d|
›}|s0t ¡}|s>ttjƒ}x<tdƒD]0} ttjtjd|||||||    ||dœ |dd}qHWz|rŒt    ||ƒSd|iSWd    t
  ¡Xd    S)
uU
    ä¸‹å•委托
    @param direction: 1-ä¹°  2-卖
    @param code:
    @param volume:交易量
    @param price:价格(如果是卖时不传价格就按照5挡价卖)
    @param price_type:
    @param blocking:是否阻塞进程
    @param sinfo:
    @param request_id:
    @param order_ref:
    @param shadow_price:
    @return:
    ièZb_r…r0) r Ú
trade_typeÚ    directionrPr6Úvolumer4Úpricer7Úsinfor5T)rr•r6N) r†r9r r<r‡rXrZr;r—ršrÚadd_money_list) rœrPrržr4r5rŸrr6r7Ú    timestampr?rrrr=os.
 
 r=c
Csìt t ¡d¡dkr,t t ¡d¡dkr,dS|sZd|›dtt ¡dƒ›dt dd¡›}t ¡}|spt    t
j ƒ}|t kr‚t ƒt |<t | t ||f¡¡x6tdƒD]*}    tt
j t
j d||||||d    œ|d
d }q¤Wz
t||ƒSt ¡XdS) Nz14:57:00rz15:00:01Zcb_r…ièi'r3)r r›rœrPr8ZorderActionRefÚ
orderSysIDrŸT)rr•)r Útrade_time_subÚget_now_time_strr†r9rRrSr r<r‡rXrZÚ__canceling_order_dictÚsetÚaddr%Údumpsr;r—ršrr )
rœrPr¢r8r5rŸrZrecancelZorder_action_refr?rrrr>žs,
*
 
 
r>cCs*ttjtj|rdnddœƒ}t|||dS)u
    å§”托列表
    :param can_cancel:
    :param blocking:
    :param timeout:
    :return: ä¾‹å¦‚:{'code': 0, 'data': [{'securityID': '002400', 'orderLocalID': 'P900046788', 'direction': '0', 'orderSysID': '12002P900046788', 'insertTime': '13:11:40', 'insertDate': '20250109', 'acceptTime': '13:11:22', 'cancelTime': '', 'limitPrice': 8.23, 'accountID': '00044396', 'turnover': 0.0, 'orderRef': 131161, 'volume': 1000, 'volumeTraded': 0, 'orderStatus': '2', 'orderSubmitStatus': '1', 'statusMsg': ''}]}
    r0r)r Ú
can_cancel)r™)r—rXrrš)r©r5r™rrrrÚget_delegate_listÆsrªcCs ttjdtjiƒ}t|||dS)u—
    èŽ·å–æˆäº¤åˆ—è¡¨
    :param blocking:
    :param timeout:
    :return:  {'code': 0, 'data': [{'tradeID': '17211275', 'securityID': '002184', 'orderLocalID': 'P900046786', 'direction': '0', 'orderSysID': '12002P900046786', 'price': 20.31, 'tradeTime': '13:11:40', 'volume': 1000, 'tradeDate': '20250109', 'tradingDay': '20250109', 'pbuID': '232600', 'accountID': '00044396', 'orderRef': 131146}]}
    r )r™)r—rXr€rš)r5r™rrrrÚ get_deal_listÖs r«cCsttjdtjiƒ}t||ƒS)u“
    èŽ·å–æŒä»“åˆ—è¡¨
    :param blocking:
    :return: {'code': 0, 'data': [{'investorID': '00044396', 'tradingDay': '20250109', 'securityName': '海得控制', 'securityID': '002184', 'historyPos': 0, 'historyPosFrozen': 0, 'todayBSPos': 1000, 'todayBSPosFrozen': 0, 'historyPosPrice': 0.0, 'totalPosCost': 20316.176271, 'prePosition': 0, 'availablePosition': 0, 'currentPosition': 1000, 'openPosCost': 20310.0, 'todayCommission': 6.176271, 'todayTotalBuyAmount': 20310.0, 'todayTotalSellAmount': 0.0}, {'investorID': '00044396', 'tradingDay': '20250109', 'securityName': '省广集团', 'securityID': '002400', 'historyPos': 0, 'historyPosFrozen': 0, 'todayBSPos': 0, 'todayBSPosFrozen': 0, 'historyPosPrice': 0.0, 'totalPosCost': 0.0, 'prePosition': 0, 'availablePosition': 0, 'currentPosition': 0, 'openPosCost': 0.0, 'todayCommission': 0.0, 'todayTotalBuyAmount': 8230.0, 'todayTotalSellAmount': 0.0}]}
    r )r—rXrrš)r5rrrrÚget_position_listãs r¬cCsttjdtjiƒ}t||ƒS)u)
    èŽ·å–è´¦æˆ·èµ„é‡‘çŠ¶å†µ
    :param blocking:
    :return: ç¤ºä¾‹ï¼š {'code': 0, 'data': [{'departmentID': '0001', 'investorID': '00032047', 'accountID': '00032047', 'currencyID': '1', 'usefulMoney': 39305420.68, 'frozenCash': 0.0, 'fetchLimit': 39305420.68, 'preDeposit': 39305420.68}]}
    r )r—rXr‚rš)r5rrrrÚ    get_moneyïs r­cCs&tddd|idœdd}t|dddS)NÚtestrQ)r rF)r”T)r—rš)rQrrrrrTûsrTÚ__main__)NTF)r3FNNNN)NFNNF)T)T)<rr%r’ÚmultiprocessingrrRrHr9Ú
log_modulerÚlog_module.logrrrrrrYrr    Úutilsr
r r Úconcurrent.futuresÚ
concurrentr ÚfuturesÚThreadPoolExecutorr'ÚQueueZ__save_data_queuer,r@rKr‘rNrUrOrWrXZTRADE_DIRECTION_BUYZTRADE_DIRECTION_SELLÚTIMEOUTZTRADE_DELEGATEDr˜r‡rŒr—ršrr=r¥r>rªr«r¬r­rTrÚprintrrrrÚ<module>s\     + 
 
'
 
+
'