/// <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); }
/// <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); }
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); }
/// <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)); }
public void GetOrderTest() { var result = TradeBookRepository.GetActiveTrade().ToJson(); Assert.IsTrue(result.Any()); }
public void UpdateTest() { var result = TradeBookRepository.CancelOrder(1); Assert.IsTrue(result == 1); }
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); }