Api.php
3.6 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
<?php
namespace trader\exchange\bybit;
require_once __DIR__ . '/../../struct/ApiInfo.php';
require_once __DIR__ . '/../../../jytools/func.php';
require_once __DIR__ . '/../../../jytools/Curl.php';
use trader\struct\ApiInfo;
use jytools\Curl;
use function jytools\getMicrotime;
class Api
{
private $host = 'https://api.bybit.com';
private ApiInfo $apiInfo;
public function __construct(ApiInfo $apiInfo)
{
$this->apiInfo = $apiInfo;
}
public function setHost($host)
{
$this->host = $host;
}
//----------- public interface ------------
// 获取交易对信息
public function instruments($param)
{
$path = "/v5/market/instruments-info";
$method = 'GET';
return $this->request($path, $method, $param);
}
// 获取K线数据
public function klines($param)
{
$path = "/v5/market/kline";
$method = 'GET';
return $this->request($path, $method, $param);
}
//----------- private interface ------------
// 下单
public function placeOrder($param)
{
$path = '/v5/order/create';
$method = 'POST';
return $this->request($path, $method, $param, true);
}
// 查询持仓
public function getPositions($param)
{
$path = '/v5/position/list';
$method = 'GET';
return $this->request($path, $method, $param, true);
}
// 设置杠杆
public function setLeverage($param)
{
$path = '/v5/position/set-leverage';
$method = 'POST';
return $this->request($path, $method, $param, true);
}
// 查询账户余额
public function accountBalance($param)
{
$path = '/v5/account/wallet-balance';
$method = 'GET';
return $this->request($path, $method, $param, true);
}
//-------------------------------------
private function createSign($timestamp, $method, $path, $params = [])
{
$recv_window = '5000';
$queryString = '';
$postBody = '';
if ($method == 'GET' && !empty($params)) {
ksort($params);
$queryString = http_build_query($params);
}
if ($method == 'POST' && !empty($params)) {
ksort($params);
$postBody = json_encode($params);
}
$sign_str = $timestamp . $this->apiInfo->key . $recv_window . $path;
if ($queryString) {
$sign_str .= '?' . $queryString;
}
if ($postBody) {
$sign_str .= $postBody;
}
return hash_hmac('sha256', $sign_str, $this->apiInfo->secret);
}
private function request($path, $method, $param, $auth = false)
{
$header = [];
$body = '';
$fullPath = $path;
$timestamp = getMicrotime();
if ($method == 'GET' && !empty($param)) {
$fullPath = $path . '?' . http_build_query($param);
} else {
$header[] = 'Content-Type: application/json';
$body = json_encode($param);
}
if ($auth) {
$header[] = 'X-BAPI-API-KEY: ' . $this->apiInfo->key;
$header[] = 'X-BAPI-TIMESTAMP: ' . $timestamp;
$header[] = 'X-BAPI-RECV-WINDOW: 5000';
$header[] = 'X-BAPI-SIGN: ' . $this->createSign($timestamp, $method, $path, $param);
}
$url = $this->host . $path;
$result = "";
if ($method == 'POST') {
$result = Curl::httpPost($url, $param, $header);
} else {
$result = Curl::httpGet($url, $param, $header);
}
return json_decode($result, true);
}
}