Skip to content

Commit bf16434

Browse files
authored
Added Expired and PendingOpen to ExchangeAPIOrderResult (#667)
This PR contains the following breaking changes to the ExchangeAPIOrderResult enum: - PendingOpen is an important state that many exchanges have, which is separate from Open - Renamed Pending state to Open - Renamed Error state to Rejected, since this is how most exchanges refer to it - Added Expired state, which is separate from Rejected also contains the following changes - added stricter checks to FTX OnGetOrderDetailsAsync() and OnPlaceOrderAsync isPostOnly - improved FTX ToExchangeAPIOrderResult(), renamed to FTXExtensions to reduce collisions in the future
1 parent 46259fc commit bf16434

31 files changed

+182
-123
lines changed

src/ExchangeSharp/API/Exchanges/Aquanow/ExchangeAquanowAPI.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ protected override async Task<ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrd
189189
break;
190190

191191
default:
192-
orderDetails.Result = ExchangeAPIOrderResult.Error;
192+
orderDetails.Result = ExchangeAPIOrderResult.Rejected;
193193
break;
194194
}
195195
return orderDetails;
@@ -226,7 +226,7 @@ protected override async Task<ExchangeOrderResult> OnGetOrderDetailsAsync(string
226226
break;
227227

228228
default:
229-
orderDetails.Result = ExchangeAPIOrderResult.Error;
229+
orderDetails.Result = ExchangeAPIOrderResult.Rejected;
230230
break;
231231
}
232232

src/ExchangeSharp/API/Exchanges/BL3P/Extensions/BL3PExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ public static ExchangeAPIOrderResult ToResult(this BL3POrderStatus status, BL3PA
99
BL3POrderStatus.Cancelled => ExchangeAPIOrderResult.Canceled,
1010
BL3POrderStatus.Closed => ExchangeAPIOrderResult.Filled,
1111
BL3POrderStatus.Open when amount.Value > 0 => ExchangeAPIOrderResult.FilledPartially,
12-
BL3POrderStatus.Open => ExchangeAPIOrderResult.Pending,
13-
BL3POrderStatus.Pending => ExchangeAPIOrderResult.Pending,
14-
BL3POrderStatus.Placed => ExchangeAPIOrderResult.Pending,
12+
BL3POrderStatus.Open => ExchangeAPIOrderResult.Open,
13+
BL3POrderStatus.Pending => ExchangeAPIOrderResult.PendingOpen,
14+
BL3POrderStatus.Placed => ExchangeAPIOrderResult.Open,
1515
_ => ExchangeAPIOrderResult.Unknown
1616
};
1717
}

src/ExchangeSharp/API/Exchanges/BTSE/ExchangeBTSEAPI.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private ExchangeAPIOrderResult FromOrderState(string s)
138138
switch (s)
139139
{
140140
case "STATUS_ACTIVE":
141-
return ExchangeAPIOrderResult.Pending;
141+
return ExchangeAPIOrderResult.Open;
142142
case "ORDER_CANCELLED":
143143
return ExchangeAPIOrderResult.Canceled;
144144
case "ORDER_FULLY_TRANSACTED":
@@ -202,24 +202,27 @@ protected override async Task<ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrd
202202
var status = ExchangeAPIOrderResult.Unknown;
203203
switch (token["status"].Value<int>())
204204
{
205-
case 2:
206-
status = ExchangeAPIOrderResult.Pending;
205+
case 2: // ORDER_INSERTED
206+
status = ExchangeAPIOrderResult.Open;
207207
break;
208-
case 4:
208+
case 4: // ORDER_FULLY_TRANSACTED
209209
status = ExchangeAPIOrderResult.Filled;
210210
break;
211-
case 5:
211+
case 5: // ORDER_PARTIALLY_TRANSACTED
212212
status = ExchangeAPIOrderResult.FilledPartially;
213213
break;
214-
case 6:
214+
case 6: // ORDER_CANCELLED
215215
status = ExchangeAPIOrderResult.Canceled;
216216
break;
217+
case 8: // INSUFFICIENT_BALANCE
218+
status = ExchangeAPIOrderResult.Rejected;
219+
break;
217220
case 9: //trigger inserted
218221
case 10: //trigger activated
219-
status = ExchangeAPIOrderResult.Pending;
222+
status = ExchangeAPIOrderResult.Open;
220223
break;
221224
case 15: //rejected
222-
status = ExchangeAPIOrderResult.Error;
225+
status = ExchangeAPIOrderResult.Rejected;
223226
break;
224227
case 16: //not found
225228
status = ExchangeAPIOrderResult.Unknown;

src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ internal static ExchangeAPIOrderResult ParseExchangeAPIOrderResult(string status
886886
switch (status)
887887
{
888888
case "NEW":
889-
return ExchangeAPIOrderResult.Pending;
889+
return ExchangeAPIOrderResult.Open;
890890
case "PARTIALLY_FILLED":
891891
return ExchangeAPIOrderResult.FilledPartially;
892892
case "FILLED":
@@ -896,11 +896,11 @@ internal static ExchangeAPIOrderResult ParseExchangeAPIOrderResult(string status
896896
case "PENDING_CANCEL":
897897
return ExchangeAPIOrderResult.PendingCancel;
898898
case "EXPIRED":
899-
return ExchangeAPIOrderResult.Error;
899+
return ExchangeAPIOrderResult.Expired;
900900
case "REJECTED":
901-
return ExchangeAPIOrderResult.Canceled;
901+
return ExchangeAPIOrderResult.Rejected;
902902
default:
903-
return ExchangeAPIOrderResult.Error;
903+
throw new NotImplementedException($"Unexpected status type: {status}");
904904
}
905905
}
906906

src/ExchangeSharp/API/Exchanges/BitBank/ExchangeBitBankAPI.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,13 @@ private ExchangeOrderResult ParseOrder(JToken token)
350350
res.AmountFilled = token["executed_amount"].ConvertInvariant<decimal>();
351351
res.OrderDate = token["ordered_at"].ConvertInvariant<double>().UnixTimeStampToDateTimeMilliseconds();
352352
switch (token["status"].ToStringInvariant())
353-
{
353+
{ // status enum: INACTIVE, UNFILLED, PARTIALLY_FILLED, FULLY_FILLED, CANCELED_UNFILLED, CANCELED_PARTIALLY_FILLED
354+
case "INACTIVE":
355+
res.Result = ExchangeAPIOrderResult.PendingOpen;
356+
break;
357+
354358
case "UNFILLED":
355-
res.Result = ExchangeAPIOrderResult.Pending;
359+
res.Result = ExchangeAPIOrderResult.Open;
356360
break;
357361

358362
case "PARTIALLY_FILLED":
@@ -372,8 +376,7 @@ private ExchangeOrderResult ParseOrder(JToken token)
372376
break;
373377

374378
default:
375-
res.Result = ExchangeAPIOrderResult.Unknown;
376-
break;
379+
throw new NotImplementedException($"Unexpected status type: {token["status"].ToStringInvariant()}");
377380
}
378381
return res;
379382
}

src/ExchangeSharp/API/Exchanges/BitMEX/ExchangeBitMEXAPI.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -770,8 +770,11 @@ private ExchangeOrderResult ParseOrder(JToken token)
770770
// http://www.onixs.biz/fix-dictionary/5.0.SP2/tagNum_39.html
771771
switch (token["ordStatus"].ToStringInvariant())
772772
{
773+
case "Pending New":
774+
result.Result = ExchangeAPIOrderResult.PendingOpen;
775+
break;
773776
case "New":
774-
result.Result = ExchangeAPIOrderResult.Pending;
777+
result.Result = ExchangeAPIOrderResult.Open;
775778
break;
776779
case "PartiallyFilled":
777780
result.Result = ExchangeAPIOrderResult.FilledPartially;
@@ -782,9 +785,15 @@ private ExchangeOrderResult ParseOrder(JToken token)
782785
case "Canceled":
783786
result.Result = ExchangeAPIOrderResult.Canceled;
784787
break;
788+
case "Rejected":
789+
result.Result = ExchangeAPIOrderResult.Rejected;
790+
break;
791+
case "Expired":
792+
result.Result = ExchangeAPIOrderResult.Expired;
793+
break;
785794

786795
default:
787-
result.Result = ExchangeAPIOrderResult.Error;
796+
result.Result = ExchangeAPIOrderResult.Rejected;
788797
break;
789798
}
790799

src/ExchangeSharp/API/Exchanges/Bitfinex/ExchangeBitfinexAPI.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ private ExchangeOrderResult ParseOrder(JToken order)
914914
AveragePrice = order["avg_execution_price"].ConvertInvariant<decimal>(order["price"].ConvertInvariant<decimal>()),
915915
Message = string.Empty,
916916
OrderId = order["id"].ToStringInvariant(),
917-
Result = (amountFilled == amount ? ExchangeAPIOrderResult.Filled : (amountFilled == 0 ? ExchangeAPIOrderResult.Pending : ExchangeAPIOrderResult.FilledPartially)),
917+
Result = (amountFilled == amount ? ExchangeAPIOrderResult.Filled : (amountFilled == 0 ? ExchangeAPIOrderResult.Open : ExchangeAPIOrderResult.FilledPartially)),
918918
OrderDate = CryptoUtility.UnixTimeStampToDateTimeSeconds(order["timestamp"].ConvertInvariant<double>()),
919919
MarketSymbol = order["symbol"].ToStringInvariant(),
920920
IsBuy = order["side"].ToStringInvariant() == "buy"
@@ -954,10 +954,10 @@ private ExchangeOrderResult ParseOrderWebSocket(JToken order)
954954
IsBuy = (amount > 0m),
955955
OrderDate = order[8].ToDateTimeInvariant(),
956956
OrderId = order[0].ToStringInvariant(),
957-
Result = orderStatusString == "ACTIVE" ? ExchangeAPIOrderResult.Pending
957+
Result = orderStatusString == "ACTIVE" ? ExchangeAPIOrderResult.Open
958958
: orderStatusString == "EXECUTED" ? ExchangeAPIOrderResult.Filled
959959
: orderStatusString == "PARTIALLY" ? ExchangeAPIOrderResult.FilledPartially
960-
: orderStatusString == "INSUFFICIENT" ? ExchangeAPIOrderResult.Canceled
960+
: orderStatusString == "INSUFFICIENT" ? ExchangeAPIOrderResult.Rejected
961961
: orderStatusString == "CANCELED" ? ExchangeAPIOrderResult.Canceled
962962
: ExchangeAPIOrderResult.Unknown,
963963
MarketSymbol = order[1].ToStringInvariant(),

src/ExchangeSharp/API/Exchanges/Bitstamp/ExchangeBitstampAPI.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ private ExchangeAPIOrderResult GetOrderResultFromStatus(string status, bool anyT
349349
case "finished": return ExchangeAPIOrderResult.Filled;
350350
case "open": return anyTransactions
351351
? ExchangeAPIOrderResult.FilledPartially
352-
: ExchangeAPIOrderResult.Pending;
352+
: ExchangeAPIOrderResult.Open;
353353
case "canceled": return ExchangeAPIOrderResult.Canceled;
354354
default: return ExchangeAPIOrderResult.Unknown;
355355
}

src/ExchangeSharp/API/Exchanges/Bittrex/ExchangeBittrexAPI.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ private ExchangeOrderResult ParseOrder(JToken token)
9494
}
9595
else if (amountFilled == 0m)
9696
{
97-
order.Result = ExchangeAPIOrderResult.Pending;
97+
order.Result = ExchangeAPIOrderResult.Open;
9898
}
9999
else
100100
{
@@ -406,7 +406,7 @@ protected override async Task<ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrd
406406
IsBuy = order.IsBuy,
407407
OrderDate = result["createdAt"].ToDateTimeInvariant(),
408408
OrderId = result["id"].ToStringInvariant(),
409-
Result = ExchangeAPIOrderResult.Pending,
409+
Result = ExchangeAPIOrderResult.Open,
410410
MarketSymbol = result["marketSymbol"].ToStringInvariant(),
411411
Price = decimal.Parse(result["limit"].ToStringInvariant())
412412
};

src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitAPI.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,10 +1026,15 @@ private ExchangeOrderResult ParseOrder(JToken token, string resultCode, string r
10261026
result.MarketSymbol = token["symbol"].ToStringInvariant();
10271027

10281028
switch (token["order_status"].ToStringInvariant())
1029-
{
1029+
{ // https://bybit-exchange.github.io/docs/inverse/#order-status-order_status
10301030
case "Created":
1031+
result.Result = ExchangeAPIOrderResult.PendingOpen;
1032+
break;
1033+
case "Rejected":
1034+
result.Result = ExchangeAPIOrderResult.Rejected;
1035+
break;
10311036
case "New":
1032-
result.Result = ExchangeAPIOrderResult.Pending;
1037+
result.Result = ExchangeAPIOrderResult.Open;
10331038
break;
10341039
case "PartiallyFilled":
10351040
result.Result = ExchangeAPIOrderResult.FilledPartially;
@@ -1040,10 +1045,12 @@ private ExchangeOrderResult ParseOrder(JToken token, string resultCode, string r
10401045
case "Cancelled":
10411046
result.Result = ExchangeAPIOrderResult.Canceled;
10421047
break;
1048+
case "PendingCancel":
1049+
result.Result = ExchangeAPIOrderResult.PendingCancel;
1050+
break;
10431051

10441052
default:
1045-
result.Result = ExchangeAPIOrderResult.Error;
1046-
break;
1053+
throw new NotImplementedException($"Unexpected status type: {token["order_status"].ToStringInvariant()}");
10471054
}
10481055
}
10491056
result.ResultCode = resultCode;

0 commit comments

Comments
 (0)