Skip to content

Commit b88c467

Browse files
authored
Merge pull request #795 from wanxsb/master
support place algo order via websocket api
2 parents 41a2310 + 93e79de commit b88c467

File tree

2 files changed

+450
-0
lines changed

2 files changed

+450
-0
lines changed

v2/algo_order_cancel_service_ws.go

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package binance
2+
3+
import (
4+
"encoding/json"
5+
"time"
6+
7+
"github.com/adshao/go-binance/v2/common"
8+
"github.com/adshao/go-binance/v2/common/websocket"
9+
"github.com/adshao/go-binance/v2/futures"
10+
)
11+
12+
// AlgoOrderCancelWsService cancels algo order using WebSocket API
13+
type AlgoOrderCancelWsService struct {
14+
c websocket.Client
15+
ApiKey string
16+
SecretKey string
17+
KeyType string
18+
TimeOffset int64
19+
}
20+
21+
// NewAlgoOrderCancelWsService init AlgoOrderCancelWsService
22+
func NewAlgoOrderCancelWsService(apiKey, secretKey string) (*AlgoOrderCancelWsService, error) {
23+
conn, err := websocket.NewConnection(futures.WsApiInitReadWriteConn, futures.WebsocketKeepalive, futures.WebsocketTimeoutReadWriteConnection)
24+
if err != nil {
25+
return nil, err
26+
}
27+
28+
client, err := websocket.NewClient(conn)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
return &AlgoOrderCancelWsService{
34+
c: client,
35+
ApiKey: apiKey,
36+
SecretKey: secretKey,
37+
KeyType: common.KeyTypeHmac,
38+
}, nil
39+
}
40+
41+
// AlgoOrderCancelWsRequest parameters for 'algoOrder.cancel' websocket API
42+
type AlgoOrderCancelWsRequest struct {
43+
algoId *int64
44+
clientAlgoId *string
45+
recvWindow *int64
46+
}
47+
48+
// NewAlgoOrderCancelWsRequest init AlgoOrderCancelWsRequest
49+
func NewAlgoOrderCancelWsRequest() *AlgoOrderCancelWsRequest {
50+
return &AlgoOrderCancelWsRequest{}
51+
}
52+
53+
// AlgoID set algoID
54+
func (s *AlgoOrderCancelWsRequest) AlgoID(algoID int64) *AlgoOrderCancelWsRequest {
55+
s.algoId = &algoID
56+
return s
57+
}
58+
59+
// ClientAlgoID set clientAlgoID
60+
func (s *AlgoOrderCancelWsRequest) ClientAlgoID(clientAlgoID string) *AlgoOrderCancelWsRequest {
61+
s.clientAlgoId = &clientAlgoID
62+
return s
63+
}
64+
65+
// RecvWindow set recvWindow
66+
func (s *AlgoOrderCancelWsRequest) RecvWindow(recvWindow int64) *AlgoOrderCancelWsRequest {
67+
s.recvWindow = &recvWindow
68+
return s
69+
}
70+
71+
// buildParams builds params
72+
func (s *AlgoOrderCancelWsRequest) buildParams() map[string]interface{} {
73+
m := map[string]interface{}{}
74+
75+
if s.algoId != nil {
76+
m["algoid"] = *s.algoId
77+
}
78+
79+
if s.clientAlgoId != nil {
80+
m["clientalgoid"] = *s.clientAlgoId
81+
}
82+
83+
if s.recvWindow != nil {
84+
m["recvWindow"] = *s.recvWindow
85+
}
86+
87+
return m
88+
}
89+
90+
// CancelAlgoOrderResult define algo order cancel result
91+
type CancelAlgoOrderResult struct {
92+
AlgoId int64 `json:"algoId"`
93+
ClientAlgoId string `json:"clientAlgoId"`
94+
Code string `json:"code"`
95+
Message string `json:"msg"`
96+
}
97+
98+
// CancelAlgoOrderWsResponse define 'algoOrder.cancel' websocket API response
99+
type CancelAlgoOrderWsResponse struct {
100+
Id string `json:"id"`
101+
Status int `json:"status"`
102+
Result CancelAlgoOrderResult `json:"result"`
103+
104+
// error response
105+
Error *common.APIError `json:"error,omitempty"`
106+
}
107+
108+
// Do - sends 'algoOrder.cancel' request
109+
func (s *AlgoOrderCancelWsService) Do(requestID string, request *AlgoOrderCancelWsRequest) error {
110+
// Use custom method "algoOrder.cancel"
111+
method := websocket.WsApiMethodType("algoOrder.cancel")
112+
113+
rawData, err := websocket.CreateRequest(
114+
websocket.NewRequestData(
115+
requestID,
116+
s.ApiKey,
117+
s.SecretKey,
118+
s.TimeOffset,
119+
s.KeyType,
120+
),
121+
method,
122+
request.buildParams(),
123+
)
124+
if err != nil {
125+
return err
126+
}
127+
128+
if err := s.c.Write(requestID, rawData); err != nil {
129+
return err
130+
}
131+
132+
return nil
133+
}
134+
135+
// SyncDo - sends 'algoOrder.cancel' request and receives response
136+
func (s *AlgoOrderCancelWsService) SyncDo(requestID string, request *AlgoOrderCancelWsRequest) (*CancelAlgoOrderWsResponse, error) {
137+
// Use custom method "algoOrder.cancel"
138+
method := websocket.WsApiMethodType("algoOrder.cancel")
139+
140+
rawData, err := websocket.CreateRequest(
141+
websocket.NewRequestData(
142+
requestID,
143+
s.ApiKey,
144+
s.SecretKey,
145+
s.TimeOffset,
146+
s.KeyType,
147+
),
148+
method,
149+
request.buildParams(),
150+
)
151+
if err != nil {
152+
return nil, err
153+
}
154+
155+
response, err := s.c.WriteSync(requestID, rawData, websocket.WriteSyncWsTimeout)
156+
if err != nil {
157+
return nil, err
158+
}
159+
160+
cancelAlgoOrderWsResponse := &CancelAlgoOrderWsResponse{}
161+
if err := json.Unmarshal(response, cancelAlgoOrderWsResponse); err != nil {
162+
return nil, err
163+
}
164+
165+
return cancelAlgoOrderWsResponse, nil
166+
}
167+
168+
// ReceiveAllDataBeforeStop waits until all responses will be received from websocket until timeout expired
169+
func (s *AlgoOrderCancelWsService) ReceiveAllDataBeforeStop(timeout time.Duration) {
170+
s.c.Wait(timeout)
171+
}
172+
173+
// GetReadChannel returns channel with API response data (including API errors)
174+
func (s *AlgoOrderCancelWsService) GetReadChannel() <-chan []byte {
175+
return s.c.GetReadChannel()
176+
}
177+
178+
// GetReadErrorChannel returns channel with errors which are occurred while reading websocket connection
179+
func (s *AlgoOrderCancelWsService) GetReadErrorChannel() <-chan error {
180+
return s.c.GetReadErrorChannel()
181+
}
182+
183+
// GetReconnectCount returns count of reconnect attempts by client
184+
func (s *AlgoOrderCancelWsService) GetReconnectCount() int64 {
185+
return s.c.GetReconnectCount()
186+
}
187+

0 commit comments

Comments
 (0)