Skip to content

Commit

Permalink
okex: add order detail request
Browse files Browse the repository at this point in the history
  • Loading branch information
c9s committed May 26, 2021
1 parent bcb8914 commit b69a578
Show file tree
Hide file tree
Showing 3 changed files with 389 additions and 272 deletions.
3 changes: 3 additions & 0 deletions examples/okex-book/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ var rootCmd = &cobra.Command{
log.Infof("place order response: %+v", placeResponse)
time.Sleep(time.Second)


client.NewOrderDetailsRequest()

cancelResponse, err := client.NewCancelOrderRequest().
InstrumentID("LTC-USDT").
OrderID(placeResponse.OrderID).
Expand Down
277 changes: 5 additions & 272 deletions pkg/exchange/okex/okexapi/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package okexapi

import (
"bytes"
"context"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
Expand Down Expand Up @@ -375,298 +374,32 @@ type OrderResponse struct {
Message string `json:"sMsg"`
}

type PlaceOrderRequest struct {
client *RestClient

instId string

// tdMode
// margin mode: "cross", "isolated"
// non-margin mode cash
tdMode string

// A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters.
clientOrderID *string

// A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 8 characters.
tag *string

// "buy" or "sell"
side SideType

ordType OrderType

// sz Quantity
sz string

// price
px *string
}

func (r *PlaceOrderRequest) InstrumentID(instID string) *PlaceOrderRequest {
r.instId = instID
return r
}

func (r *PlaceOrderRequest) TradeMode(mode string) *PlaceOrderRequest {
r.tdMode = mode
return r
}

func (r *PlaceOrderRequest) ClientOrderID(clientOrderID string) *PlaceOrderRequest {
r.clientOrderID = &clientOrderID
return r
}

func (r *PlaceOrderRequest) Side(side SideType) *PlaceOrderRequest {
r.side = side
return r
}

func (r *PlaceOrderRequest) Quantity(quantity string) *PlaceOrderRequest {
r.sz = quantity
return r
}

func (r *PlaceOrderRequest) Price(price string) *PlaceOrderRequest {
r.px = &price
return r
}

func (r *PlaceOrderRequest) OrderType(orderType OrderType) *PlaceOrderRequest {
r.ordType = orderType
return r
}

func (r *PlaceOrderRequest) Parameters() map[string]interface{} {
payload := map[string]interface{}{}

payload["instId"] = r.instId

if r.tdMode == "" {
payload["tdMode"] = "cash"
} else {
payload["tdMode"] = r.tdMode
}

if r.clientOrderID != nil {
payload["clOrdId"] = r.clientOrderID
}

payload["side"] = r.side
payload["ordType"] = r.ordType
payload["sz"] = r.sz
if r.px != nil {
payload["px"] = r.px
}

if r.tag != nil {
payload["tag"] = r.tag
}

return payload
}

func (r *PlaceOrderRequest) Do(ctx context.Context) (*OrderResponse, error) {
payload := r.Parameters()
req, err := r.client.newAuthenticatedRequest("POST", "/api/v5/trade/order", nil, payload)
if err != nil {
return nil, err
}

response, err := r.client.sendRequest(req)
if err != nil {
return nil, err
}

var orderResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []OrderResponse `json:"data"`
}
if err := response.DecodeJSON(&orderResponse); err != nil {
return nil, err
}

if len(orderResponse.Data) == 0 {
return nil, errors.New("order create error")
}

return &orderResponse.Data[0], nil
}

func (c *RestClient) NewPlaceOrderRequest() *PlaceOrderRequest {
return &PlaceOrderRequest{
client: c,
}
}

type BatchPlaceOrderRequest struct {
client *RestClient

reqs []*PlaceOrderRequest
}

func (r *BatchPlaceOrderRequest) Add(reqs ...*PlaceOrderRequest) *BatchPlaceOrderRequest {
r.reqs = append(r.reqs, reqs...)
return r
}

func (r *BatchPlaceOrderRequest) Do(ctx context.Context) ([]OrderResponse, error) {
var parameterList []map[string]interface{}

for _, req := range r.reqs {
params := req.Parameters()
parameterList = append(parameterList, params)
}

req, err := r.client.newAuthenticatedRequest("POST", "/api/v5/trade/batch-orders", nil, parameterList)
if err != nil {
return nil, err
}

response, err := r.client.sendRequest(req)
if err != nil {
return nil, err
}

var orderResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []OrderResponse `json:"data"`
}
if err := response.DecodeJSON(&orderResponse); err != nil {
return nil, err
}

return orderResponse.Data, nil
}

func (c *RestClient) NewBatchPlaceOrderRequest() *BatchPlaceOrderRequest {
return &BatchPlaceOrderRequest{
client: c,
}
}

type CancelOrderRequest struct {
client *RestClient

instId string
ordId *string
clOrdId *string
}

func (r *CancelOrderRequest) InstrumentID(instId string) *CancelOrderRequest {
r.instId = instId
return r
}

func (r *CancelOrderRequest) OrderID(orderID string) *CancelOrderRequest {
r.ordId = &orderID
return r
}

func (r *CancelOrderRequest) ClientOrderID(clientOrderID string) *CancelOrderRequest {
r.clOrdId = &clientOrderID
return r
}

func (r *CancelOrderRequest) Parameters() map[string]interface{} {
var payload = map[string]interface{}{
"instId": r.instId,
}

if r.ordId != nil {
payload["ordId"] = r.ordId
} else if r.clOrdId != nil {
payload["clOrdId"] = r.clOrdId
}

return payload
}

func (r *CancelOrderRequest) Do(ctx context.Context) ([]OrderResponse, error) {
var payload = r.Parameters()

if r.ordId == nil && r.clOrdId != nil {
return nil, errors.New("either orderID or clientOrderID is required for canceling order")
}

req, err := r.client.newAuthenticatedRequest("POST", "/api/v5/trade/cancel-order", nil, payload)
if err != nil {
return nil, err
}

response, err := r.client.sendRequest(req)
if err != nil {
return nil, err
}

var orderResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []OrderResponse `json:"data"`
}
if err := response.DecodeJSON(&orderResponse); err != nil {
return nil, err
}

return orderResponse.Data, nil
}

func (c *RestClient) NewCancelOrderRequest() *CancelOrderRequest {
return &CancelOrderRequest{
client: c,
}
}

type BatchCancelOrderRequest struct {
client *RestClient

reqs []*CancelOrderRequest
}

func (r *BatchCancelOrderRequest) Add(reqs ...*CancelOrderRequest) *BatchCancelOrderRequest {
r.reqs = append(r.reqs, reqs...)
return r
}

func (r *BatchCancelOrderRequest) Do(ctx context.Context) (*OrderResponse, error) {
var parameterList []map[string]interface{}

for _, req := range r.reqs {
params := req.Parameters()
parameterList = append(parameterList, params)
}

req, err := r.client.newAuthenticatedRequest("POST", "/api/v5/trade/cancel-batch-orders", nil, parameterList)
if err != nil {
return nil, err
}

response, err := r.client.sendRequest(req)
if err != nil {
return nil, err
}

var orderResponse struct {
Code string `json:"code"`
Message string `json:"msg"`
Data []OrderResponse `json:"data"`
}
if err := response.DecodeJSON(&orderResponse); err != nil {
return nil, err
}

if len(orderResponse.Data) == 0 {
return nil, errors.New("order create error")
func (c *RestClient) NewBatchCancelOrderRequest() *BatchCancelOrderRequest {
return &BatchCancelOrderRequest{
client: c,
}

return &orderResponse.Data[0], nil
}

func (c *RestClient) NewBatchCancelOrderRequest() *BatchCancelOrderRequest {
return &BatchCancelOrderRequest{
func (c *RestClient) NewOrderDetailsRequest() *OrderDetailsRequest {
return &OrderDetailsRequest{
client: c,
}
}
Expand Down
Loading

0 comments on commit b69a578

Please sign in to comment.