FTX: Fix order placement/cancellation issues (#583)

* Fix FTX order bugs

* Add CancelOrderID support
This commit is contained in:
Adrian Gallagher
2020-10-26 13:07:33 +11:00
committed by GitHub
parent fab9d934fe
commit 8a241c2efa
3 changed files with 95 additions and 13 deletions

View File

@@ -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

View File

@@ -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 {

View File

@@ -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
}