mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-18 15:10:03 +00:00
FTX: Fix order placement/cancellation issues (#583)
* Fix FTX order bugs * Add CancelOrderID support
This commit is contained in:
@@ -427,7 +427,7 @@ func (f *FTX) Order(marketName, side, orderType, reduceOnly, ioc, postOnly, clie
|
||||
req["postOnly"] = postOnly
|
||||
}
|
||||
if clientID != "" {
|
||||
req["clientID"] = clientID
|
||||
req["clientId"] = clientID
|
||||
}
|
||||
resp := struct {
|
||||
Data OrderData `json:"result"`
|
||||
@@ -534,25 +534,48 @@ func (f *FTX) GetOrderStatusByClientID(clientOrderID string) (OrderData, error)
|
||||
// DeleteOrder deletes an order
|
||||
func (f *FTX) DeleteOrder(orderID string) (string, error) {
|
||||
resp := struct {
|
||||
Data string `json:"result"`
|
||||
Result string `json:"result"`
|
||||
Success bool `json:"success"`
|
||||
}{}
|
||||
return resp.Data, f.SendAuthHTTPRequest(http.MethodGet, deleteOrder+orderID, nil, &resp)
|
||||
if err := f.SendAuthHTTPRequest(http.MethodDelete, deleteOrder+orderID, nil, &resp); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !resp.Success {
|
||||
return resp.Result, errors.New("delete order request by ID unsuccessful")
|
||||
}
|
||||
return resp.Result, nil
|
||||
}
|
||||
|
||||
// DeleteOrderByClientID deletes an order
|
||||
func (f *FTX) DeleteOrderByClientID(clientID string) (string, error) {
|
||||
resp := struct {
|
||||
Data string `json:"result"`
|
||||
Result string `json:"result"`
|
||||
Success bool `json:"success"`
|
||||
}{}
|
||||
return resp.Data, f.SendAuthHTTPRequest(http.MethodGet, deleteOrderByClientID+clientID, nil, &resp)
|
||||
|
||||
if err := f.SendAuthHTTPRequest(http.MethodDelete, deleteOrderByClientID+clientID, nil, &resp); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !resp.Success {
|
||||
return resp.Result, errors.New("delete order request by client ID unsuccessful")
|
||||
}
|
||||
return resp.Result, nil
|
||||
}
|
||||
|
||||
// DeleteTriggerOrder deletes an order
|
||||
func (f *FTX) DeleteTriggerOrder(orderID string) (string, error) {
|
||||
resp := struct {
|
||||
Data string `json:"result"`
|
||||
Result string `json:"result"`
|
||||
Success bool `json:"success"`
|
||||
}{}
|
||||
return resp.Data, f.SendAuthHTTPRequest(http.MethodDelete, cancelTriggerOrder+orderID, nil, &resp)
|
||||
|
||||
if err := f.SendAuthHTTPRequest(http.MethodDelete, cancelTriggerOrder+orderID, nil, &resp); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !resp.Success {
|
||||
return resp.Result, errors.New("delete trigger order request unsuccessful")
|
||||
}
|
||||
return resp.Result, nil
|
||||
}
|
||||
|
||||
// GetFills gets fills' data
|
||||
|
||||
@@ -345,6 +345,33 @@ func TestOrder(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSubmitOrder(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
if !areTestAPIKeysSet() || !canManipulateRealOrders {
|
||||
t.Skip("skipping test, either api keys or canManipulateRealOrders isn't set correctly")
|
||||
}
|
||||
|
||||
currencyPair, err := currency.NewPairFromString(spotPair)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var orderSubmission = &order.Submit{
|
||||
Pair: currencyPair,
|
||||
Side: order.Sell,
|
||||
Type: order.Limit,
|
||||
Price: 100000,
|
||||
Amount: 1,
|
||||
AssetType: asset.Spot,
|
||||
ClientOrderID: "order12345679$$$$$",
|
||||
}
|
||||
_, err = f.SubmitOrder(orderSubmission)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTriggerOrder(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !areTestAPIKeysSet() || !canManipulateRealOrders {
|
||||
@@ -356,6 +383,32 @@ func TestTriggerOrder(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestCancelOrder(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !areTestAPIKeysSet() || !canManipulateRealOrders {
|
||||
t.Skip("skipping test, either api keys or canManipulateRealOrders isn't set correctly")
|
||||
}
|
||||
|
||||
currencyPair, err := currency.NewPairFromString(spotPair)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
c := order.Cancel{
|
||||
ID: "12366984218",
|
||||
Pair: currencyPair,
|
||||
AssetType: asset.Spot,
|
||||
}
|
||||
if err := f.CancelOrder(&c); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
c.ClientOrderID = "1337"
|
||||
if err := f.CancelOrder(&c); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeleteOrder(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !areTestAPIKeysSet() || !canManipulateRealOrders {
|
||||
|
||||
@@ -500,11 +500,11 @@ func (f *FTX) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
|
||||
return resp, err
|
||||
}
|
||||
|
||||
if s.Side == order.Sell {
|
||||
s.Side = order.Ask
|
||||
if s.Side == order.Ask {
|
||||
s.Side = order.Sell
|
||||
}
|
||||
if s.Side == order.Buy {
|
||||
s.Side = order.Bid
|
||||
if s.Side == order.Bid {
|
||||
s.Side = order.Buy
|
||||
}
|
||||
|
||||
formattedPair, err := f.FormatExchangeCurrency(s.Pair, s.AssetType)
|
||||
@@ -513,8 +513,8 @@ func (f *FTX) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
|
||||
}
|
||||
|
||||
tempResp, err := f.Order(formattedPair.String(),
|
||||
s.Side.String(),
|
||||
s.Type.String(),
|
||||
s.Side.Lower(),
|
||||
s.Type.Lower(),
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
@@ -570,6 +570,12 @@ func (f *FTX) CancelOrder(o *order.Cancel) error {
|
||||
if err := o.Validate(o.StandardCancel()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if o.ClientOrderID != "" {
|
||||
_, err := f.DeleteOrderByClientID(o.ClientOrderID)
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := f.DeleteOrder(o.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user