Example #1
0
        public Result Cancel(Cancel model)
        {
            Dictionary <int, string> dic = new Dictionary <int, string>();

            model.trade_nos.ForEach(trade_no =>
            {
                List <Order> orders = OrderRA.List4Trade(trade_no);
                foreach (Order order in orders)
                {
                    if (model.unit_id == order.unit_id && !string.IsNullOrWhiteSpace(order.order_no) && order.cancel_count == 0 && order.deal_count < order.count)
                    {
                        if (dic.ContainsKey(order.account_id))
                        {
                            dic[order.account_id] += "," + order.order_no;
                        }
                        else
                        {
                            dic.Add(order.account_id, order.order_no);
                        }
                    }
                }
            });
            foreach (var kvp in dic)
            {
                TradeBiz.Cancel(kvp.Key, kvp.Value);
            }
            return(Result(ApiResultEnum.Success));
        }
Example #2
0
        private void JY_OrderCanceled(object sender, OrderItem e)
        {
            string[] keys = TradeRA.KeySearch("O_" + e.order_no + "_*");
            if (keys.Length == 0 || keys[0].EndsWith("U_0") || keys[0].EndsWith("_F"))
            {
                return;
            }

            Order model = new Order()
            {
                order_no     = e.order_no,
                deal_count   = (int)decimal.Parse(e.deal_count),
                cancel_count = (int)decimal.Parse(e.cancel_count),
                status       = e.status,
            };

            OrderRA.UpdateStatus(model, keys[0]);

            //撤单成功取消冻结
            Order order = OrderRA.Get(keys[0]);

            MessageBiz.Send(order.user_id.ToString(), MessageTypeEnum.Order_Canceled, "[" + order.code + "]" + order.name + "撤单成功,撤单数量:" + model.cancel_count);
            if (e.type == "0")
            {
                string key_unit = "U_" + order.unit_id;
                UnitRA.UpdateCapitalOrderBuy(-order.price * model.cancel_count, key_unit);
            }
            else if (e.type == "1")
            {
                string key_position = "P_" + order.code + "_A_" + order.account_id + "_U_" + order.unit_id;
                PositionRA.UpdateSellableOrderSell(order.cancel_count, key_position);
            }
            MonitorRA.Increment("account_" + account_id, "cancel_count");
        }
Example #3
0
        public void Order(Order order)
        {
            string request_id = FuncHelper.GetUniqueID().ToString();

            order.account_id = account_id;
            order.name       = StockInfoBiz.GetStock(order.code).name;
            order.time_dt    = DateTime.Now;
            OrderRA.Add(order, "O_" + request_id + "_T_" + order.trade_no + "_U_" + order.unit_id + "_F");

            JY.Order(new JY.Order(order.code, order.type, order.count, order.price, request_id));
            MonitorRA.Increment("account_" + account_id, "order_count");
        }
Example #4
0
 public static void SaveOrder()
 {
     string[] keys = TradeRA.KeySearch("O_*");
     foreach (string key in keys)
     {
         Order order = OrderRA.Get(key);
         if (order.state_enum == OrderStatusEnum.Submitted)
         {
             order.state_enum = OrderStatusEnum.Abnormal;
         }
         OrderDA.Add(order);
     }
 }
Example #5
0
        public Result <List <Order> > ListOrderCancellable(int unit_id)
        {
            if (unit_id <= 0)
            {
                return(Result <List <Order> >(ApiResultEnum.Parameter_Error, null));
            }

            IEnumerable <Order> lst = OrderRA.List4Unit(unit_id);

            lst = lst.Where(o => o.state_enum == OrderStatusEnum.Success && o.deal_count + o.cancel_count < o.count).ToList();
            DataBiz.OrderMerge(ref lst);
            return(Result(lst.ToList()));
        }
Example #6
0
        private void JY_NewOrder(object sender, OrderItem e)
        {
            Order order;

            string[] keys = TradeRA.KeySearch("O_" + e.order_no + "_*");
            //处理系统中是否存在未能正常收到回报但已成功的委托(通常由于下单超时导致)
            if (keys.Length == 0 && !string.IsNullOrWhiteSpace(e.request_id) && e.request_id != "0")
            {
                JY_Order_Done(null, new OrderResult(true, e.order_no, "", e.request_id));
                keys = TradeRA.KeySearch("O_" + e.order_no + "_*");
            }

            if (keys.Length > 0)
            {
                order = OrderRA.Get(keys[0]);
                if (order.cancel_count != (int)decimal.Parse(e.cancel_count))
                {
                    JY_OrderCanceled(null, e);
                    return;
                }
            }
            else
            {
                order = new Order();
            }
            order.deal_count   = (int)decimal.Parse(e.deal_count);
            order.cancel_count = (int)decimal.Parse(e.cancel_count);
            order.status       = e.status;
            order.time_dt      = DateTime.Parse(e.date.ToDate() + " " + e.time.ToTime());

            if (keys.Length > 0)
            {
                OrderRA.UpdateNew(order, keys[0]);
            }
            else
            {
                string key = "O_" + e.order_no + "_T_0_U_0";
                order.trade_no   = "0";
                order.order_no   = e.order_no;
                order.name       = e.name;
                order.code       = e.code;
                order.price      = decimal.Parse(e.price);
                order.count      = order.trade_count = (int)decimal.Parse(e.count);
                order.type       = int.Parse(e.type);
                order.account_id = account_id;
                order.state_enum = OrderStatusEnum.Success;
                OrderRA.Add(order, key);
            }
        }
Example #7
0
 private void JY_OrderChanged(object sender, OrderItem e)
 {
     string[] keys = TradeRA.KeySearch("O_" + e.order_no + "_*");
     if (keys.Length > 0)
     {
         Order model = new Order()
         {
             order_no     = e.order_no,
             deal_count   = (int)decimal.Parse(e.deal_count),
             cancel_count = (int)decimal.Parse(e.cancel_count),
             status       = e.status
         };
         OrderRA.UpdateStatus(model, keys[0]);
     }
 }
Example #8
0
        private void JY_NewDeal(object sender, DealItem e)
        {
            Order order   = null;
            int   unit_id = 0;

            string[] keys = TradeRA.KeySearch("O_" + e.order_no + "_*");
            if (keys.Length > 0)
            {
                order   = OrderRA.Get(keys[0]);
                unit_id = order.unit_id;
            }

            string key = "D_" + e.deal_no + "_O_" + e.order_no + "_U_" + unit_id;

            if (TradeRA.KeyExists(key))
            {
                return;
            }

            Deal deal = new Deal()
            {
                code        = e.code,
                name        = e.name,
                type        = int.Parse(e.type),
                count       = (int)decimal.Parse(e.count),
                money       = decimal.Parse(e.money),
                time_dt     = DateTime.Parse(e.date.ToDate() + " " + e.time.ToTime()),
                deal_no     = e.deal_no,
                order_no    = e.order_no,
                price       = decimal.Parse(e.price),
                unit_id     = unit_id,
                account_id  = account_id,
                transferred = unit_id > 0 ? 0 : 1,
            };

            DealRA.Add(deal, key);

            //更新成交均价
            DealAveragePrice(deal);

            //系统内成交
            if (unit_id > 0)
            {
                MessageBiz.Send(order.user_id.ToString(), MessageTypeEnum.Order_Dealt, "[" + deal.code + "]" + deal.name + "已成交,成交数量:" + deal.count);
                TradeBiz.NewDeal(deal, order.price);
                MonitorRA.Increment("account_" + account_id, "deal_count");
            }
        }
Example #9
0
        //更新成交均价
        private void DealAveragePrice(Deal deal)
        {
            string[] keys  = TradeRA.KeySearch("D_*_O_" + deal.order_no + "_U_*");
            decimal  money = 0;
            int      count = 0;

            foreach (string key in keys)
            {
                Deal dl = DealRA.Get(key);
                money += dl.price * dl.count;
                count += dl.count;
            }
            string[] keys_order = TradeRA.KeySearch("O_" + deal.order_no + "_*_U_" + deal.unit_id);
            if (keys_order.Length > 0)
            {
                decimal deal_average_price = (money + deal.price * deal.count) / (count + deal.count);
                OrderRA.UpdateAverageOrice(Math.Round(deal_average_price, 3), keys_order[0]);
            }
        }
Example #10
0
        public Result <List <Order> > ListOrder(SearchUnit model)
        {
            if (model.unit_id <= 0)
            {
                return(Result <List <Order> >(ApiResultEnum.Parameter_Error, null));
            }

            IEnumerable <Order> lst = new List <Order>();

            if (model.from_dt.Date < DateTime.Now.Date)
            {
                lst = lst.Union(OrderDA.List(model));
            }
            if (model.from_dt.Date <= DateTime.Now.Date && model.to_dt.Date >= DateTime.Now.Date)
            {
                lst = lst.Union(OrderRA.List4Unit(model.unit_id));
            }

            DataBiz.OrderMerge(ref lst);
            return(Result(lst.ToList()));
        }
Example #11
0
        public Result <List <Order> > ListOrder(SearchOrderStatus model)
        {
            IEnumerable <Order> lst = new List <Order>();

            if (model.from_dt.Date < DateTime.Now.Date)
            {
                lst = lst.Union(OrderDA.List(model));
            }
            if (model.from_dt.Date <= DateTime.Now.Date && model.to_dt.Date >= DateTime.Now.Date)
            {
                if (model.status == OrderStatusEnum.Success)
                {
                    lst = lst.Union(OrderRA.List4In());
                }
                else
                {
                    lst = lst.Union(OrderRA.List4Failed(model));
                }
            }
            DataBiz.OrderMerge(ref lst);
            return(Result(lst.ToList()));
        }
Example #12
0
        private void JY_Order_Done(object sender, OrderResult e)
        {
            string[] keys = TradeRA.KeySearch("O_" + e.request_id + "_*");
            if (keys.Length == 0)
            {
                return;
            }

            Order order = OrderRA.Get(keys[0]);

            if (order.state_enum != OrderStatusEnum.Submitted)
            {
                return;
            }

            //委托失败解除冻结
            if (!e.result)
            {
                if (order.type_enum == OrderTypeEnum.Buy)
                {
                    string key_unit = "U_" + order.unit_id;
                    UnitRA.UpdateCapitalOrderBuy(-order.price * order.count, key_unit);
                }
                else if (order.type_enum == OrderTypeEnum.Sell)
                {
                    string key_position = "P_" + order.code + "_A_" + order.account_id + "_U_" + order.unit_id;
                    PositionRA.UpdateSellableOrderSell(order.count, key_position);
                }
                OrderRA.UpdateOrderFailed(keys[0], e.message);
                MessageBiz.Send(order.user_id.ToString(), MessageTypeEnum.Order_Failed, "[" + order.code + "]" + order.name + "委托失败。" + e.message);
                MonitorRA.Increment("account_" + account_id, "failed_count");
            }
            else
            {
                OrderRA.UpdateOrderSuccess(keys[0], order.unit_id, order.trade_no, e.order_no);
                MonitorRA.Increment("account_" + account_id, "success_count");
            }
        }
Example #13
0
        public Result <List <Order> > ListSubOrder(string trade_no)
        {
            List <Order> lst = OrderRA.List4Trade(trade_no);

            return(Result(lst));
        }