Api.php
3.4 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
<?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 = '';
if ($method == 'GET' && !empty($params)) {
$queryString = http_build_query($params);
}
$sign_str = $timestamp . $this->apiInfo->key . $recv_window . $path . $queryString;
if ($method == 'POST' && !empty($params)) {
$sign_str .= json_encode($params);
}
return hash_hmac('sha256', $sign_str, $this->apiInfo->secret);
}
private function request($path, $method, $param, $auth = false)
{
$header = [];
$body = '';
$fullPath = $path;
$timestamp = getMicrotime() * 1000;
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);
}
}