protected override async Task <ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrderRequest order) { ExchangeOrderResult result = new ExchangeOrderResult() { Result = ExchangeAPIOrderResult.Error }; var payload = await GetNoncePayloadAsync(); order.ExtraParameters.CopyTo(payload); // Only limit order is supported - no indication on how it is filled JToken token = await MakeJsonRequestAsync <JToken>((order.IsBuy ? "/market/buylimit?" : "market/selllimit?") + "market=" + order.MarketSymbol + "&rate=" + order.Price.ToStringInvariant() + "&quantity=" + order.RoundAmount().ToStringInvariant(), null, payload); if (token.HasValues) { // Only the orderid is returned on success result.OrderId = token["orderid"].ToStringInvariant(); result.Result = ExchangeAPIOrderResult.Filled; } return(result); }
/// <inheritdoc /> protected async override Task <ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrderRequest order) { //{ // "market": "XRP-PERP", // "side": "sell", // "price": 0.306525, // "type": "limit", // "size": 31431.0, // "reduceOnly": false, // "ioc": false, // "postOnly": false, // "clientId": null //} IEnumerable <ExchangeMarket> markets = await OnGetMarketSymbolsMetadataAsync(); ExchangeMarket market = markets.Where(m => m.MarketSymbol == order.MarketSymbol).First(); var payload = await GetNoncePayloadAsync(); var parameters = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase) { { "market", market.MarketSymbol }, { "side", order.IsBuy ? "buy" : "sell" }, { "type", order.OrderType.ToStringLowerInvariant() }, { "size", order.RoundAmount() } }; if (!string.IsNullOrEmpty(order.ClientOrderId)) { parameters.Add("clientId", order.ClientOrderId); } if (order.IsPostOnly != null) { parameters.Add("postOnly", order.IsPostOnly); } if (order.OrderType != OrderType.Market) { int precision = BitConverter.GetBytes(decimal.GetBits((decimal)market.PriceStepSize)[3])[2]; if (order.Price == null) { throw new ArgumentNullException(nameof(order.Price)); } parameters.Add("price", Math.Round(order.Price.Value, precision)); } else { parameters.Add("price", null); } parameters.CopyTo(payload); order.ExtraParameters.CopyTo(payload); var response = await MakeJsonRequestAsync <JToken>("/orders", null, payload, "POST"); ExchangeOrderResult result = new ExchangeOrderResult { OrderId = response["id"].ToStringInvariant(), ClientOrderId = response["clientId"].ToStringInvariant(), OrderDate = CryptoUtility.ToDateTimeInvariant(response["createdAt"]), Price = CryptoUtility.ConvertInvariant <decimal>(response["price"]), AmountFilled = CryptoUtility.ConvertInvariant <decimal>(response["filledSize"]), AveragePrice = CryptoUtility.ConvertInvariant <decimal>(response["avgFillPrice"]), Amount = CryptoUtility.ConvertInvariant <decimal>(response["size"]), MarketSymbol = response["market"].ToStringInvariant(), IsBuy = response["side"].ToStringInvariant() == "buy" }; return(result); }
protected override async Task <ExchangeOrderResult> OnPlaceOrderAsync(ExchangeOrderRequest order) { string orderType = "/exchange/"; if (order.OrderType == OrderType.Market) { orderType += order.IsBuy ? "buymarket" : "sellmarket"; } else { orderType += order.IsBuy ? "buylimit" : "selllimit"; } //{ "success": true, "added": true, "orderId": 4912 JToken token = await MakeJsonRequestAsync <JToken>(string.Format("{0}?currencyPair={1}&price={2}&quantity={3}", orderType, WebUtility.UrlEncode(NormalizeSymbol(order.Symbol)), order.Price.ToStringInvariant(), order.RoundAmount().ToStringInvariant()), null, GetNoncePayload(), "POST"); token = CheckError(token); return(new ExchangeOrderResult() { OrderId = token["orderId"].ToStringInvariant(), Result = ExchangeAPIOrderResult.Pending }); }