/// <summary> /// Place new order /// </summary> /// <param name="symbol">Trading symbol</param> /// <param name="side">sell buy</param> /// <param name="quantity">Order quantity</param> /// <param name="price">Order price. Required for limit types.</param> /// <param name="stopPrice">Required for stop types.</param> /// <param name="timeInForce">Optional. Default - GDC. One of: GTC, IOC, FOK, Day, GTD</param> /// <param name="expireTime">Required for GTD timeInForce.</param> /// <param name="clientOrderId">Optional parameter, if skipped - will be generated by server. Uniqueness must be guaranteed within a single trading day, including all active orders.</param> /// <param name="strictValidate">Price and quantity will be checked that they increment within tick size and quantity step. See symbol tickSize and quantityIncrement</param> /// <param name="cancellationToken">Token for cancel operation</param> /// <returns></returns> public async Task <HitResponse <HitOrder> > CreateNewOrderAsync(string symbol, HitSide side, decimal quantity, decimal price = -1, decimal stopPrice = -1, HitTimeInForce timeInForce = HitTimeInForce.Day, DateTime expireTime = default, string clientOrderId = null, bool strictValidate = true, CancellationToken cancellationToken = default) { HitOrderType orderType = HitOrderType.Market; if (price != -1 && stopPrice == -1) { orderType = HitOrderType.Limit; } else if (price == -1 && stopPrice != -1) { orderType = HitOrderType.StopMarket; } else if (price != -1 && stopPrice != -1) { orderType = HitOrderType.StopLimit; } var parameters = new HitNewOrderParameters { ClientOrderId = clientOrderId, Symbol = symbol, Side = side, OrderType = orderType, TimeInForce = timeInForce, Quantity = quantity, Price = price, StopPrice = stopPrice, ExpireTime = expireTime, StrictValidate = strictValidate }; return(await this.MakeRequestAuthorizedAsync <HitOrder>(HttpMethod.Post, cancellationToken, "order", postParameters : parameters)); }
public override TradingOperationResult PlaceOrder(PlaceOrderRequestParameters parameters) { var result = new TradingOperationResult(); string symbol = parameters.Symbol.Id; HitSide side = parameters.Side == Side.Buy ? HitSide.Buy : HitSide.Sell; decimal quantity = (decimal)parameters.Quantity; decimal price = -1; decimal stopPrice = -1; if (parameters.OrderTypeId == OrderType.Limit || parameters.OrderTypeId == OrderType.StopLimit) { price = (decimal)parameters.Price; } if (parameters.OrderTypeId == OrderType.Stop || parameters.OrderTypeId == OrderType.StopLimit) { stopPrice = (decimal)parameters.TriggerPrice; } HitTimeInForce timeInForce = this.ConvertTimeInForce(parameters.TimeInForce); DateTime expireTime = default; if (timeInForce == HitTimeInForce.GTD) { expireTime = parameters.ExpirationTime; } var response = this.CheckHitResponse(this.socketApi.PlaceNewOrderAsync(symbol, side, quantity, price, stopPrice, timeInForce, expireTime, cancellationToken: parameters.CancellationToken).Result, out var error, true); if (response != null) { result.Status = TradingOperationResultStatus.Success; result.OrderId = response.ClientOrderId; } else { result.Status = TradingOperationResultStatus.Failure; result.Message = error?.ToString() ?? "Unknown error"; } return(result); }
private TimeInForce ConvertTimeInForce(HitTimeInForce hitTimeInForce) { switch (hitTimeInForce) { case HitTimeInForce.Day: default: return(TimeInForce.Day); case HitTimeInForce.GTC: return(TimeInForce.GTC); case HitTimeInForce.IOC: return(TimeInForce.IOC); case HitTimeInForce.FOK: return(TimeInForce.FOK); case HitTimeInForce.GTD: return(TimeInForce.GTD); } }