Esempio n. 1
0
        /// <summary>
        /// 取消订单
        /// </summary>
        /// <param name="currency">货币类型</param>
        /// <param name="tradeId">内部交易订单ID</param>
        /// <param name="orderId">远程服务器订单ID</param>
        /// <returns></returns>
        public static bool CancelTrade(CurrencyType currency, long tradeId, string orderId)
        {
            var remoteResult = TradeServices.CancelOrder(orderId, currency);
            var localResult  = TradeBookRepository.CancelOrder(tradeId);

            return(remoteResult.Code == "1000" && localResult == 1);
        }
Esempio n. 2
0
        /// <summary>
        /// 创建交易订单
        /// </summary>
        /// <param name="currency">交易货币类型</param>
        /// <param name="price">价格</param>
        /// <param name="volume">交易量</param>
        /// <param name="profitPrice">利润单价</param>
        /// <returns></returns>
        public static bool CreateTrade(CurrencyType currency, decimal price, decimal volume, decimal profitPrice)
        {
            if (volume * price > 10)
            {
                throw new Exception("主人很穷,测试下单就不要搞那么大数据了吧!");
            }
            var tradeId = 0;
            var result  = new ResponseModel()
            {
                Code = "1000"
            };                                                 //TradeServices.Order(price, volume, TradeType.buy, currency);

            if (result.Code == "1000")
            {
                var tradeBook = new TradeBook();
                tradeBook.BuyOrderId      = result.Id;
                tradeBook.BuyPrice        = price;
                tradeBook.BuyVolume       = volume;
                tradeBook.BuyTradeAmount  = volume * price;
                tradeBook.BuyTradePrice   = 0;
                tradeBook.BuyTradeVolume  = 0;
                tradeBook.SellOrderId     = "";
                tradeBook.SellPrice       = 0;
                tradeBook.SellVolume      = 0;
                tradeBook.SellTradeAmount = 0;
                tradeBook.SellTradeVolume = 0;
                tradeBook.SellTradePrice  = 0;
                tradeBook.Profit          = profitPrice;
                tradeBook.Status          = TradeStatus.买单中.ToString();
                tradeBook.UpdateDate      = DateTime.Now.ToString();
                tradeBook.CreateDate      = DateTime.Now.ToString();
                tradeId = TradeBookRepository.CrateOrder(tradeBook);
            }
            return(result.Code == "1000" && tradeId > 0);
        }
Esempio n. 3
0
        public void InsertTest()
        {
            var trade = new TradeBook();

            trade.BuyOrderId      = "235245213353431";
            trade.BuyPrice        = 13;
            trade.BuyVolume       = 1;
            trade.BuyTradeVolume  = 0;
            trade.BuyTradePrice   = 0;
            trade.BuyTradeAmount  = 0;
            trade.SellOrderId     = "";
            trade.SellPrice       = 3;
            trade.SellVolume      = 0;
            trade.SellTradeVolume = 0;
            trade.SellTradePrice  = 0;
            trade.SellTradeAmount = 0;
            trade.Profit          = 1;
            trade.Status          = TradeStatus.买单中.ToString();
            trade.UpdateDate      = DateTime.Now.ToString();
            trade.CreateDate      = DateTime.Now.ToString();
            var result = TradeBookRepository.CrateOrder(trade);

            //var result = TradeBookRepository.CreateTradeBook2(trade);
            Assert.IsTrue(result == 1);
        }
Esempio n. 4
0
        /// <summary>
        /// 获取活跃订单
        /// </summary>
        /// <returns></returns>
        public static ObservableCollection <TradeBookModel> GetActiveTrades()
        {
            var list = TradeBookRepository.GetActiveTrade();

            list.ToList().ForEach(s => s.SellPrice = s.SellPrice.ToFixed(2));
            Mapper.Initialize(m => m.CreateMap <TradeBook, TradeBookModel>());
            return(Mapper.Map <IEnumerable <TradeBook>, ObservableCollection <TradeBookModel> >(list));
        }
Esempio n. 5
0
        public void GetOrderTest()
        {
            var result = TradeBookRepository.GetActiveTrade().ToJson();

            Assert.IsTrue(result.Any());
        }
Esempio n. 6
0
        public void UpdateTest()
        {
            var result = TradeBookRepository.CancelOrder(1);

            Assert.IsTrue(result == 1);
        }
Esempio n. 7
0
        public static bool CheckTradeOrder(CurrencyType currency)
        {
            //是否更新过订单状态
            bool enableUpdate       = false;
            bool isUpdate           = false;
            var  localActiveOrders  = TradeBookRepository.GetActiveTrade();
            var  remoteActiveOrders = TradeServices.GetOrdersIgnoreTradeType(currency, 1, 100);
            var  currencSetting     = CurrencyRepository.GetCurrency(currency.ToString().Replace("_cny", "").ToUpper());

            foreach (var lOrder in localActiveOrders)
            {
                var rOrder = remoteActiveOrders.FirstOrDefault(q => q.Id == lOrder.BuyOrderId || q.Id == lOrder.SellOrderId);
                try
                {
                    //如果匹配不到,则直接通过订单Id查询远程订单详情
                    var orderId = TradeStatus.买单中.ToString() == lOrder.Status ? lOrder.BuyOrderId : lOrder.SellOrderId;
                    rOrder = rOrder ?? TradeServices.GetOrder(orderId, currency);
                    //如果最后还是匹配不到,则说明不是通过助手创建的订单,不做任何处理,直接跳过。
                    if (rOrder == null)
                    {
                        continue;
                    }
                    ;
                    //无论买单、卖单,如果是部分交易完成,则直接取消远程订单
                    if (rOrder.Status == 3)
                    {
                        var result = TradeServices.CancelOrder(rOrder.Id, currency);
                        if (result.Code != "1000")
                        {
                            Logger.Info($"远程订单[{rOrder.Id}]取消失败,返回结果:{result.ToJson()}");
                        }
                    }
                    if (new[] { 2, 3 }.Contains(rOrder.Status) && rOrder.TradeType == TradeType.buy && lOrder.Status == TradeStatus.买单中.ToString())
                    {
                        //公式: 买单手续费= 已成交量 * 成交均价 * 委托挂单费率;
                        var buyFee = rOrder.TradeAmount * rOrder.TradePrice * currencSetting.MakerRate;
                        //预估卖单价格
                        var sellPrice = BudgetaryPrice(rOrder.TradeAmount, currencSetting.DefaultProfit, rOrder.Price, buyFee, currencSetting.MakerRate);

                        var result = TradeServices.Order(sellPrice, rOrder.TradeAmount, TradeType.sell, currency);
                        if (result.Code == "2009")
                        {
                            Logger.Info($"账户余额不足,取消订单[{lOrder.TradeId}],返回结果:{result.ToJson()}");
                            TradeBookRepository.CancelOrder(lOrder.TradeId ?? 0);
                            enableUpdate = true;
                            continue;
                        }
                        if (result.Code != "1000")
                        {
                            Logger.Info($"创建远程卖单失败,对应本地订单[{lOrder.TradeId}],返回结果:{result.ToJson()}");
                            continue;
                        }
                        lOrder.BuyTradeVolume = rOrder.TradeAmount;
                        lOrder.BuyTradePrice  = rOrder.TradePrice;
                        lOrder.BuyTradeAmount = rOrder.TradeAmount * rOrder.TradePrice;
                        lOrder.SellOrderId    = result.Id;
                        lOrder.SellPrice      = sellPrice;
                        lOrder.SellVolume     = rOrder.TradeAmount;
                        lOrder.Status         = TradeStatus.卖单中.ToString();
                        enableUpdate          = true;
                        isUpdate = true;
                    }
                    else if (new[] { 2, 3 }.Contains(rOrder.Status) && rOrder.TradeType == TradeType.sell && lOrder.Status == TradeStatus.卖单中.ToString())
                    {
                        lOrder.SellTradePrice  = rOrder.Price;
                        lOrder.SellTradeVolume = rOrder.TradeAmount;
                        lOrder.SellTradeAmount = rOrder.Price * rOrder.TradeAmount;
                        lOrder.Status          = TradeStatus.已完成.ToString();
                        enableUpdate           = true;
                        isUpdate = true;
                    }
                    if (rOrder.Status == 1)
                    {
                        lOrder.Status = TradeStatus.已取消.ToString();
                        TradeBookRepository.CancelOrder(lOrder.TradeId ?? 0);
                        enableUpdate = true;
                        //isUpdate = true;
                    }
                    if (isUpdate)
                    {
                        //根据匹配结果,更新本地订单状态
                        if (TradeBookRepository.UpdateOrder(lOrder) != 1)
                        {
                            Logger.Error($"更新本地订单[{lOrder.TradeId}]状态失败:买单中==>卖单中");
                        }
                        isUpdate = false;
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error($"LocalOrder:{lOrder.ToJson()},RemoteOrder:{rOrder.ToJson()},Ex:{ex.ToJson()}");
                }
            }
            return(enableUpdate);
        }