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