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
<?php
namespace trader\exchange\bybit;
require_once __DIR__ . '/../../struct/ApiInfo.php';
require_once __DIR__ . '/../../../jiaoyin/func.php';
require_once __DIR__ . '/../../../jiaoyin/Curl.php';
use trader\struct\ApiInfo;
use Jiaoyin\Curl;
use function Jiaoyin\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)
{
// 确保杠杆值为字符串类型
if (isset($param['buyLeverage'])) {
$param['buyLeverage'] = (string)$param['buyLeverage'];
}
if (isset($param['sellLeverage'])) {
$param['sellLeverage'] = (string)$param['sellLeverage'];
}
$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';
$sign_str = $timestamp . $this->apiInfo->key . $recv_window;
if ($method == 'GET' && !empty($params)) {
$sign_str .= http_build_query($params);
} else if ($method == 'POST' && !empty($params)) {
$sign_str .= json_encode($params);
}
$sign = hash_hmac('sha256', $sign_str, $this->apiInfo->secret);
return $sign;
}
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);
}
}