diff --git a/exchanges/ftx/ftx.go b/exchanges/ftx/ftx.go index 3fc09af6..3199f9a5 100644 --- a/exchanges/ftx/ftx.go +++ b/exchanges/ftx/ftx.go @@ -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 diff --git a/exchanges/ftx/ftx_test.go b/exchanges/ftx/ftx_test.go index aea16aec..9274f2a5 100644 --- a/exchanges/ftx/ftx_test.go +++ b/exchanges/ftx/ftx_test.go @@ -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 { diff --git a/exchanges/ftx/ftx_wrapper.go b/exchanges/ftx/ftx_wrapper.go index cdc5bdf5..a0cecbbc 100644 --- a/exchanges/ftx/ftx_wrapper.go +++ b/exchanges/ftx/ftx_wrapper.go @@ -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 }