Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        /// <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);
        }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
        /// <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);
        }