/// <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); }
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); }