예제 #1
0
 private void CurrentDirtyOrders(List <Order> dirtyOrders)
 {
     foreach (var dirtyOrder in dirtyOrders)
     {
         var order = robotTrade.GetOrders(Symbol, dirtyOrder.order_id);
         if (order.result && order.orders.Count != 0)
         {
             Order o = order.orders.FirstOrDefault();
             if (o.status == "filled")
             {
                 robotSession.RemoveSessionOrder(dirtyOrder);
                 Log4NetUtility.Debug($"CurrentEvent,Remove dirtyOrders {dirtyOrder.type} Price:{dirtyOrder.price.ToString("#0.00")} Id:{Utils.ShortID(dirtyOrder.order_id)} status:{o.status}");
             }
         }
     }
 }
예제 #2
0
        public void FilledSessionOrders(List <Order> filledSessionOrders, List <Order> currentOrder)
        {
            var sessionOrders = new List <Order>(SessionOrders);

            Parallel.ForEach(sessionOrders, (sessionOrder, loop) =>
            {
                try
                {
                    #region  缓存订单在成交订单中
                    var filledOrder = filledSessionOrders.FirstOrDefault(a => a != null && a.order_id == sessionOrder.order_id);
                    if (filledOrder != null)
                    {
                        string type = filledOrder.type == "buy" ? "+B" : "-S";
                        Log4NetUtility.Debug($"OrderFilled {type} [{filledOrder.price.ToString("#0.00")}] ID: {Utils.ShortID(filledOrder.order_id)} ");

                        decimal new_price = 0;          //补单Price
                        string new_type   = filledOrder.type == "buy" ? "sell" : "buy";
                        if (filledOrder.type == "sell") //卖单成交
                        {
                            //补单价格为成交价的少一单位价格
                            new_price = filledOrder.price - info.SpanPrice;
                        }
                        else
                        {
                            //补单价格为成交价的多一单位价格
                            new_price = filledOrder.price + info.SpanPrice;
                        }
                        Order new_order = new Order()
                        {
                            price = new_price, amount = info.TradeQty, type = new_type, create_date = Utils.GetUtcTimeDec()
                        };
                        CurrentOrderFilled(filledOrder, new_order);
                        //list.Add(new_order);
                    }
                    #endregion
                    #region  缓存订单不在成交\当前订单中
                    else//缓存订单不在成交订单中
                    {
                        //缓存订单也不在当前订单中
                        if (!currentOrder.Exists(a => a.order_id == sessionOrder.order_id))
                        {
                            decimal time = Utils.GetUtcTimeDec(-60);
                            //若订单时间较短可能平台延迟,忽略。否则缓存脏数据
                            if (sessionOrder.create_date < time)
                            {
                                var order = robotTrade.GetOrders(symbol, sessionOrder.order_id);
                                if (order.result && order.orders.Count != 0)
                                {
                                    Order o = order.orders.FirstOrDefault();
                                    if (o.status == "filled")
                                    {
                                        if (sessionOrder.flag == "dirty")
                                        {
                                            RemoveSessionOrder(sessionOrder);
                                            Log4NetUtility.Debug($"Remove dirtyOrders {sessionOrder.type} Price:{sessionOrder.price.ToString("#0.00")} Id:{Utils.ShortID(sessionOrder.order_id)} status:{o.status}");
                                        }
                                        else
                                        {
                                            sessionOrder.flag = "dirty";
                                        }
                                    }
                                }
                            }
                        }
                    }
                    #endregion
                }
                catch (Exception e)
                {
                    throw (e);
                }
            });
        }