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