From fff4834a128ef8c721ee13b0a173a8f3d7fd92b4 Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Wed, 27 Apr 2022 04:14:14 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=8A=A82.1=E7=AD=96?=
 =?UTF-8?q?=E7=95=A5=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Binance.TradeRobot.API.xml                |  26 +++-
 .../Controllers/RobotController.cs            |  32 ++++-
 .../Controllers/SpotPolicyController.cs       |  30 ++++
 .../Binance.TradeRobot.Business.xml           |  19 ++-
 .../Business/RobotBusiness.cs                 |  55 +++++--
 .../Business/SpotPolicyBusiness.cs            |  39 +++++
 .../Base/MappingProfiles.cs                   |  16 ++-
 .../Binance.TradeRobot.Model.xml              | 136 ++++++++++++++----
 .../Db/Policy/Spot/D21Policy.cs               |  40 +++++-
 Binance.TradeRobot.Model/Db/Robot/Robot.cs    |  40 +++++-
 .../Db/Robot/RobotAccount.cs                  |   2 +-
 .../EditPyramidPolicyRequest.cs}              |   4 +-
 .../Request/Robot/AddD21PolicyRobotRequest.cs |  41 ------
 .../SpotPolicy/EditD21PolicyRequest.cs        |  59 ++++++++
 14 files changed, 433 insertions(+), 106 deletions(-)
 create mode 100644 Binance.TradeRobot.API/Controllers/SpotPolicyController.cs
 create mode 100644 Binance.TradeRobot.Business/Business/SpotPolicyBusiness.cs
 rename Binance.TradeRobot.Model/Dto/Request/{Robot/AddPyramidPolicyRobotRequest.cs => PrepPolicy/EditPyramidPolicyRequest.cs} (87%)
 delete mode 100644 Binance.TradeRobot.Model/Dto/Request/Robot/AddD21PolicyRobotRequest.cs
 create mode 100644 Binance.TradeRobot.Model/Dto/Request/SpotPolicy/EditD21PolicyRequest.cs

diff --git a/Binance.TradeRobot.API/Binance.TradeRobot.API.xml b/Binance.TradeRobot.API/Binance.TradeRobot.API.xml
index 8cb7238..3cec8e8 100644
--- a/Binance.TradeRobot.API/Binance.TradeRobot.API.xml
+++ b/Binance.TradeRobot.API/Binance.TradeRobot.API.xml
@@ -31,17 +31,29 @@
             <param name="exchangeId"></param>
             <returns></returns>
         </member>
-        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.AddPyramidPolicyRobot(Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest)">
+        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.StartRobot(System.Int64)">
+            <summary>
+            开启机器人
+            </summary>
+            <param name="robotId"></param>
+        </member>
+        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.StopRobot(System.Int64)">
+            <summary>
+            停止机器人
+            </summary>
+            <param name="robotId"></param>
+        </member>
+        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.AddPyramidPolicyRobot(Binance.TradeRobot.Model.Dto.AddRobotRequest)">
             <summary>
             创建金字塔策略机器人
             </summary>
-            <param name="addPyramidPolicyRobotRequest"></param>
+            <param name="addRobotRequest"></param>
         </member>
-        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.AddD21PolicyRobot(Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest)">
+        <member name="M:Binance.TradeRobot.API.Controllers.RobotController.AddD21PolicyRobot(Binance.TradeRobot.Model.Dto.AddRobotRequest)">
             <summary>
             创建动2.1策略机器人
             </summary>
-            <param name="addD21PolicyRobotRequest"></param>
+            <param name="addRobotRequest"></param>
         </member>
         <member name="M:Binance.TradeRobot.API.Controllers.RobotController.GetD21PolicyRobotList">
             <summary>
@@ -49,6 +61,12 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="M:Binance.TradeRobot.API.Controllers.SpotPolicyController.EditD21Policy(Binance.TradeRobot.Model.Dto.EditD21PolicyRequest)">
+            <summary>
+            编辑动2.1策略
+            </summary>
+            <param name="editD21PolicyRequest"></param>
+        </member>
         <member name="M:Binance.TradeRobot.API.Controllers.UserController.Login(Binance.TradeRobot.Model.Dto.LoginRequest)">
             <summary>
             用户登录
diff --git a/Binance.TradeRobot.API/Controllers/RobotController.cs b/Binance.TradeRobot.API/Controllers/RobotController.cs
index 8d38e25..8acb9b2 100644
--- a/Binance.TradeRobot.API/Controllers/RobotController.cs
+++ b/Binance.TradeRobot.API/Controllers/RobotController.cs
@@ -17,24 +17,44 @@ namespace Binance.TradeRobot.API.Controllers
             this.robotBusiness = robotBusiness;
         }
 
+        /// <summary>
+        /// 开启机器人
+        /// </summary>
+        /// <param name="robotId"></param>
+        [HttpPost("{robotId}")]
+        public void StartRobot([FromRoute] long robotId)
+        {
+            robotBusiness.StartRobot(robotId);
+        }
+
+        /// <summary>
+        /// 停止机器人
+        /// </summary>
+        /// <param name="robotId"></param>
+        [HttpPost("{robotId}")]
+        public void StopRobot([FromRoute] long robotId)
+        {
+            robotBusiness.StopRobot(robotId);
+        }
+
         /// <summary>
         /// 创建金字塔策略机器人
         /// </summary>
-        /// <param name="addPyramidPolicyRobotRequest"></param>
+        /// <param name="addRobotRequest"></param>
         [HttpPost]
-        public void AddPyramidPolicyRobot([FromBody] AddPyramidPolicyRobotRequest addPyramidPolicyRobotRequest)
+        public void AddPyramidPolicyRobot([FromBody] AddRobotRequest addRobotRequest)
         {
-            robotBusiness.AddPyramidPolicyRobot(addPyramidPolicyRobotRequest);
+            robotBusiness.AddPyramidPolicyRobot(addRobotRequest);
         }
 
         /// <summary>
         /// 创建动2.1策略机器人
         /// </summary>
-        /// <param name="addD21PolicyRobotRequest"></param>
+        /// <param name="addRobotRequest"></param>
         [HttpPost]
-        public void AddD21PolicyRobot([FromBody] AddD21PolicyRobotRequest addD21PolicyRobotRequest)
+        public void AddD21PolicyRobot([FromBody] AddRobotRequest addRobotRequest)
         {
-            robotBusiness.AddD21PolicyRobot(addD21PolicyRobotRequest);
+            robotBusiness.AddD21PolicyRobot(addRobotRequest);
         }
 
         /// <summary>
diff --git a/Binance.TradeRobot.API/Controllers/SpotPolicyController.cs b/Binance.TradeRobot.API/Controllers/SpotPolicyController.cs
new file mode 100644
index 0000000..81be016
--- /dev/null
+++ b/Binance.TradeRobot.API/Controllers/SpotPolicyController.cs
@@ -0,0 +1,30 @@
+using Binance.TradeRobot.Business;
+using Binance.TradeRobot.Model.Dto;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Binance.TradeRobot.API.Controllers
+{
+    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
+    public class SpotPolicyController : BaseApiController
+    {
+        private SpotPolicyBusiness spotPolicyBusiness;
+
+        public SpotPolicyController(SpotPolicyBusiness spotPolicyBusiness)
+        {
+            this.spotPolicyBusiness = spotPolicyBusiness;
+        }
+
+        /// <summary>
+        /// 编辑动2.1策略
+        /// </summary>
+        /// <param name="editD21PolicyRequest"></param>
+        [HttpPost]
+        public void EditD21Policy([FromBody] EditD21PolicyRequest editD21PolicyRequest)
+        {
+            spotPolicyBusiness.EditD21Policy(editD21PolicyRequest);
+        }
+    }
+}
diff --git a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml
index 1588b16..df414b2 100644
--- a/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml
+++ b/Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml
@@ -28,17 +28,28 @@
             <param name="tran"></param>
             <returns>机器人Id</returns>
         </member>
-        <member name="M:Binance.TradeRobot.Business.RobotBusiness.AddPyramidPolicyRobot(Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest)">
+        <member name="M:Binance.TradeRobot.Business.RobotBusiness.AddPyramidPolicyRobot(Binance.TradeRobot.Model.Dto.AddRobotRequest)">
             <summary>
             添加金字塔策略机器人
             </summary>
-            <param name="addPyramidPolicyRobotRequest"></param>
+            <param name="addRobotRequest"></param>
         </member>
-        <member name="M:Binance.TradeRobot.Business.RobotBusiness.AddD21PolicyRobot(Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest)">
+        <member name="M:Binance.TradeRobot.Business.RobotBusiness.AddD21PolicyRobot(Binance.TradeRobot.Model.Dto.AddRobotRequest)">
             <summary>
             添加动2.1策略机器人
             </summary>
-            <param name="addD21PolicyRobotRequest"></param>
+            <param name="addRobotRequest"></param>
+        </member>
+        <member name="M:Binance.TradeRobot.Business.RobotBusiness.GetD21PolicyRobotList">
+            <summary>
+            获取动2.1策略机器人列表
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Binance.TradeRobot.Business.SpotPolicyBusiness">
+            <summary>
+            现货策略
+            </summary>
         </member>
         <member name="M:Binance.TradeRobot.Business.UserBusiness.OneWayAssetChange(System.Int64,System.Decimal,System.Int64,Binance.TradeRobot.Model.Base.Enums.CapitalChangeType,System.String)">
             <summary>
diff --git a/Binance.TradeRobot.Business/Business/RobotBusiness.cs b/Binance.TradeRobot.Business/Business/RobotBusiness.cs
index 7c3b541..9186379 100644
--- a/Binance.TradeRobot.Business/Business/RobotBusiness.cs
+++ b/Binance.TradeRobot.Business/Business/RobotBusiness.cs
@@ -6,6 +6,7 @@ using Binance.TradeRobot.Model.Db;
 using Binance.TradeRobot.Model.Dto;
 using Microsoft.Extensions.Caching.Memory;
 using Microsoft.Extensions.DependencyInjection;
+using System;
 using System.Collections.Generic;
 using System.Data.Common;
 using Yitter.IdGenerator;
@@ -45,6 +46,16 @@ namespace Binance.TradeRobot.Business
                 throw new BusinessException("同一个交易所账号下只允许存在一个交易对");
         }
 
+        public void StartRobot(long robotId)
+        {
+
+        }
+
+        public void StopRobot(long robotId)
+        {
+
+        }
+
         /// <summary>
         /// 添加机器人和账户
         /// </summary>
@@ -61,6 +72,9 @@ namespace Binance.TradeRobot.Business
                 TradePolicy = addRobotRequest.TradePolicy,
                 BusinessType = addRobotRequest.TradePolicy.GetBusinessType(),
                 ExchangeId = addRobotRequest.ExchangeId,
+                CreateTime = DateTime.Now,
+                RunningTime = 0,
+                State = Enums.RobotState.Stop
             }).WithTransaction(tran).ExecuteAffrows();
 
             fsql.Insert(new RobotAccount()
@@ -77,16 +91,16 @@ namespace Binance.TradeRobot.Business
         /// <summary>
         /// 添加金字塔策略机器人
         /// </summary>
-        /// <param name="addPyramidPolicyRobotRequest"></param>
-        public void AddPyramidPolicyRobot(AddPyramidPolicyRobotRequest addPyramidPolicyRobotRequest)
+        /// <param name="addRobotRequest"></param>
+        public void AddPyramidPolicyRobot(AddRobotRequest addRobotRequest)
         {
-            CheckRobotRegister(addPyramidPolicyRobotRequest, out ExchangeAPIKey exchangeAPIKey);
-            var pyramidPolicy = addPyramidPolicyRobotRequest.Map<PyramidPolicy>();
+            CheckRobotRegister(addRobotRequest, out ExchangeAPIKey exchangeAPIKey);
+            var pyramidPolicy = new PyramidPolicy();
             pyramidPolicy.Id = idGenerator.NewLong();
             fsql.Transaction(() =>
             {
                 var tran = fsql.Ado.TransactionCurrentThread;
-                pyramidPolicy.RobotId = AddRobotWithTran(addPyramidPolicyRobotRequest, tran);
+                pyramidPolicy.RobotId = AddRobotWithTran(addRobotRequest, tran);
                 fsql.Insert(pyramidPolicy).ExecuteAffrows();
             });
 
@@ -96,20 +110,30 @@ namespace Binance.TradeRobot.Business
         /// <summary>
         /// 添加动2.1策略机器人
         /// </summary>
-        /// <param name="addD21PolicyRobotRequest"></param>
-        public void AddD21PolicyRobot(AddD21PolicyRobotRequest addD21PolicyRobotRequest)
+        /// <param name="addRobotRequest"></param>
+        public void AddD21PolicyRobot(AddRobotRequest addRobotRequest)
         {
-            CheckRobotRegister(addD21PolicyRobotRequest, out _);
-            var d21Policy = addD21PolicyRobotRequest.Map<D21Policy>();
-            d21Policy.Id = idGenerator.NewLong();
+            CheckRobotRegister(addRobotRequest, out _);
+            var d21Policy = new D21Policy()
+            {
+                Id = idGenerator.NewLong(),
+                CreateTime = DateTime.Now,
+                ExecutionMode = Enums.ExecutionMode.Both,
+                IsEnabledIncreasePurchase = true,
+                IsEnableRemedyForErrorCrossSignal = true
+            };
             fsql.Transaction(() =>
             {
                 var tran = fsql.Ado.TransactionCurrentThread;
-                d21Policy.RobotId = AddRobotWithTran(addD21PolicyRobotRequest, tran);
+                d21Policy.RobotId = AddRobotWithTran(addRobotRequest, tran);
                 fsql.Insert(d21Policy).ExecuteAffrows();
             });
         }
 
+        /// <summary>
+        /// 获取动2.1策略机器人列表
+        /// </summary>
+        /// <returns></returns>
         public IList<D21PolicyRobotResponse> GetD21PolicyRobotList()
         {
             var robotList = fsql.Select<Robot, RobotAccount, D21Policy>().InnerJoin((r, ra, d) => r.Id == ra.RobotId)
@@ -140,7 +164,14 @@ namespace Binance.TradeRobot.Business
                                                                              D21PeriodicSignal = d.PeriodicSignal,
                                                                              D21PolicyId = d.Id,
                                                                              D21Position = d.Position,
-                                                                             D21StopLossRatio = d.StopLossRatio
+                                                                             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<IList<D21PolicyRobotResponse>>();
 
 
diff --git a/Binance.TradeRobot.Business/Business/SpotPolicyBusiness.cs b/Binance.TradeRobot.Business/Business/SpotPolicyBusiness.cs
new file mode 100644
index 0000000..0892cce
--- /dev/null
+++ b/Binance.TradeRobot.Business/Business/SpotPolicyBusiness.cs
@@ -0,0 +1,39 @@
+using Binance.TradeRobot.Common.DI;
+using Binance.TradeRobot.Common.Extensions;
+using Binance.TradeRobot.Model.Base;
+using Binance.TradeRobot.Model.Db;
+using Binance.TradeRobot.Model.Dto;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Yitter.IdGenerator;
+
+namespace Binance.TradeRobot.Business
+{
+    /// <summary>
+    /// 现货策略
+    /// </summary>
+    [BatchRegistration(ServiceLifetime.Singleton, RegistrationType.Self)]
+    public class SpotPolicyBusiness : BaseBusiness
+    {
+        public SpotPolicyBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache) : base(fsql, logManager, idGenerator, memoryCache)
+        {
+
+        }
+
+        public void EditD21Policy(EditD21PolicyRequest editD21PolicyRequest)
+        {
+            var d21policy = fsql.Select<D21Policy>(editD21PolicyRequest.Id).ToOne();
+            if (d21policy == null)
+                throw new BusinessException("d21策略不存在");
+            editD21PolicyRequest.Map(d21policy);
+            fsql.Update<D21Policy>().SetSource(d21policy).ExecuteAffrows();
+
+            /*取消历史委托订单*/
+
+            /*检查是否有持仓 如果有重新下委托单*/
+        }
+    }
+}
diff --git a/Binance.TradeRobot.Model/Base/MappingProfiles.cs b/Binance.TradeRobot.Model/Base/MappingProfiles.cs
index 9ac3a42..4a9ef0d 100644
--- a/Binance.TradeRobot.Model/Base/MappingProfiles.cs
+++ b/Binance.TradeRobot.Model/Base/MappingProfiles.cs
@@ -16,9 +16,6 @@ namespace Binance.TradeRobot.Model.Base
             CreateMap<ExchangeAPIKey, ExchangeAPIKeyResponse>();
             CreateMap<ExchangeAccount, ExchangeAccountResponse>();
 
-            CreateMap<AddPyramidPolicyRobotRequest, PyramidPolicy>();
-            CreateMap<AddD21PolicyRobotRequest, D21Policy>();
-
             CreateMap<Robot, RobotResponse>().ForPath(t => t.RobotAccount.Id, opt => opt.MapFrom(f => f.RobotAccountId))
                                              .ForPath(t => t.RobotAccount.RobotId, opt => opt.MapFrom(f => f.Id))
                                              .ForPath(t => t.RobotAccount.SoptCurrentcyAmount, opt => opt.MapFrom(f => f.SoptCurrentcyAmount))
@@ -35,9 +32,18 @@ namespace Binance.TradeRobot.Model.Base
                                                       .ForPath(t => t.D21Policy.IsEnableRemedyForErrorCrossSignal, opt => opt.MapFrom(f => f.D21IsEnableRemedyForErrorCrossSignal))
                                                       .ForPath(t => t.D21Policy.PeriodicSignal, opt => opt.MapFrom(f => f.D21PeriodicSignal))
                                                       .ForPath(t => t.D21Policy.MaxFollowPurchaseRatio, opt => opt.MapFrom(f => f.D21MaxFollowPurchaseRatio))
-                                                      .ForPath(t => t.D21Policy.StopLossRatio, opt => opt.MapFrom(f => f.D21StopLossRatio))
                                                       .ForPath(t => t.D21Policy.CreateTime, opt => opt.MapFrom(f => f.D21CreateTime))
-                                                      .ForPath(t => t.D21Policy.ExecutionMode, opt => opt.MapFrom(f => f.D21ExecutionMode));
+                                                      .ForPath(t => t.D21Policy.ExecutionMode, opt => opt.MapFrom(f => f.D21ExecutionMode))
+                                                      .ForPath(t => t.D21Policy.Assets, opt => opt.MapFrom(f => f.D21Assets))
+                                                      .ForPath(t => t.D21Policy.MaxExchangeLoanRatio, opt => opt.MapFrom(f => f.D21MaxExchangeLoanRatio))
+                                                      .ForPath(t => t.D21Policy.MaxSystemLoanRatio, opt => opt.MapFrom(f => f.D21MaxSystemLoanRatio))
+                                                      .ForPath(t => t.D21Policy.Level1PositionStopLossRatio, opt => opt.MapFrom(f => f.D21Level1PositionStopLossRatio))
+                                                      .ForPath(t => t.D21Policy.Level1PriceStopLossRatio, opt => opt.MapFrom(f => f.D21Level1PriceStopLossRatio))
+                                                      .ForPath(t => t.D21Policy.Level2PositionStopLossRatio, opt => opt.MapFrom(f => f.D21Level2PositionStopLossRatio))
+                                                      .ForPath(t => t.D21Policy.Level2PriceStopLossRatio, opt => opt.MapFrom(f => f.D21Level2PriceStopLossRatio));
+
+            CreateMap<EditD21PolicyRequest, D21Policy>();
+            CreateMap<EditPyramidPolicyRequest, PyramidPolicy>();
         }
     }
 }
diff --git a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
index cf27d2d..4dc3a8a 100644
--- a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
+++ b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
@@ -209,6 +209,16 @@
             最大追高比例
             </summary>
         </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.MaxSystemLoanRatio">
+            <summary>
+            最大系统借币比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.MaxExchangeLoanRatio">
+            <summary>
+            最大交易所借币比例
+            </summary>
+        </member>
         <member name="P:Binance.TradeRobot.Model.Db.D21Policy.PeriodicSignal">
             <summary>
             信号周期
@@ -219,9 +229,29 @@
             仓位
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.StopLossRatio">
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.Assets">
+            <summary>
+            配置资产
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.Level1PriceStopLossRatio">
+            <summary>
+            一级止损-成交价亏损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.Level1PositionStopLossRatio">
+            <summary>
+            一级止损-仓位止损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.Level2PriceStopLossRatio">
+            <summary>
+            二级止损-成交价亏损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.D21Policy.Level2PositionStopLossRatio">
             <summary>
-            止损比例
+            二级止损-仓位止损比例
             </summary>
         </member>
         <member name="P:Binance.TradeRobot.Model.Db.PyramidPolicy.Leverage">
@@ -294,6 +324,16 @@
             最大追高比例
             </summary>
         </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21MaxSystemLoanRatio">
+            <summary>
+            最大系统借币比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21MaxExchangeLoanRatio">
+            <summary>
+            最大交易所借币比例
+            </summary>
+        </member>
         <member name="P:Binance.TradeRobot.Model.Db.Robot.D21PeriodicSignal">
             <summary>
             信号周期
@@ -304,9 +344,29 @@
             仓位
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21StopLossRatio">
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21Assets">
+            <summary>
+            资产配置
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21Level1PriceStopLossRatio">
             <summary>
-            止损比例
+            一级止损-成交价亏损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21Level1PositionStopLossRatio">
+            <summary>
+            一级止损-仓位止损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21Level2PriceStopLossRatio">
+            <summary>
+            二级止损-成交价亏损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Db.Robot.D21Level2PositionStopLossRatio">
+            <summary>
+            二级止损-仓位止损比例
             </summary>
         </member>
         <member name="P:Binance.TradeRobot.Model.Db.RobotAccount.ClosePositionCount">
@@ -339,7 +399,7 @@
             总借币金额
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Db.RobotAccount.SpotCurrencyAcgPrice">
+        <member name="P:Binance.TradeRobot.Model.Db.RobotAccount.SpotCurrencyAvgPrice">
             <summary>
             现货持仓均价
             </summary>
@@ -414,64 +474,84 @@
             交易策略
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.IsEnabledIncreasePurchase">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditPyramidPolicyRequest.SignalPeriod">
             <summary>
-            是否开启增购
+            信号周期
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.IsEnableRemedyForErrorCrossSignal">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditPyramidPolicyRequest.Leverage">
             <summary>
-            是否开启错误信号补救
+            杠杆倍数
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.MaxFollowPurchaseRatio">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditPyramidPolicyRequest.Position">
             <summary>
-            最大追高比例
+            仓位
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.PeriodicSignal">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditPyramidPolicyRequest.Pyramid">
             <summary>
-            信号周期
+            金字塔
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.Position">
+        <member name="P:Binance.TradeRobot.Model.Dto.AddRobotRequest.Symbol">
             <summary>
-            仓位
+            交易对
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Dto.AddRobotRequest.ExchangeAPIKeyId">
+            <summary>
+            交易所APIKeyId
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddD21PolicyRobotRequest.StopLossRatio">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.MaxSystemLoanRatio">
             <summary>
-            止损比例
+            最大系统借币比例
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest.SignalPeriod">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.MaxExchangeLoanRatio">
+            <summary>
+            最大交易所借币比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.MaxFollowPurchaseRatio">
+            <summary>
+            最大追高比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.PeriodicSignal">
             <summary>
             信号周期
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest.Leverage">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Position">
             <summary>
-            杠杆倍数
+            仓位(USDT)
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest.Position">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Assets">
             <summary>
-            仓位
+            配置资产
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddPyramidPolicyRobotRequest.Pyramid">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Level1PriceStopLossRatio">
             <summary>
-            金字塔
+            一级止损-成交价亏损比例
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddRobotRequest.Symbol">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Level1PositionStopLossRatio">
             <summary>
-            交易对
+            一级止损-仓位止损比例
             </summary>
         </member>
-        <member name="P:Binance.TradeRobot.Model.Dto.AddRobotRequest.ExchangeAPIKeyId">
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Level2PriceStopLossRatio">
             <summary>
-            交易所APIKeyId
+            二级止损-成交价亏损比例
+            </summary>
+        </member>
+        <member name="P:Binance.TradeRobot.Model.Dto.EditD21PolicyRequest.Level2PositionStopLossRatio">
+            <summary>
+            二级止损-仓位止损比例
             </summary>
         </member>
         <member name="P:Binance.TradeRobot.Model.Dto.LoginRequest.Pwd">
diff --git a/Binance.TradeRobot.Model/Db/Policy/Spot/D21Policy.cs b/Binance.TradeRobot.Model/Db/Policy/Spot/D21Policy.cs
index 8e1f938..13b493b 100644
--- a/Binance.TradeRobot.Model/Db/Policy/Spot/D21Policy.cs
+++ b/Binance.TradeRobot.Model/Db/Policy/Spot/D21Policy.cs
@@ -39,6 +39,18 @@ namespace Binance.TradeRobot.Model.Db
         [Column(DbType = "decimal(18,2)")]
         public decimal MaxFollowPurchaseRatio { get; set; } = 0.0M;
 
+        /// <summary>
+        /// 最大系统借币比例
+        /// </summary>
+        [Column(DbType = "decimal(18,2)")]
+        public decimal MaxSystemLoanRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 最大交易所借币比例
+        /// </summary>
+        [Column(DbType = "decimal(18,2)")]
+        public decimal MaxExchangeLoanRatio { get; set; } = 0.00M;
+
         /// <summary>
         /// 信号周期
         /// </summary>
@@ -55,10 +67,34 @@ namespace Binance.TradeRobot.Model.Db
         public long RobotId { get; set; }
 
         /// <summary>
-        /// 止损比例
+        /// 配置资产
+        /// </summary>
+        [Column(DbType = "decimal(18,8)")]
+        public decimal Assets { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-成交价亏损比例
+        /// </summary>
+        [Column(DbType = "decimal(18,2)")]
+        public decimal Level1PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-仓位止损比例
+        /// </summary>
+        [Column(DbType = "decimal(18,2)")]
+        public decimal Level1PositionStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-成交价亏损比例
+        /// </summary>
+        [Column(DbType = "decimal(18,2)")]
+        public decimal Level2PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-仓位止损比例
         /// </summary>
         [Column(DbType = "decimal(18,2)")]
-        public decimal StopLossRatio { get; set; } = 0.0M;
+        public decimal Level2PositionStopLossRatio { get; set; } = 0.0M;
     }
 
 }
diff --git a/Binance.TradeRobot.Model/Db/Robot/Robot.cs b/Binance.TradeRobot.Model/Db/Robot/Robot.cs
index 31490e7..3fe9b6c 100644
--- a/Binance.TradeRobot.Model/Db/Robot/Robot.cs
+++ b/Binance.TradeRobot.Model/Db/Robot/Robot.cs
@@ -106,6 +106,18 @@ namespace Binance.TradeRobot.Model.Db
         [Column(IsIgnore = true)]
         public decimal D21MaxFollowPurchaseRatio { get; set; } = 0.0M;
 
+        /// <summary>
+        /// 最大系统借币比例
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21MaxSystemLoanRatio { get; set; } = 0.00M;
+
+        /// <summary>
+        /// 最大交易所借币比例
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21MaxExchangeLoanRatio { get; set; } = 0.00M;
+
         /// <summary>
         /// 信号周期
         /// </summary>
@@ -119,10 +131,34 @@ namespace Binance.TradeRobot.Model.Db
         public decimal D21Position { get; set; } = 0.0M;
 
         /// <summary>
-        /// 止损比例
+        /// 资产配置
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21Assets { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-成交价亏损比例
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21Level1PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-仓位止损比例
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21Level1PositionStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-成交价亏损比例
+        /// </summary>
+        [Column(IsIgnore = true)]
+        public decimal D21Level2PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-仓位止损比例
         /// </summary>
         [Column(IsIgnore = true)]
-        public decimal D21StopLossRatio { get; set; }
+        public decimal D21Level2PositionStopLossRatio { get; set; } = 0.0M;
 
         [Column(IsIgnore = true)]
         public DateTime D21CreateTime { get; set; }
diff --git a/Binance.TradeRobot.Model/Db/Robot/RobotAccount.cs b/Binance.TradeRobot.Model/Db/Robot/RobotAccount.cs
index 76d90a1..d1830d3 100644
--- a/Binance.TradeRobot.Model/Db/Robot/RobotAccount.cs
+++ b/Binance.TradeRobot.Model/Db/Robot/RobotAccount.cs
@@ -53,7 +53,7 @@ namespace Binance.TradeRobot.Model.Db
         /// 现货持仓均价
         /// </summary>
         [Column(IsIgnore = true)]
-        public decimal SpotCurrencyAcgPrice
+        public decimal SpotCurrencyAvgPrice
         {
             get
             {
diff --git a/Binance.TradeRobot.Model/Dto/Request/Robot/AddPyramidPolicyRobotRequest.cs b/Binance.TradeRobot.Model/Dto/Request/PrepPolicy/EditPyramidPolicyRequest.cs
similarity index 87%
rename from Binance.TradeRobot.Model/Dto/Request/Robot/AddPyramidPolicyRobotRequest.cs
rename to Binance.TradeRobot.Model/Dto/Request/PrepPolicy/EditPyramidPolicyRequest.cs
index ae46774..a1613a6 100644
--- a/Binance.TradeRobot.Model/Dto/Request/Robot/AddPyramidPolicyRobotRequest.cs
+++ b/Binance.TradeRobot.Model/Dto/Request/PrepPolicy/EditPyramidPolicyRequest.cs
@@ -2,8 +2,10 @@
 
 namespace Binance.TradeRobot.Model.Dto
 {
-    public class AddPyramidPolicyRobotRequest : AddRobotRequest
+    public class EditPyramidPolicyRequest
     {
+        public long Id { get; set; }
+
         /// <summary>
         /// 信号周期
         /// </summary>
diff --git a/Binance.TradeRobot.Model/Dto/Request/Robot/AddD21PolicyRobotRequest.cs b/Binance.TradeRobot.Model/Dto/Request/Robot/AddD21PolicyRobotRequest.cs
deleted file mode 100644
index d0f84e5..0000000
--- a/Binance.TradeRobot.Model/Dto/Request/Robot/AddD21PolicyRobotRequest.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using Binance.TradeRobot.Model.Base;
-
-namespace Binance.TradeRobot.Model.Dto
-{
-    public class AddD21PolicyRobotRequest : AddRobotRequest
-    {
-        public Enums.ExecutionMode ExecutionMode { get; set; } = Enums.ExecutionMode.Both;
-
-        /// <summary>
-        /// 是否开启增购
-        /// </summary>
-
-        public bool IsEnabledIncreasePurchase { get; set; } = true;
-
-        /// <summary>
-        /// 是否开启错误信号补救
-        /// </summary>
-
-        public bool IsEnableRemedyForErrorCrossSignal { get; set; } = true;
-
-        /// <summary>
-        /// 最大追高比例
-        /// </summary>
-        public decimal MaxFollowPurchaseRatio { get; set; } = 0.0M;
-
-        /// <summary>
-        /// 信号周期
-        /// </summary>
-        public Enums.SignalPeriod PeriodicSignal { get; set; }
-
-        /// <summary>
-        /// 仓位
-        /// </summary>
-        public decimal Position { get; set; } = 0.0M;
-
-        /// <summary>
-        /// 止损比例
-        /// </summary>
-        public decimal StopLossRatio { get; set; }
-    }
-}
diff --git a/Binance.TradeRobot.Model/Dto/Request/SpotPolicy/EditD21PolicyRequest.cs b/Binance.TradeRobot.Model/Dto/Request/SpotPolicy/EditD21PolicyRequest.cs
new file mode 100644
index 0000000..214630f
--- /dev/null
+++ b/Binance.TradeRobot.Model/Dto/Request/SpotPolicy/EditD21PolicyRequest.cs
@@ -0,0 +1,59 @@
+using Binance.TradeRobot.Model.Base;
+
+namespace Binance.TradeRobot.Model.Dto
+{
+    public class EditD21PolicyRequest
+    {
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 最大系统借币比例
+        /// </summary>
+        public decimal MaxSystemLoanRatio { get; set; } = 0.00M;
+
+        /// <summary>
+        /// 最大交易所借币比例
+        /// </summary>
+        public decimal MaxExchangeLoanRatio { get; set; } = 0.00M;
+
+        /// <summary>
+        /// 最大追高比例
+        /// </summary>
+        public decimal MaxFollowPurchaseRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 信号周期
+        /// </summary>
+        public Enums.SignalPeriod PeriodicSignal { get; set; }
+
+        /// <summary>
+        /// 仓位(USDT)
+        /// </summary>
+        public decimal Position { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 配置资产
+        /// </summary>
+        public decimal Assets { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-成交价亏损比例
+        /// </summary>
+        public decimal Level1PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 一级止损-仓位止损比例
+        /// </summary>
+        public decimal Level1PositionStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-成交价亏损比例
+        /// </summary>
+        public decimal Level2PriceStopLossRatio { get; set; } = 0.0M;
+
+        /// <summary>
+        /// 二级止损-仓位止损比例
+        /// </summary>
+        public decimal Level2PositionStopLossRatio { get; set; } = 0.0M;
+    }
+}