public OrderInfo(BinanceTradeOrderData order) { Symbol = order.Symbol; Side = order.Side; Status = order.OrderStatus; Price = order.Price; Qty = order.Quantity; ClientID = order.NewClientOrderId; BaseCurrReturn = null; // SET StratStatus and BaseCurrReturn (if filled): var SideID = order.NewClientOrderId.Split('_')[1]; if (order.OrderStatus == OrderStatus.New) { if (order.Side.ToString() == SideID) { StratState = StrategyState.OPEN; InitialPrice = Price; } else { StratState = StrategyState.TP_ENTERED; } } else if (order.OrderStatus == OrderStatus.Filled) { if (order.Side.ToString() == SideID) { StratState = StrategyState.OPEN_FILLED; InitialPrice = Price; //Set base curr for [SELL] take profit order if (SideID == "Sell") { BaseCurrReturn = order.Price * order.Quantity; } } else { StratState = StrategyState.TP_FILLED; //Set base curr for [BUY] new order if (SideID == "Buy") { BaseCurrReturn = order.Price * order.Quantity; } } } else if (order.OrderStatus == OrderStatus.PartiallyFilled) { // Set StratState to PARTIAL_FILL if it is not a TakeProfit order if (order.Side.ToString() == SideID) { StratState = StrategyState.PARTIAL_FILL; InitialPrice = Price; } } }
public Order(BinanceTradeOrderData bo) { OrderId = bo.OrderId; Symbol = bo.Symbol; Market = "Binance"; TradeType = bo.Side == OrderSide.Buy ? TradeDirection.Buy : TradeDirection.Sell; Type = GetOrderType(bo.Type); Amount = bo.Quantity; Price = bo.Price; Status = GetStatus(bo.OrderStatus); Filled = bo.AccumulatedQuantityOfFilledTradesThisOrder; Id = Symbol + OrderId; ClientId = bo.NewClientOrderId; Time = bo.EventTime; }
public Trade(BinanceTradeOrderData tr) { Market = "Binance"; Symbol = tr.Symbol; Direction = tr.Side == OrderSide.Buy ? TradeDirection.Buy : TradeDirection.Sell; Price = tr.PriceOfLastFilledTrade; Amount = tr.QuantityOfLastFilledTrade; Commission = Commission; CommissionAsset = CommissionAsset; Time = tr.TimeStamp; OrderId = tr.OrderId; ClientOrderId = tr.NewClientOrderId; TradeId = tr.TradeId; Id = Symbol + TradeId; }
private void LogOrderMessage(BinanceTradeOrderData TradeMsg) { //Console.WriteLine($"{JsonConvert.SerializeObject(userMsg.TradeOrderData, Formatting.Indented)}"); Log.Debug("\n--------------------------------------------------------------------------\n\n{"); Log.Debug($"ExecutionType: {TradeMsg.ExecutionType}"); Log.Debug($"OrderStatus: {TradeMsg.OrderStatus}"); Log.Debug($"Side: {TradeMsg.Side}"); Log.Debug($"Symbol: {TradeMsg.Symbol}"); Log.Debug($"Price: {TradeMsg.Price}"); Log.Debug($"Quantity: {TradeMsg.Quantity}"); Log.Debug($"PriceOfLastFilledTrade: {TradeMsg.PriceOfLastFilledTrade}"); Log.Debug($"QuantityOfLastFilledTrade: {TradeMsg.QuantityOfLastFilledTrade}"); Log.Debug($"AccumulatedQuantityOfFilledTradesThisOrder: {TradeMsg.AccumulatedQuantityOfFilledTradesThisOrder}"); Log.Debug($"NewClientOrderId: {TradeMsg.NewClientOrderId}"); Log.Debug($"OrderRejectReason: {TradeMsg.OrderRejectReason}"); Log.Debug("}"); }
public UserDataUpdate(BinanceTradeOrderData tradeOrds = null, BinanceAccountUpdateData account = null) { TradeOrderData = tradeOrds; AccountData = account; }
public void HandleOrderMessage(BinanceTradeOrderData data) { UserUpdateQueue.Enqueue(new UserDataUpdate(tradeOrds: data)); }
public async Task HandleTradeMsg(BinanceTradeOrderData TradeMsg, string[] ID) { // EXECUTION SWITCH switch (TradeMsg.ExecutionType) { case ExecutionType.New: // UPDATE UNCONFIRMED BUY/SELL OrderInfo in openOrders LIST: var orderInfo = new OrderInfo(TradeMsg); if (ID[1] == "Buy") { P2_BuyOrders[P2_BuyOrders.IndexOf(P2_BuyOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = orderInfo; } else if (ID[1] == "Sell") { P2_SellOrders[P2_SellOrders.IndexOf(P2_SellOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = orderInfo; } break; case ExecutionType.Trade: if (TradeMsg.OrderStatus == OrderStatus.Filled) { // UPDATE ORDERS StratStatus in OpenDATAorders: var order = new OrderInfo(TradeMsg); if (ID[1] == "Buy") { // HANDLE RAPID TP-ORDER HERE if (order.StratState == StrategyState.OPEN_FILLED) { // place TP order, update to TP_ENTERED var tpPrice = Math.Round(order.Price * (1 + SETTINGS.TakeProfitMargin), PriceRoundDigits); var tpQty = order.Qty; var tpOrd = new CreateOrderRequest() { Side = OrderSide.Sell, Symbol = order.Symbol, Price = tpPrice, Quantity = tpQty, NewClientOrderId = order.ClientID }; var resp = await BinaREST.CreateLimitOrder(tpOrd); if (resp != null) { Log.Debug($">>> [BUY] Take-Profit submitted"); } // update order info var initPrice = order.Price; order = new OrderInfo(tpOrd, StrategyState.TP_UNCONFIRMED); order.InitialPrice = initPrice; } else if (order.StratState == StrategyState.TP_FILLED) { BUYProfitCyclesP2++; } P2_BuyOrders[P2_BuyOrders.IndexOf(P2_BuyOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = order; } else if (ID[1] == "Sell") { // HANDLE RAPID TP-ORDER HERE if (order.StratState == StrategyState.OPEN_FILLED) { // place TP order, update to TP_ENTERED var tpPrice = Math.Round(order.Price * (1 - SETTINGS.TakeProfitMargin), PriceRoundDigits); var tpQty = Math.Round(Convert.ToDecimal(order.BaseCurrReturn) / (tpPrice * (1 + SETTINGS.FeePercentage)), QtyRoundDigits); var ord = new CreateOrderRequest() { Side = OrderSide.Buy, Symbol = order.Symbol, Price = tpPrice, Quantity = tpQty, NewClientOrderId = order.ClientID }; var resp = await BinaREST.CreateLimitOrder(ord); if (resp != null) { Log.Debug($">>> [SELL] Take-Profit submitted"); } // update order info var initPrice = order.Price; order = new OrderInfo(ord, StrategyState.TP_UNCONFIRMED); order.InitialPrice = initPrice; } else if (order.StratState == StrategyState.TP_FILLED) { SELLProfitCyclesP2++; } P2_SellOrders[P2_SellOrders.IndexOf(P2_SellOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = order; } } else if (TradeMsg.OrderStatus == OrderStatus.PartiallyFilled) { // HANDLE PARTIAL FILLS (ANCHOR UNTIL FILLED) var order = new OrderInfo(TradeMsg); if (order.StratState == StrategyState.PARTIAL_FILL) { if (ID[1] == "Buy") { P2_BuyOrders[P2_BuyOrders.IndexOf(P2_BuyOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = order; } else if (ID[1] == "Sell") { P2_SellOrders[P2_SellOrders.IndexOf(P2_SellOrders.First(o => o.ClientID == TradeMsg.NewClientOrderId))] = order; } } } break; case ExecutionType.Cancelled: break; case ExecutionType.Rejected: LogOrderMessage(TradeMsg); break; default: LogOrderMessage(TradeMsg); break; } }