Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BitMEX amend bulk seems to be missing #23 #24

Merged
merged 5 commits into from
May 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
62 changes: 56 additions & 6 deletions samples/bitmex/Program.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CCXT.NET.BitMEX.Trade;
using CCXT.NET.Shared.Coin.Types;

namespace bitmex
{
class Program
{
private static int __step_no = 1;
private static int __step_no = 2;

private static readonly string API_KEY = ""; // Put your API key
private static readonly string API_SECRET = ""; // Put your API secret;
private static decimal initial_sell_limit = 20000m;
private static decimal amended_sell_limit = 19500m;
private static readonly string API_KEY = "N5lkLW2eUsVF3CxaxpaM5ry7"; // Put your API key
private static readonly string API_SECRET = "ORKlDys1wouXV84H_G_H5zxN_VrF8IsUf_MNYux1B4GFfHJd"; // Put your API secret;
private static decimal initial_sell_limit = 60000m;
private static decimal amended_sell_limit = 59500m;
private static decimal order_quantity = 100m;

private static async Task Main(string[] args)
private static async Task<int> Main(string[] args)
{
var _public_api = new CCXT.NET.BitMEX.Public.PublicApi();
var _private_api = new CCXT.NET.BitMEX.Private.PrivateApi(API_KEY, API_SECRET, is_live: false);
Expand Down Expand Up @@ -47,9 +50,56 @@ private static async Task Main(string[] args)
Console.Out.WriteLine("Order successfully cancelled.");
}
}
if (__step_no == 2)
{
var _order1 = new BBulkOrderItem(symbol: "XBTUSD", side: SideType.Ask, orderType: OrderType.Limit, orderQty: order_quantity, price: initial_sell_limit);
var _order2 = new BBulkOrderItem(symbol: "XBTUSD", side: SideType.Ask, orderType: OrderType.Limit, orderQty: order_quantity * 2, price: initial_sell_limit);
var _orders = new List<BBulkOrderItem> { _order1, _order2 };
Console.Out.WriteLine($"Placing sell limit bulk order at {initial_sell_limit}...");
var _limit_orders = await _trade_api.CreateBulkOrder(_orders);
if (!_limit_orders.success)
{
Console.Error.WriteLine($"Error {_limit_orders.errorCode}, message: {_limit_orders.message}");
return _limit_orders.statusCode;
}

if (_limit_orders.result.All(x => x.orderStatus == OrderStatus.Open))
//if (_limit_order.result.orderStatus == OrderStatus.Open)
{
var _order_updates = _limit_orders.result.Select(x => new BBulkUpdateOrderItem
{
orderID = x.orderId,
orderQty = x.quantity,
price = amended_sell_limit
});
Console.Out.WriteLine($"Changing limit of the sell orders to {amended_sell_limit} in bulk...");
_limit_orders = await _trade_api.UpdateOrders(_order_updates.ToList());
}
if (!_limit_orders.success)
{
Console.Error.WriteLine($"Error {_limit_orders.errorCode}, message: {_limit_orders.message}");
return _limit_orders.statusCode;
}

if (_limit_orders.result.All(x => x.orderStatus == OrderStatus.Open))
{
Console.Out.WriteLine("Cancelling orders...");
_limit_orders = await _trade_api.CancelOrdersAsync("BTC", "USD", _limit_orders.result.Select(x => x.orderId).ToArray());
}
if (_limit_orders.result.All(x => x.orderStatus == OrderStatus.Canceled))
{
Console.Out.WriteLine("Orders successfully bulk cancelled.");
}
if (!_limit_orders.success)
{
Console.Error.WriteLine($"Error {_limit_orders.errorCode}, message: {_limit_orders.message}");
return _limit_orders.statusCode;
}
}

Console.Out.WriteLine("hit return to exit...");
Console.ReadLine();
return 0;
}
}
}
126 changes: 126 additions & 0 deletions src/exchanges/sey/bitmex/trade/order.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,5 +240,131 @@ public decimal price
get;
set;
}

/// <summary>
/// Ctor. Accepts Typed parameters for convenience.
/// </summary>
public BBulkOrderItem(string symbol, SideType side, OrderType orderType, decimal orderQty, decimal price, string execInst = "")
{
this.symbol = symbol;
this.side = BSideTypeConverter.ToString(side);
this.execInst = execInst;
this.ordType = BOrderTypeConverter.ToString(orderType);
this.orderQty = orderQty;
this.price = price;
}
}

/// <summary>
/// Converter between SideType and string
/// </summary>
public class BSideTypeConverter
{
/// <summary>
/// string -> SideType
/// </summary>
public static SideType FromString(string side)
{
switch (side)
{
case "Sell":
return SideType.Ask;
case "Buy":
return SideType.Bid;
default:
return SideType.Unknown;
}
}

/// <summary>
/// SideType -> string
/// </summary>
public static string ToString(SideType side)
{
switch (side)
{
case SideType.Ask:
return "Sell";
case SideType.Bid:
return "Buy";
default:
throw new NotSupportedException("Unkown side not supported");
}
}
}

/// <summary>
/// Converter between OrderType and string
/// </summary>
public class BOrderTypeConverter
{
/// <summary>
/// string -> OrderType
/// </summary>
public static OrderType FromString(string orderType)
{
switch (orderType)
{
case "Limit":
return OrderType.Limit;
case "Market":
return OrderType.Market;
default:
return OrderType.Unknown;
}
}

/// <summary>
/// OrderType -> string
/// </summary>
public static string ToString(OrderType type)
{
switch (type)
{
case OrderType.Limit:
return "Limit";
case OrderType.Market:
return "Market";
default:
throw new NotSupportedException("Unkown or unsupported order type");
}
}
}
/// <summary>
/// Items for TradeApi.UpdateOrders call
/// </summary>
public class BBulkUpdateOrderItem
{
/// <summary>
///
/// </summary>
public string orderID
{
get;
set;
}

/// <summary>
///
/// </summary>
public decimal orderQty
{
get;
set;
}

/// <summary>
///
/// </summary>
public decimal price
{
get;
set;
}

public BBulkUpdateOrderItem()
{

}
}
}
39 changes: 39 additions & 0 deletions src/exchanges/sey/bitmex/trade/tradeApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,45 @@ public async Task<MyOrder> UpdateOrder(string base_name, string quote_name, stri
return _result;
}

/// <summary>
/// Update orders in bulk.
/// </summary>
/// <param name="orders"></param>
/// <param name="args">Add additional attributes for each exchange</param>
/// <returns></returns>
public async Task<MyOrders> UpdateOrders(List<BBulkUpdateOrderItem> orders, Dictionary<string, object> args = null)
{
var _result = new MyOrders();

tradeClient.ExchangeInfo.ApiCallWait(TradeType.Trade);
{
var _params = tradeClient.MergeParamsAndArgs(
new Dictionary<string, object>
{
{ "orders", orders }
},
args
);

var _json_value = await tradeClient.CallApiPut1Async("/api/v1/order/bulk", _params);
#if DEBUG
_result.rawJson = _json_value.Content;
#endif
var _json_result = tradeClient.GetResponseMessage(_json_value.Response);
if (_json_result.success == true)
{
var _orders = tradeClient.DeserializeObject<List<BMyOrderItem>>(_json_value.Content);
{
_result.result = _orders.ToList<IMyOrderItem>();
}
}

_result.SetResult(_json_result);
}

return _result;
}

/// <summary>
/// Cancel an order.
/// </summary>
Expand Down