diff --git a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs index 24c76ce..7684f1e 100644 --- a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs +++ b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs @@ -4,21 +4,50 @@ using Microsoft.Extensions.Caching.Memory; using SDKAdapter.Model; using System; using System.Collections.Generic; +using System.Threading; using Yitter.IdGenerator; namespace Binance.TradeRobot.Business { public class BaseSpotOrderPublishBusiness : BaseBusiness { - protected DingBusiness dingBusiness { get; private set; } + protected DingBusiness dingBusiness; + protected RobotBusiness robotBusiness; public BaseSpotOrderPublishBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache, - DingBusiness dingBusiness) : base(fsql, logManager, idGenerator, memoryCache) { this.dingBusiness = dingBusiness; } + DingBusiness dingBusiness, + RobotBusiness robotBusiness) : base(fsql, logManager, idGenerator, memoryCache) + { + this.dingBusiness = dingBusiness; + this.robotBusiness = robotBusiness; + } + + /// + /// 检查订单是否存在 + /// + /// + /// 订单不存在异常 + protected void CheckOrderExists(long orderId) + { + var tryCount = 3; + while (tryCount > 0) + { + var isOrderExists = fsql.Select(orderId).Any(); + if (!isOrderExists) + { + tryCount--; + Thread.Sleep(1000); + continue; + } + return; + } + throw new BusinessException("订单不存在"); + } - public void HandleError(Exception ex, + protected void HandleError(Exception ex, List logList, string loggerName, long robotId, diff --git a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs index ea4b506..ba683cb 100644 --- a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs +++ b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs @@ -1,11 +1,13 @@ using Binance.TradeRobot.Common.DI; using Binance.TradeRobot.Model.Base; using Binance.TradeRobot.Model.Db; +using FreeSql; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using SDKAdapter.Model; using System; using System.Collections.Generic; +using System.Linq; using Yitter.IdGenerator; namespace Binance.TradeRobot.Business @@ -15,32 +17,51 @@ namespace Binance.TradeRobot.Business { public Enums.TradePolicy TradePolicy => Enums.TradePolicy.D21; - public RobotBusiness robotBusiness; - - public D21OrderPublishBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache, DingBusiness dingBusiness, RobotBusiness robotBusiness) : base(fsql, logManager, idGenerator, memoryCache, dingBusiness) + public D21OrderPublishBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache, DingBusiness dingBusiness, RobotBusiness robotBusiness) : base(fsql, logManager, idGenerator, memoryCache, dingBusiness, robotBusiness) { - this.robotBusiness = robotBusiness; + } public void OnSpotOrderPublish(SpotOrderPublishInfo spotOrderPublishInfo) { - var logger = logManager.GetLogger(spotOrderPublishInfo.LoggerName); + //var logger = logManager.GetLogger(spotOrderPublishInfo.LoggerName); var step = ""; var logList = new List(); try { - logList.Add(new ExecutionLog() + CheckOrderExists(spotOrderPublishInfo.OrderId); + + var robot = robotBusiness.GetD21PolicyRobotList(spotOrderPublishInfo.RobotId, isLoadRecentTradeProfit: false, isLoadAPIKey: true).FirstOrDefault(); + if (robot == null) + throw new BusinessException($"未找到机器人"); + + IUpdate updateSpotOrder = fsql.Update(spotOrderPublishInfo.OrderId).Set(o => o.State, spotOrderPublishInfo.SpotOrderState); + + if (spotOrderPublishInfo.SpotOrderState == Enums.SpotOrderState.Rejected || spotOrderPublishInfo.SpotOrderState == Enums.SpotOrderState.Expired) { - Id = idGenerator.NewLong(), - CreateTime = DateTime.Now, - OrderId = spotOrderPublishInfo.OrderId, - RobotId = spotOrderPublishInfo.RobotId, - SourceSingal = Enums.SingalType.订单推送, - Content = $"收到订单推送,订单号:{spotOrderPublishInfo.OrderId},订单方向:{spotOrderPublishInfo.TradeDirection},订单类型:{spotOrderPublishInfo.OrderType},订单状态:{spotOrderPublishInfo.SpotOrderState},本次成交额:{spotOrderPublishInfo.LastTradeAmount}" - }); + } + if (spotOrderPublishInfo.SpotOrderState == Enums.SpotOrderState.Filled) + { + logList.Add(new ExecutionLog() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = spotOrderPublishInfo.OrderId, + RobotId = spotOrderPublishInfo.RobotId, + SourceSingal = Enums.SingalType.订单推送, + Content = $"收到订单推送,订单号:{spotOrderPublishInfo.OrderId},订单方向:{spotOrderPublishInfo.TradeDirection},订单类型:{spotOrderPublishInfo.OrderType},订单状态:{spotOrderPublishInfo.SpotOrderState},成交额:{spotOrderPublishInfo.LastTradeAmount},成交量:{spotOrderPublishInfo.LastTradeQuantity},成交价:{spotOrderPublishInfo.LastTradePrice},手续费({spotOrderPublishInfo.FeeUnit}):{spotOrderPublishInfo.Fee}" + }); + updateSpotOrder = fsql.Update(spotOrderPublishInfo.OrderId) + //.Set(o => o.TradeCount + 1) + .Set(o => o.TradeAmount, spotOrderPublishInfo.CummulativeTradeAmount) + .Set(o => o.TradeQuantity, spotOrderPublishInfo.CummulativeTradeQuantity) + .Set(o => o.TradePrice, spotOrderPublishInfo.CummulativeTradeAmount / spotOrderPublishInfo.CummulativeTradeQuantity) + .Set(o => o.TradeFee, spotOrderPublishInfo.Fee) + .Set(o => o.TradeFeeUnit, spotOrderPublishInfo.FeeUnit); + } } catch (Exception ex) diff --git a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs index 916bf60..c5b38a1 100644 --- a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs +++ b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs @@ -234,6 +234,7 @@ namespace Binance.TradeRobot.Business Id = idGenerator.NewLong(), SourceSingal = singalRequest.SingalType, RobotId = robot.Id, + OrderId = orderId, CreateTime = DateTime.Now, Content = $"市价买单挂单成功,订单号:{orderId},挂单金额:{previewTradeAmount},借币金额:{diffAmount}" }); @@ -241,6 +242,8 @@ namespace Binance.TradeRobot.Business { fsql.Insert(logList).ExecuteAffrows(); fsql.Insert(buyOrder).ExecuteAffrows(); + if (diffAmount > 0M) + fsql.Update(robot.RobotAccount.Id).Set(ra => ra.LoanAmount + diffAmount).ExecuteAffrows(); if (previewTradeAmount != d21Robot.D21Policy.Position) //借币失败 仓位减少 fsql.Update(d21Robot.D21Policy.Id).Set(d => d.Position, previewTradeAmount).ExecuteAffrows(); }); @@ -338,6 +341,7 @@ namespace Binance.TradeRobot.Business Id = idGenerator.NewLong(), SourceSingal = singalRequest.SingalType, RobotId = robot.Id, + OrderId = orderId, CreateTime = DateTime.Now, Content = $"市价卖单挂单成功,订单号:{orderId},挂单数量:{saleQuantity}" }); diff --git a/SDKAdapter/Model/SpotOrderPublishInfo.cs b/SDKAdapter/Model/SpotOrderPublishInfo.cs index 8492a97..8410592 100644 --- a/SDKAdapter/Model/SpotOrderPublishInfo.cs +++ b/SDKAdapter/Model/SpotOrderPublishInfo.cs @@ -43,6 +43,8 @@ namespace SDKAdapter.Model public DateTime LastTradeTime { get; set; } + public string RejectedReason { get; set; } + public string LoggerName { get; set; } } } diff --git a/SDKAdapter/WebSockets/Order/Spot/BinanceSpotOrderWebSocketClient.cs b/SDKAdapter/WebSockets/Order/Spot/BinanceSpotOrderWebSocketClient.cs index 316dfed..1a80477 100644 --- a/SDKAdapter/WebSockets/Order/Spot/BinanceSpotOrderWebSocketClient.cs +++ b/SDKAdapter/WebSockets/Order/Spot/BinanceSpotOrderWebSocketClient.cs @@ -53,6 +53,7 @@ namespace SDKAdapter.WebSockets.Order.Spot { Binance.Net.Enums.OrderStatus.New, Binance.Net.Enums.OrderStatus.PendingCancel, + Binance.Net.Enums.OrderStatus.PartiallyFilled, //由于无法确定手续费时候存在局部,暂时忽略局部成交 Binance.Net.Enums.OrderStatus.Insurance, Binance.Net.Enums.OrderStatus.Adl };