Skip to content

Commit

Permalink
Merge pull request #1535 from c9s/edwin/okx/allow-char-in-place-order
Browse files Browse the repository at this point in the history
FIX: [okx] allow char in place order
  • Loading branch information
bailantaotao authored Feb 20, 2024
2 parents 35b15c3 + 3bd2d90 commit 7436a7e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 7 deletions.
18 changes: 11 additions & 7 deletions pkg/exchange/okex/exchange.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package okex
import (
"context"
"fmt"
"regexp"
"strconv"
"time"

Expand Down Expand Up @@ -33,6 +34,9 @@ var (
queryClosedOrderRateLimiter = rate.NewLimiter(rate.Every(100*time.Millisecond), 10)
queryTradeLimiter = rate.NewLimiter(rate.Every(100*time.Millisecond), 10)
queryKLineLimiter = rate.NewLimiter(rate.Every(100*time.Millisecond), 20)

// clientOrderIdRegex combine of case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters.
clientOrderIdRegex = regexp.MustCompile("^[a-zA-Z0-9]{0,32}$")
)

const (
Expand Down Expand Up @@ -241,11 +245,12 @@ func (e *Exchange) SubmitOrder(ctx context.Context, order types.SubmitOrder) (*t
return nil, fmt.Errorf("place order rate limiter wait error: %w", err)
}

_, err = strconv.ParseInt(order.ClientOrderID, 10, 64)
if err != nil {
return nil, fmt.Errorf("client order id should be numberic: %s, err: %w", order.ClientOrderID, err)
if len(order.ClientOrderID) > 0 {
if ok := clientOrderIdRegex.MatchString(order.ClientOrderID); !ok {
return nil, fmt.Errorf("client order id should be case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters: %s", order.ClientOrderID)
}
orderReq.ClientOrderID(order.ClientOrderID)
}
orderReq.ClientOrderID(order.ClientOrderID)

orders, err := orderReq.Do(ctx)
if err != nil {
Expand Down Expand Up @@ -357,9 +362,8 @@ func (e *Exchange) CancelOrders(ctx context.Context, orders ...types.Order) erro
req.InstrumentID(toLocalSymbol(order.Symbol))
req.OrderID(strconv.FormatUint(order.OrderID, 10))
if len(order.ClientOrderID) > 0 {
_, err := strconv.ParseInt(order.ClientOrderID, 10, 64)
if err != nil {
return fmt.Errorf("client order id should be numberic: %s, err: %w", order.ClientOrderID, err)
if ok := clientOrderIdRegex.MatchString(order.ClientOrderID); !ok {
return fmt.Errorf("client order id should be case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters: %s", order.ClientOrderID)
}
req.ClientOrderID(order.ClientOrderID)
}
Expand Down
31 changes: 31 additions & 0 deletions pkg/exchange/okex/exchange_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package okex

import (
"strings"
"testing"

"github.com/google/uuid"
"github.com/stretchr/testify/assert"
)

func Test_clientOrderIdRegex(t *testing.T) {
t.Run("empty client order id", func(t *testing.T) {
assert.True(t, clientOrderIdRegex.MatchString(""))
})

t.Run("mixed of digit and char", func(t *testing.T) {
assert.True(t, clientOrderIdRegex.MatchString("1s2f3g4h5j"))
})

t.Run("mixed of 16 chars and 16 digit", func(t *testing.T) {
assert.True(t, clientOrderIdRegex.MatchString(strings.Repeat("s", 16)+strings.Repeat("1", 16)))
})

t.Run("out of maximum length", func(t *testing.T) {
assert.False(t, clientOrderIdRegex.MatchString(strings.Repeat("s", 33)))
})

t.Run("invalid char: `-`", func(t *testing.T) {
assert.False(t, clientOrderIdRegex.MatchString(uuid.NewString()))
})
}

0 comments on commit 7436a7e

Please sign in to comment.