/// <summary> /// 주문 취소 접수: 주문 UUID를 통해 해당 주문에 대한 취소 접수를 한다. /// </summary> /// <param name="order_id">주문 UUID</param> /// <returns></returns> public async ValueTask <MyOrder> CancelOrder(string order_id) { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("uuid", order_id); } var _response = await privateClient.CallApiDelete2Async("/order", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _order = privateClient.DeserializeObject <UPlaceOrderItem>(_response.Content); { _order.amount = _order.price * _order.quantity; _result.result = _order; } _result.SetSuccess(); } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// Cancel an order. /// </summary> /// <param name="order_id">Order number registered for sale or purchase</param> /// <returns></returns> public async ValueTask <MyOrder> CancelOrder(string order_id) { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("orderID", order_id); } var _response = await privateClient.CallApiDelete2Async("/api/v1/order", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _orders = privateClient.DeserializeObject <List <BPlaceOrderItem> >(_response.Content); if (_orders != null) { _result.result = _orders.FirstOrDefault(); _result.SetSuccess(); } } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// Create a new limit order. /// </summary> /// <param name="symbol">Instrument symbol. e.g. 'XBTUSD'.</param> /// <param name="quantity">amount of coin</param> /// <param name="price">price of coin</param> /// <param name="sideType">type of buy(bid) or sell(ask)</param> /// <param name="execInst">Optional execution instructions.</param> /// <returns></returns> public async ValueTask <MyOrder> CreateLimitOrder(string symbol, decimal quantity, decimal price, SideType sideType, string execInst = "") { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("symbol", symbol); _params.Add("side", sideType == SideType.Bid ? "Buy" : "Sell"); _params.Add("ordType", "Limit"); _params.Add("orderQty", quantity); _params.Add("price", price); if (String.IsNullOrEmpty(execInst) == false) { _params.Add("execInst", execInst); } } var _response = await privateClient.CallApiPost2Async("/api/v1/order", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _order = privateClient.DeserializeObject <BPlaceOrderItem>(_response.Content); if (_order != null) { _order.orderType = OrderType.Limit; _order.remaining = Math.Max(_order.quantity - _order.filled, 0); _order.cost = _order.price * _order.filled; _result.result = _order; _result.SetSuccess(); } } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// 주문하기: 주문 요청을 한다. /// </summary> /// <param name="base_name">The type of trading base-currency of which information you want to query for.</param> /// <param name="quote_name">The type of trading quote-currency of which information you want to query for.</param> /// <param name="quantity">주문 수량</param> /// <param name="price">유닛당 주문 가격</param> /// <param name="sideType">주문 타입</param> /// <returns></returns> public async ValueTask <MyOrder> CreateLimitOrder(string base_name, string quote_name, decimal quantity, decimal price, SideType sideType) { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("market", $"{quote_name}-{base_name}"); _params.Add("side", sideType == SideType.Bid ? "bid" : "ask"); _params.Add("volume", quantity); _params.Add("price", price); _params.Add("ord_type", "limit"); } var _response = await privateClient.CallApiPost2Async("/orders", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _order = privateClient.DeserializeObject <UPlaceOrderItem>(_response.Content); { _order.orderType = OrderType.Limit; _order.amount = _order.quantity * _order.price; _result.result = _order; } _result.SetSuccess(); } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// Amend the quantity or price of an open order. /// </summary> /// <param name="order_id">Order number registered for sale or purchase</param> /// <param name="quantity">amount of coin</param> /// <param name="price">price of coin</param> /// <param name="execInst">Optional execution instructions.</param> /// <returns></returns> public async ValueTask <MyOrder> UpdateOrder(string order_id, decimal quantity, decimal price, string execInst = "") { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("orderID", order_id); _params.Add("orderQty", quantity); _params.Add("price", price); if (String.IsNullOrEmpty(execInst) == false) { _params.Add("execInst", execInst); } } var _response = await privateClient.CallApiPut2Async("/api/v1/order", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _order = privateClient.DeserializeObject <BPlaceOrderItem>(_response.Content); if (_order != null) { _result.result = _order; _result.SetSuccess(); } } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// Close a position /// </summary> /// <param name="symbol">Instrument symbol. e.g. 'XBTUSD'.</param> /// <param name="orderType">The type of order is limit, market or position</param> /// <param name="price">price of coin</param> /// <returns></returns> public async ValueTask <MyOrder> ClosePosition(string symbol, OrderType orderType, decimal price = 0.0m) { var _result = new MyOrder(); var _params = new Dictionary <string, object>(); { _params.Add("symbol", symbol); _params.Add("execInst", "Close"); if (orderType == OrderType.Limit) { _params.Add("price", price); } } var _response = await privateClient.CallApiPost2Async("/api/v1/order", _params); if (_response != null) { #if RAWJSON _result.rawJson = _response.Content; #endif if (_response.IsSuccessful == true) { var _order = privateClient.DeserializeObject <BMyOrderItem>(_response.Content); if (_order != null) { _result.result = _order; _result.SetSuccess(); } } else { var _message = privateClient.GetResponseMessage(_response); _result.SetFailure(_message.message); } } return(_result); }
/// <summary> /// Place Market Order. /// </summary> /// <param name="base_name">The type of trading base-currency of which information you want to query for.</param> /// <param name="quote_name">The type of trading quote-currency of which information you want to query for.</param> /// <param name="quantity">amount of coin</param> /// <param name="price">price of coin</param> /// <param name="sideType">type of buy(bid) or sell(ask)</param> /// <param name="args">Add additional attributes for each exchange</param> /// <returns></returns> public override async ValueTask <MyOrder> CreateMarketOrderAsync(string base_name, string quote_name, decimal quantity, decimal price, SideType sideType, Dictionary <string, object> args = null) { var _result = new MyOrder(base_name, quote_name); var _market = await publicApi.LoadMarketAsync(_result.marketId); if (_market.success == true) { okexClient.ExchangeInfo.ApiCallWait(TradeType.Trade); var _buy_sell = sideType == SideType.Bid ? "buy_market" : "sell_market"; var _params = new Dictionary <string, object>(); { _params.Add("symbol", _market.result.symbol); _params.Add("type", _buy_sell); _params.Add("amount", quantity); tradeClient.MergeParamsAndArgs(_params, args); } var _end_point = okexClient.CheckFuturesUrl(_market.result, "/trade.do", "/future_trade.do", _params); var _json_value = await okexClient.CallApiPost1Async(_end_point.endPoint, _end_point.args); #if RAWJSON _result.rawJson = _json_value.Content; #endif var _json_result = okexClient.GetResponseMessage(_json_value.Response); if (_json_result.success == true) { var _json_data = okexClient.DeserializeObject <OPlaceOrderItem>(_json_value.Content); if (_json_data.result == true) { var _order = new OPlaceOrderItem { orderId = _json_data.orderId.ToUpper(), timestamp = CUnixTime.NowMilli, orderType = OrderType.Market, orderStatus = OrderStatus.Open, sideType = sideType, price = price, quantity = quantity, amount = quantity * price, //fee = quantity * price * publicApi.ExchangeInfo.Fees.trading.maker }; _result.result = _order; } else { _result.SetFailure(); } } _result.SetResult(_json_result); } else { _result.SetResult(_market); } return(_result); }
/// <summary> /// Submit a new Order /// </summary> /// <param name="base_name">The type of trading base-currency of which information you want to query for.</param> /// <param name="quote_name">The type of trading quote-currency of which information you want to query for.</param> /// <param name="quantity">amount of coin</param> /// <param name="price">price of coin</param> /// <param name="sideType">type of buy(bid) or sell(ask)</param> /// <param name="args">Add additional attributes for each exchange</param> /// <returns></returns> public override async Task <MyOrder> CreateMarketOrder(string base_name, string quote_name, decimal quantity, decimal price, SideType sideType, Dictionary <string, object> args = null) { var _result = new MyOrder(base_name, quote_name); var _market = await publicApi.LoadMarket(_result.marketId); if (_market.success == true) { if (args.ContainsKey("account-id") && args["account-id"].ToString() != "") { tradeClient.ExchangeInfo.ApiCallWait(TradeType.Trade); var _buy_sell = sideType == SideType.Bid ? "buy" : "sell"; var _params = new Dictionary <string, object>(); { _params.Add("account-id", args["account-id"].ToString()); _params.Add("amount", quantity.ToString()); //_params.Add("source", ); // 'api' for spot trade and 'margin-api' for margin trade _params.Add("symbol", _market.result.symbol); _params.Add("type", _buy_sell + "-market"); tradeClient.MergeParamsAndArgs(_params, args); } var _json_value = await tradeClient.CallApiPost1Async($"/v1/order/orders/place", _params); #if DEBUG _result.rawJson = _json_value.Content; #endif var _json_result = tradeClient.GetResponseMessage(_json_value.Response); if (_json_result.success == true) { var _order = tradeClient.DeserializeObject <HPlaceOrder>(_json_value.Content); { _order.result.orderType = OrderType.Market; //_order.result.price = price; _order.result.quantity = quantity; _order.result.sideType = sideType; _order.result.symbol = _market.result.symbol; _order.result.timestamp = CUnixTime.NowMilli; //_order.result.amount = (_order.result.quantity * _order.result.price).Normalize(); _order.result.fee = _order.result.amount * tradeClient.ExchangeInfo.Fees.trading.maker; _result.result = _order.result; } } _result.SetResult(_json_result); } else { _result.SetFailure("required args[account-id]"); } } else { _result.SetResult(_market); } return(_result); }