From 5c9a75be9e92af0e864c9cc5759ce240a9bdf17b Mon Sep 17 00:00:00 2001 From: shanj <18996038927@163.com> Date: Tue, 17 May 2022 06:30:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81=20=E6=9C=AA=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Binance.TradeRobot.API.xml | 14 +++ .../Binance.TradeRobot.Business.xml | 21 ++-- .../Spot/BaseSpotOrderPublishBusiness.cs | 4 +- .../Spot/D21OrderPublishBusiness.cs | 20 +++- .../Business/RobotBusiness.cs | 102 ++++++++++-------- .../Business/SingalBusiness.cs | 11 +- .../TradeBusiness/Spot/D21TradeBusiness.cs | 4 +- Binance.TradeRobot.Model/Base/Enums.cs | 2 +- .../Binance.TradeRobot.Model.xml | 13 ++- .../Db/Order/ExecutionLog.cs | 5 +- .../Dto/Request/Singal/BaseSingalRequest.cs | 2 + 11 files changed, 130 insertions(+), 68 deletions(-) diff --git a/Binance.TradeRobot.API/Binance.TradeRobot.API.xml b/Binance.TradeRobot.API/Binance.TradeRobot.API.xml index 6283bb2..0f8a81d 100644 --- a/Binance.TradeRobot.API/Binance.TradeRobot.API.xml +++ b/Binance.TradeRobot.API/Binance.TradeRobot.API.xml @@ -48,6 +48,20 @@ + + + 获取现货/逐仓杠杆订单记录(最近20条) + + + + + + + 获取执行日志记录(最近50条) + + + + 开启机器人 diff --git a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml index e1c6af7..389bcf3 100644 --- a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml +++ b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml @@ -40,7 +40,7 @@ - + 查询机器人基本信息 @@ -48,6 +48,7 @@ + 交易所账号Id @@ -66,6 +67,14 @@ 现货策略 + + + 创建客户端订单号 + + + + + 趋势变化 @@ -129,15 +138,15 @@ - + - 订阅订单推送 + 取消订阅K线 - + - 取消订阅K线 + 订阅订单推送 @@ -151,7 +160,7 @@ 获取指定交易对现货最新成交价 - + diff --git a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs index 571c98f..f770141 100644 --- a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs +++ b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/BaseSpotOrderPublishBusiness.cs @@ -28,13 +28,13 @@ namespace Binance.TradeRobot.Business logList.Add(new ExecutionLog() { Id = idGenerator.NewLong(), - SourceSingal = Enums.SingalType.订单回调, + SourceSingal = Enums.SingalType.订单推送, RobotId = robotId, CreateTime = DateTime.Now, Content = ex.Message }); try { fsql.Insert(logList).ExecuteAffrows(); } catch { } - var errorMsg = $"交易警报,{Enums.SingalType.订单回调},{loggerName},robot {robotId},order {orderId},{step}"; + var errorMsg = $"交易警报,{Enums.SingalType.订单推送},{loggerName},robot {robotId},order {orderId},{step}"; logManager.GetLogger(loggerName).Error(ex, errorMsg); dingBusiness.Send($"{errorMsg} {ex.Message}"); } diff --git a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs index c1a7841..e59e805 100644 --- a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs +++ b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs @@ -1,9 +1,11 @@ using Binance.TradeRobot.Common.DI; using Binance.TradeRobot.Model.Base; +using Binance.TradeRobot.Model.Db; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using SDKAdapter.Model; using System; +using System.Collections.Generic; using Yitter.IdGenerator; namespace Binance.TradeRobot.Business @@ -12,25 +14,35 @@ namespace Binance.TradeRobot.Business internal class D21OrderPublishBusiness : BaseSpotOrderPublishBusiness, ISpotOrderPublishBusiness { public Enums.TradePolicy TradePolicy => Enums.TradePolicy.D21; + private RobotBusiness robotBusiness; - public D21OrderPublishBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache, DingBusiness dingBusiness) : 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) { - + this.robotBusiness = robotBusiness; } public void OnSpotOrderPublish(SpotOrderPublishInfo spotOrderPublishInfo) { - return; var logger = logManager.GetLogger(spotOrderPublishInfo.LoggerName); var step = ""; + var logList = new List(); try { + 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}" + }); } catch (Exception ex) { - HandleError(ex, null, spotOrderPublishInfo.LoggerName, spotOrderPublishInfo.RobotId, spotOrderPublishInfo.OrderId, step); + HandleError(ex, logList, spotOrderPublishInfo.LoggerName, spotOrderPublishInfo.RobotId, spotOrderPublishInfo.OrderId, step); } } } diff --git a/Binance.TradeRobot.Business/Business/RobotBusiness.cs b/Binance.TradeRobot.Business/Business/RobotBusiness.cs index 85dc49d..7b13439 100644 --- a/Binance.TradeRobot.Business/Business/RobotBusiness.cs +++ b/Binance.TradeRobot.Business/Business/RobotBusiness.cs @@ -200,67 +200,77 @@ namespace Binance.TradeRobot.Business /// /// 获取动2.1策略机器人列表 /// + /// /// 机器人状态 /// 信号周期 /// 交易对 /// 是否加载近期交易利润,默认true /// 是否加载机器人绑定的APIKey,默认false /// - public IList GetD21PolicyRobotList(Enums.RobotState? robotState = null, + public IList GetD21PolicyRobotList(long? robotId, + Enums.RobotState? robotState = null, Enums.SignalPeriod? signalPeriod = null, string symbol = "", bool isLoadRecentTradeProfit = true, bool isLoadAPIKey = false) { - var robotList = fsql.Select().InnerJoin((r, ra, d, e) => r.Id == ra.RobotId) - .InnerJoin((r, ra, d, e) => r.Id == d.RobotId) - .InnerJoin((r, ra, d, e) => r.Id == e.RobotId) - .WhereIf(robotState != null, (r, ra, d, e) => r.State == robotState) - .WhereIf(signalPeriod != null, (r, ra, d, e) => d.PeriodicSignal == signalPeriod) - .WhereIf(!string.IsNullOrEmpty(symbol), (r, ra, d, e) => r.Symbol == symbol) - .Where((r, ra, d, e) => r.TradePolicy == Enums.TradePolicy.D21) - .ToList((r, ra, d, e) => new Robot - { - Id = r.Id, - BusinessType = r.BusinessType, - ExchangeId = r.ExchangeId, - Symbol = r.Symbol, - State = r.State, - RunningTime = r.RunningTime, - CreateTime = r.CreateTime, - TradePolicy = r.TradePolicy, + var select = fsql.Select().InnerJoin((r, ra, d, e) => r.Id == ra.RobotId) + .InnerJoin((r, ra, d, e) => r.Id == d.RobotId) + .InnerJoin((r, ra, d, e) => r.Id == e.RobotId); + if (robotId != null) + { + select = select.Where((r, ra, d, e) => r.Id == robotId); + } + else + { + select = select.WhereIf(robotState != null, (r, ra, d, e) => r.State == robotState) + .WhereIf(signalPeriod != null, (r, ra, d, e) => d.PeriodicSignal == signalPeriod) + .WhereIf(!string.IsNullOrEmpty(symbol), (r, ra, d, e) => r.Symbol == symbol) + .Where((r, ra, d, e) => r.TradePolicy == Enums.TradePolicy.D21); + } + + var robotList = select.ToList((r, ra, d, e) => new Robot + { + Id = r.Id, + BusinessType = r.BusinessType, + ExchangeId = r.ExchangeId, + Symbol = r.Symbol, + State = r.State, + RunningTime = r.RunningTime, + CreateTime = r.CreateTime, + TradePolicy = r.TradePolicy, - //SymbolId = s.Id, - //SymbolSaleQuantityAccuracy = s.SaleQuantityAccuracy, + //SymbolId = s.Id, + //SymbolSaleQuantityAccuracy = s.SaleQuantityAccuracy, - RobotAccountId = ra.Id, - ClosePositionCount = ra.ClosePositionCount, - WinCount = ra.WinCount, - LoanAmount = ra.LoanAmount, - SoptCurrentcyAmount = ra.SoptCurrentcyAmount, - SpotCurrencyQuantity = ra.SpotCurrencyQuantity, - TotalProfit = ra.TotalProfit, + RobotAccountId = ra.Id, + ClosePositionCount = ra.ClosePositionCount, + WinCount = ra.WinCount, + LoanAmount = ra.LoanAmount, + SoptCurrentcyAmount = ra.SoptCurrentcyAmount, + SpotCurrencyQuantity = ra.SpotCurrencyQuantity, + TotalProfit = ra.TotalProfit, - ExchangeAccountId = e.AccountId, - ExchangeAPIKey = e.APIKey, - ExchangeSecretKey = e.SecretKey, + ExchangeAccountId = e.AccountId, + ExchangeAPIKey = e.APIKey, + ExchangeSecretKey = e.SecretKey, - D21ExecutionMode = d.ExecutionMode, - D21IsEnabledIncreasePurchase = d.IsEnabledIncreasePurchase, - D21IsEnableRemedyForErrorCrossSignal = d.IsEnableRemedyForErrorCrossSignal, - D21MaxFollowPurchaseRatio = d.MaxFollowPurchaseRatio, - D21PeriodicSignal = d.PeriodicSignal, - D21PolicyId = d.Id, - D21Position = d.Position, - D21Assets = d.Assets, - D21Level1PositionStopLossRatio = d.Level1PositionStopLossRatio, - D21Level1PriceStopLossRatio = d.Level1PriceStopLossRatio, - D21Level2PositionStopLossRatio = d.Level2PositionStopLossRatio, - D21Level2PriceStopLossRatio = d.Level2PriceStopLossRatio, - D21MaxExchangeLoanRatio = d.MaxExchangeLoanRatio, - D21MaxSystemLoanRatio = d.MaxSystemLoanRatio, - D21CreateTime = d.CreateTime - }).Map>(); + D21ExecutionMode = d.ExecutionMode, + D21IsEnabledIncreasePurchase = d.IsEnabledIncreasePurchase, + D21IsEnableRemedyForErrorCrossSignal = d.IsEnableRemedyForErrorCrossSignal, + D21MaxFollowPurchaseRatio = d.MaxFollowPurchaseRatio, + D21PeriodicSignal = d.PeriodicSignal, + D21PolicyId = d.Id, + D21Position = d.Position, + D21Assets = d.Assets, + D21Level1PositionStopLossRatio = d.Level1PositionStopLossRatio, + D21Level1PriceStopLossRatio = d.Level1PriceStopLossRatio, + D21Level2PositionStopLossRatio = d.Level2PositionStopLossRatio, + D21Level2PriceStopLossRatio = d.Level2PriceStopLossRatio, + D21MaxExchangeLoanRatio = d.MaxExchangeLoanRatio, + D21MaxSystemLoanRatio = d.MaxSystemLoanRatio, + D21CreateTime = d.CreateTime + }).Map>(); if (isLoadRecentTradeProfit) diff --git a/Binance.TradeRobot.Business/Business/SingalBusiness.cs b/Binance.TradeRobot.Business/Business/SingalBusiness.cs index 4b4edfc..b3205ff 100644 --- a/Binance.TradeRobot.Business/Business/SingalBusiness.cs +++ b/Binance.TradeRobot.Business/Business/SingalBusiness.cs @@ -38,15 +38,16 @@ namespace Binance.TradeRobot.Business public void D21Singal(D21SingalRequest d21SingalRequest) { //logManager.GetLogger("D21").Info(JsonConvert.SerializeObject(d21SingalRequest)); - var robotList = robotBusiness.GetD21PolicyRobotList(Enums.RobotState.Runing, - d21SingalRequest.KLinePeriodic, - d21SingalRequest.Symbol, - false, + var robotList = robotBusiness.GetD21PolicyRobotList(d21SingalRequest.RobotId, + Enums.RobotState.Runing, + d21SingalRequest.KLinePeriodic, + d21SingalRequest.Symbol, + false, true); if (robotList == null || robotList.Count() == 0) throw new BusinessException("未找到符合条件的机器人"); - var symbolInfo = exchangeBusiness.GetSymbol(robotList[0].ExchangeId, + var symbolInfo = exchangeBusiness.GetSymbol(robotList[0].ExchangeId, robotList[0].Symbol); if (symbolInfo == null) throw new BusinessException($"未找到交易对{robotList[0].Symbol}({robotList[0].ExchangeId})"); diff --git a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs index 1d193dc..916bf60 100644 --- a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs +++ b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs @@ -235,7 +235,7 @@ namespace Binance.TradeRobot.Business SourceSingal = singalRequest.SingalType, RobotId = robot.Id, CreateTime = DateTime.Now, - Content = $"市价买单挂单成功,orderId:{orderId}" + Content = $"市价买单挂单成功,订单号:{orderId},挂单金额:{previewTradeAmount},借币金额:{diffAmount}" }); fsql.Transaction(() => { @@ -339,7 +339,7 @@ namespace Binance.TradeRobot.Business SourceSingal = singalRequest.SingalType, RobotId = robot.Id, CreateTime = DateTime.Now, - Content = $"市价卖单挂单成功,orderId:{orderId}" + Content = $"市价卖单挂单成功,订单号:{orderId},挂单数量:{saleQuantity}" }); fsql.Transaction(() => { diff --git a/Binance.TradeRobot.Model/Base/Enums.cs b/Binance.TradeRobot.Model/Base/Enums.cs index c56c091..769e365 100644 --- a/Binance.TradeRobot.Model/Base/Enums.cs +++ b/Binance.TradeRobot.Model/Base/Enums.cs @@ -217,7 +217,7 @@ namespace Binance.TradeRobot.Model.Base 小趋势看空 = 9, 多交叉 = 10, 空交叉 = 11, - 订单回调 = 100 + 订单推送 = 100 } #endregion } diff --git a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml index dfa9409..73faa89 100644 --- a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml +++ b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml @@ -46,7 +46,7 @@ - 币币 + 币币(现货) @@ -739,6 +739,17 @@ 运行时长(s) + + + 订单推送监听实例Key + 币安逐仓杠杆需要单独的运行实例 + + + + + 订单推送日志Key + + 机器人账户对象 diff --git a/Binance.TradeRobot.Model/Db/Order/ExecutionLog.cs b/Binance.TradeRobot.Model/Db/Order/ExecutionLog.cs index 509a930..8055683 100644 --- a/Binance.TradeRobot.Model/Db/Order/ExecutionLog.cs +++ b/Binance.TradeRobot.Model/Db/Order/ExecutionLog.cs @@ -12,7 +12,7 @@ namespace Binance.TradeRobot.Model.Db [Column(DbType = "bigint", IsPrimary = true)] public long Id { get; set; } - [Column(StringLength = 250, IsNullable = false)] + [Column(StringLength = 300, IsNullable = false)] public string Content { get; set; } [Column(DbType = "datetime")] @@ -21,6 +21,9 @@ namespace Binance.TradeRobot.Model.Db [Column(DbType = "bigint")] public long RobotId { get; set; } + [Column(DbType = "bigint", IsNullable = true)] + public long? OrderId { get; set; } + /// /// Դź /// diff --git a/Binance.TradeRobot.Model/Dto/Request/Singal/BaseSingalRequest.cs b/Binance.TradeRobot.Model/Dto/Request/Singal/BaseSingalRequest.cs index a32e1b9..8ac6a49 100644 --- a/Binance.TradeRobot.Model/Dto/Request/Singal/BaseSingalRequest.cs +++ b/Binance.TradeRobot.Model/Dto/Request/Singal/BaseSingalRequest.cs @@ -4,6 +4,8 @@ namespace Binance.TradeRobot.Model.Dto { public class BaseSingalRequest { + public long? RobotId { get; set; } + public Enums.SingalType SingalType { get; set; } ///