예제 #1
0
        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;
 }
예제 #3
0
 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;
 }
예제 #4
0
 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("}");
 }
예제 #5
0
 public UserDataUpdate(BinanceTradeOrderData tradeOrds = null, BinanceAccountUpdateData account = null)
 {
     TradeOrderData = tradeOrds;
     AccountData    = account;
 }
예제 #6
0
 public void HandleOrderMessage(BinanceTradeOrderData data)
 {
     UserUpdateQueue.Enqueue(new UserDataUpdate(tradeOrds: data));
 }
예제 #7
0
        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;
            }
        }