284 lines
6.1 KiB
Markdown
284 lines
6.1 KiB
Markdown
# 简介
|
||
OKEX go版本的v5sdk,仅供学习交流使用。
|
||
(文档持续完善中)
|
||
# 项目说明
|
||
|
||
## REST调用
|
||
``` go
|
||
// 设置您的APIKey
|
||
apikey := APIKeyInfo{
|
||
ApiKey: "xxxx",
|
||
SecKey: "xxxx",
|
||
PassPhrase: "xxxx",
|
||
}
|
||
|
||
// 第三个参数代表是否为模拟环境,更多信息查看接口说明
|
||
cli := NewRESTClient("https://www.okex.win", &apikey, true)
|
||
rsp, err := cli.Get(context.Background(), "/api/v5/account/balance", nil)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
fmt.Println("Response:")
|
||
fmt.Println("\thttp code: ", rsp.Code)
|
||
fmt.Println("\t总耗时: ", rsp.TotalUsedTime)
|
||
fmt.Println("\t请求耗时: ", rsp.ReqUsedTime)
|
||
fmt.Println("\t返回消息: ", rsp.Body)
|
||
fmt.Println("\terrCode: ", rsp.V5Response.Code)
|
||
fmt.Println("\terrMsg: ", rsp.V5Response.Msg)
|
||
fmt.Println("\tdata: ", rsp.V5Response.Data)
|
||
```
|
||
更多示例请查看rest/rest_test.go
|
||
|
||
## websocket订阅
|
||
|
||
### 私有频道
|
||
```go
|
||
ep := "wss://ws.okex.com:8443/ws/v5/private?brokerId=9999"
|
||
|
||
// 填写您自己的APIKey信息
|
||
apikey := "xxxx"
|
||
secretKey := "xxxxx"
|
||
passphrase := "xxxxx"
|
||
|
||
// 创建ws客户端
|
||
r, err := NewWsClient(ep)
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
// 设置连接超时
|
||
r.SetDailTimeout(time.Second * 2)
|
||
err = r.Start()
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
defer r.Stop()
|
||
|
||
var res bool
|
||
// 私有频道需要登录
|
||
res, _, err = r.Login(apikey, secretKey, passphrase)
|
||
if res {
|
||
fmt.Println("登录成功!")
|
||
} else {
|
||
fmt.Println("登录失败!", err)
|
||
return
|
||
}
|
||
|
||
|
||
var args []map[string]string
|
||
arg := make(map[string]string)
|
||
arg["ccy"] = "BTC"
|
||
args = append(args, arg)
|
||
|
||
start := time.Now()
|
||
// 订阅账户频道
|
||
res, _, err = r.PrivAccout(OP_SUBSCRIBE, args)
|
||
if res {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("订阅成功!耗时:", usedTime.String())
|
||
} else {
|
||
fmt.Println("订阅失败!", err)
|
||
}
|
||
|
||
time.Sleep(100 * time.Second)
|
||
start = time.Now()
|
||
// 取消订阅账户频道
|
||
res, _, err = r.PrivAccout(OP_UNSUBSCRIBE, args)
|
||
if res {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("取消订阅成功!", usedTime.String())
|
||
} else {
|
||
fmt.Println("取消订阅失败!", err)
|
||
}
|
||
```
|
||
更多示例请查看ws/ws_priv_channel_test.go
|
||
|
||
### 公有频道
|
||
```go
|
||
ep := "wss://ws.okex.com:8443/ws/v5/public?brokerId=9999"
|
||
|
||
// 创建ws客户端
|
||
r, err := NewWsClient(ep)
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
|
||
// 设置连接超时
|
||
r.SetDailTimeout(time.Second * 2)
|
||
err = r.Start()
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
defer r.Stop()
|
||
|
||
|
||
var args []map[string]string
|
||
arg := make(map[string]string)
|
||
arg["instType"] = FUTURES
|
||
//arg["instType"] = OPTION
|
||
args = append(args, arg)
|
||
|
||
start := time.Now()
|
||
|
||
// 订阅产品频道
|
||
res, _, err := r.PubInstruemnts(OP_SUBSCRIBE, args)
|
||
if res {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("订阅成功!", usedTime.String())
|
||
} else {
|
||
fmt.Println("订阅失败!", err)
|
||
}
|
||
|
||
time.Sleep(30 * time.Second)
|
||
|
||
start = time.Now()
|
||
|
||
// 取消订阅产品频道
|
||
res, _, err = r.PubInstruemnts(OP_UNSUBSCRIBE, args)
|
||
if res {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("取消订阅成功!", usedTime.String())
|
||
} else {
|
||
fmt.Println("取消订阅失败!", err)
|
||
}
|
||
```
|
||
更多示例请查看ws/ws_pub_channel_test.go
|
||
|
||
## websocket交易
|
||
```go
|
||
ep := "wss://ws.okex.com:8443/ws/v5/private?brokerId=9999"
|
||
|
||
// 填写您自己的APIKey信息
|
||
apikey := "xxxx"
|
||
secretKey := "xxxxx"
|
||
passphrase := "xxxxx"
|
||
|
||
var res bool
|
||
var req_id string
|
||
|
||
// 创建ws客户端
|
||
r, err := NewWsClient(ep)
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
// 设置连接超时
|
||
r.SetDailTimeout(time.Second * 2)
|
||
err = r.Start()
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
defer r.Stop()
|
||
|
||
res, _, err = r.Login(apikey, secretKey, passphrase)
|
||
if res {
|
||
fmt.Println("登录成功!")
|
||
} else {
|
||
fmt.Println("登录失败!", err)
|
||
return
|
||
}
|
||
|
||
start := time.Now()
|
||
param := map[string]interface{}{}
|
||
param["instId"] = "BTC-USDT"
|
||
param["tdMode"] = "cash"
|
||
param["side"] = "buy"
|
||
param["ordType"] = "market"
|
||
param["sz"] = "200"
|
||
req_id = "00001"
|
||
|
||
// 单个下单
|
||
res, _, err = r.PlaceOrder(req_id, param)
|
||
if res {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("下单成功!", usedTime.String())
|
||
} else {
|
||
usedTime := time.Since(start)
|
||
fmt.Println("下单失败!", usedTime.String(), err)
|
||
}
|
||
|
||
```
|
||
更多示例请查看ws/ws_jrpc_test.go
|
||
|
||
## wesocket推送
|
||
websocket推送数据分为两种类型数据:`普通推送数据`和`深度类型数据`。
|
||
|
||
```go
|
||
ws/wImpl/BookData.go
|
||
|
||
// 普通推送
|
||
type MsgData struct {
|
||
Arg map[string]string `json:"arg"`
|
||
Data []interface{} `json:"data"`
|
||
}
|
||
|
||
// 深度数据
|
||
type DepthData struct {
|
||
Arg map[string]string `json:"arg"`
|
||
Action string `json:"action"`
|
||
Data []DepthDetail `json:"data"`
|
||
}
|
||
```
|
||
如果需要对推送数据做处理用户可以自定义回调函数:
|
||
1. 全局消息处理的回调函数
|
||
该回调函数会处理所有从服务端接受到的数据。
|
||
```go
|
||
/*
|
||
添加全局消息处理的回调函数
|
||
*/
|
||
func (a *WsClient) AddMessageHook(fn ReceivedDataCallback) error {
|
||
a.onMessageHook = fn
|
||
return nil
|
||
}
|
||
```
|
||
使用方法参见 ws/ws_test.go中测试用例TestAddMessageHook。
|
||
|
||
2. 订阅消息处理回调函数
|
||
可以处理所有非深度类型的数据,包括 订阅/取消订阅,普通推送数据。
|
||
```go
|
||
/*
|
||
添加订阅消息处理的回调函数
|
||
*/
|
||
func (a *WsClient) AddBookMsgHook(fn ReceivedMsgDataCallback) error {
|
||
a.onBookMsgHook = fn
|
||
return nil
|
||
}
|
||
```
|
||
使用方法参见 ws/ws_test.go中测试用例TestAddBookedDataHook。
|
||
|
||
|
||
3. 深度消息处理的回调函数
|
||
这里需要说明的是,Wsclient提供了深度数据管理和自动checksum的功能,用户如果需要关闭此功能,只需要调用EnableAutoDepthMgr方法。
|
||
```go
|
||
/*
|
||
添加深度消息处理的回调函数
|
||
*/
|
||
func (a *WsClient) AddDepthHook(fn ReceivedDepthDataCallback) error {
|
||
a.onDepthHook = fn
|
||
return nil
|
||
}
|
||
```
|
||
使用方法参见 ws/ws_pub_channel_test.go中测试用例TestOrderBooks。
|
||
|
||
4. 错误消息类型回调函数
|
||
```go
|
||
func (a *WsClient) AddErrMsgHook(fn ReceivedDataCallback) error {
|
||
a.OnErrorHook = fn
|
||
return nil
|
||
}
|
||
```
|
||
|
||
# 联系方式
|
||
邮箱:caron_co@163.com
|
||
微信:caron_co
|