-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathorderRedis.class.php
More file actions
224 lines (203 loc) · 6.86 KB
/
orderRedis.class.php
File metadata and controls
224 lines (203 loc) · 6.86 KB
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<?php
class OrderRedis {
private $redis;
private $host; //redis ip
private $port; //redis 端口
public function __construct($host,$port){
$this->host=$host;
$this->port=$port;
//连接redis
if(class_exists('Redis')){
$this->redis = new \Redis();
if($this->redis->connect($this->host, $this->port)){
$this->connect=true;
}
}else{
exit('redis扩展不存在');
}
}
/**
* @method 盘口-添加订单
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @param $order_id 订单编号
* @param $price 价格
* @return int
*/
public function newOrderBook($market, $type, $side, $order_id, $price){
$key='orderbook:'.$market .':'.$type. ':' .$side;
return $this->redis->zAdd($key,$price,$order_id) ;
}
/**
* @method 盘口-数据列表(price降序)
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @return array
*/
public function getOrderBooks($market, $type='limit', $side){
$key='orderbook:'.$market .':'.$type. ':' .$side;
$order_book_range=$this->redis->zRevRange($key,0,-1,true);
return $order_book_range;
}
/**
* @method 盘口-查找指定价格区间的盘
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @param $fromPrice 最小价格(不包含)
* @param $toPrice 最大价格(包含)
* @return int
*/
public function getPriceArea($market,$type='limit',$side,$fromPrice,$toPrice){
$key='orderbook:'.$market .':'.$type. ':' .$side;
return $this->redis->zRangeByScore($key, $fromPrice, $toPrice, ['withscores' => TRUE]);
}
/**
* @method 盘口-根据订单编号查找价格
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @param $order_id
* @return float
*/
public function getOrderBook($market,$type='limit',$side,$order_id){
$key='orderbook:'.$market .':'.$type. ':' .$side;
return $this->redis->zScore($key,$order_id);
}
/**
* @method 盘口-指定订单编号的价格加减运算
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @param $order_id 订单编号
* @param $price 要增加(正数)或 减少(负数)的价格数量
* @return float 修改后的价格
*/
public function operaOrderBook($market,$type='limit',$side,$order_id,$price){
$key='orderbook:'.$market .':'.$type. ':' .$side;
return $this->redis->zIncrBy($key,$price,$order_id);
}
/**
* @method 盘口-删除指定订单
*
* @param $market 交易市场(交易对)
* @param $side [买单bid,卖单ask]
* @param $type 订单类型[limit,market]
* @param $order_id 订单编号
*/
public function removeOrderBook($market,$type='limit', $side,$order_id){
$key='orderbook:'.$market .':'.$type. ':' .$side;
return $this->redis->zDelete($key, $order_id);
}
/**
* @method 订单-新增
*
* @param $order_id 订单编号
* @param $data 订单的内容键值对,包括[order_id,user_id,market,price,quantity,side,type]
* @return bool
*/
public function newOrder($order_id,$data){
if(!is_array($data)){
return [];
}
$data['status']=0;//订单状态
$data['match_id']='';//与本单撮合成功的订单id,逗号分隔
$resOrder=$this->redis->hMSet($order_id,$data);
$resOrderBook=$this->newOrderBook($data['market'], $data['type'], $data['side'], $order_id, $data['price']);//新建订单同时插入盘口
return $resOrder;
}
/**
* @method 订单-查找指定编号订单指定字段值
*
* @param $order_id 订单编号
* @param $field 要查询的订单字段名,可选[order_id,user_id,market,price,quantity,side,type]
* @return array 字段值
*/
public function getOrderField($order_id,$field){
return $this->redis->hMGet($order_id,[$field])[$field];
}
/**
* @method 订单-查找指定编号订单
*
* @param $order_id 订单编号
* @param $data 要查询的订单字段数组,可选[order_id,user_id,market,price,quantity,side,type]
* @return array 新增的订单信息
*/
public function getOrder($order_id){
return $this->redis->hGetAll($order_id);
}
/**
* @method 订单-指定字段值的加减运算
*
* @param $order_id 订单编号
* @param $field 字段名
* @param $num 运算数量(正数+,负数-)
* @return float 运算后的结果
*/
public function operaOrder($order_id,$field,$num){
return $this->redis->hIncrByFloat($order_id,$field,round($num,4));
}
/**
* @method 订单-修改指定订单字段值
*
* @param $order_id 订单编号
* @param $field 字段名
* @param $value 修改后的值
* @return bool
*/
public function updateOrder($order_id,$field,$value){
return $this->redis->hMSet($order_id,[$field=>$value]);
}
/**
* @method 订单-删除多个订单
*
* @param $orderArray 要删除的订单id数组
*/
public function removeOrders($orderArray){
return $this->redis->delete($orderArray);
}
/**
* @method 订单-删除指定编号的订单
*
* @param $orderArray 要删除的订单id数组
* @return bool
*/
public function removeOrder($order_id){
return $this->redis->del($order_id);
}
/**
* @method 查寻Redis所有key
*
* @return array keys数组
*/
public function getKeys(){
return $this->redis->keys('*');
}
/**
* @method 清空Redis所有数据
*
* @return int 清空的数量
*/
public function cleanAll(){
return $this->redis->flushdb();
}
//订单列表
public function listOrder(){
$prefix='A10';//订单编号前缀
$keys=$this->getKeys();
$list=[];
foreach ($keys as $key => $value) {
if (substr($value, 0, strlen($prefix)) == $prefix) {
$list[]=$this->getOrder($value);
}
}
return $list;
}
}