From 61888080ba23d77a78f74181c13f05df0a34b9c1 Mon Sep 17 00:00:00 2001 From: shanj <18996038927@163.com> Date: Sat, 21 May 2022 23:16:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AE=B0=E5=BD=95=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E8=B4=A6=E6=88=B7=E6=8C=81=E4=BB=93=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E5=92=8C=E4=BA=A4=E6=98=93=E6=89=80=E8=B4=A6=E6=88=B7?= =?UTF-8?q?=E6=8C=81=E4=BB=93=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Spot/D21OrderPublishBusiness.cs | 28 +++-- .../TradeBusiness/Spot/D21TradeBusiness.cs | 2 +- Binance.TradeRobot.Business/GlobalContext.cs | 2 + .../Binance.TradeRobot.Model.xml | 10 ++ .../Db/Order/SpotOrder.cs | 13 ++ SDKTestConsole/Program.cs | 113 ------------------ 6 files changed, 47 insertions(+), 121 deletions(-) diff --git a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs index 5643e59..9a458b0 100644 --- a/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs +++ b/Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs @@ -25,7 +25,6 @@ namespace Binance.TradeRobot.Business public void OnSpotOrderPublish(SpotOrderPublishInfo spotOrderPublishInfo) { - //var logger = logManager.GetLogger(spotOrderPublishInfo.LoggerName); var step = string.Empty; var logList = new List(); try @@ -38,6 +37,8 @@ namespace Binance.TradeRobot.Business if (robot == null) throw new BusinessException($"未找到机器人"); + var apiClient = GetBaseAPIClient(robot.ExchangeId, robot.ExchangeAPIKey.AccountId, robot.ExchangeAPIKey.APIKey, robot.ExchangeAPIKey.SecretKey); + IUpdate updateSpotOrder = fsql.Update(spotOrderPublishInfo.OrderId).Set(o => o.State, spotOrderPublishInfo.SpotOrderState); IUpdate updateRobotAccount = null; IList> updateUserList = null; @@ -62,7 +63,6 @@ namespace Binance.TradeRobot.Business if (spotOrderPublishInfo.SpotOrderState == Enums.SpotOrderState.Filled) { - var avgTradePrice = spotOrderPublishInfo.CummulativeTradeAmount / spotOrderPublishInfo.CummulativeTradeQuantity; //计算成交均价 logList.Add(new ExecutionLog() { @@ -85,9 +85,16 @@ namespace Binance.TradeRobot.Business if (spotOrderPublishInfo.TradeDirection == Enums.TradeDirection.Buy) { var quantity = spotOrderPublishInfo.CummulativeTradeQuantity - spotOrderPublishInfo.Fee; //扣除基础币手续费,得到真实购买数量 + + //更新机器人账户 updateRobotAccount = fsql.Update(robot.RobotAccount.Id).Set(ra => ra.SpotCurrencyQuantity + quantity) .Set(ra => ra.SpotCurrencyAmount + spotOrderPublishInfo.CummulativeTradeAmount); + //交易所账户真实持币数量 + var exchangAccountSpotCurrencyQuantity = apiClient.GetIsolatedMarginAccountAssets().FirstOrDefault(x => x.Symbol == spotOrderPublishInfo.Symbol).BaseFree; + updateSpotOrder = updateSpotOrder.Set(o => o.RobotAccountSpotCurrencyQuantity, robot.RobotAccount.SpotCurrencyQuantity + quantity) + .Set(o => o.ExchangeAccountSpotCurrencyQuantity, exchangAccountSpotCurrencyQuantity); + if (spotOrderPublishInfo.OrderType == Enums.OrderType.MARKET) { //市价买单完全成交,根据策略挂止损单 @@ -110,7 +117,6 @@ namespace Binance.TradeRobot.Business if (loanAmount > 0M) { //还币 - var apiClient = GetBaseAPIClient(robot.ExchangeId, robot.ExchangeAPIKey.AccountId, robot.ExchangeAPIKey.APIKey, robot.ExchangeAPIKey.SecretKey); interest = apiClient.IsolatedMarginRepay(robot.Symbol, loanAmount); logList[0].Content = $"{logList[0].Content},借币金额:{loanAmount},还币利息:{interest}"; } @@ -120,20 +126,25 @@ namespace Binance.TradeRobot.Business var profit = spotOrderPublishInfo.CummulativeTradeQuantity * (avgTradePrice - robot.RobotAccount.SpotCurrencyAvgPrice) - spotOrderPublishInfo.Fee - interest; //计算利润 - updateSpotOrder = updateSpotOrder.SetIf(interest > 0M, o => o.LoanInterest, interest) - .Set(o => o.Profit, profit) - .Set(o => o.HistoryTotalProfit, robot.RobotAccount.TotalProfit + profit); - updateRobotAccount = fsql.Update(robot.RobotAccount.Id).Set(ra => ra.SpotCurrencyQuantity - spotOrderPublishInfo.CummulativeTradeQuantity) .Set(ra => ra.SpotCurrencyAmount - buyAmount) .Set(ra => ra.TotalProfit + profit) .Set(ra => ra.ClosePositionCount + 1) .SetIf(profit > 0M, ra => ra.WinCount + 1) .SetIf(interest > 0M, ra => ra.LoanAmount - loanAmount); + //交易所账户真实持币数量 + var exchangAccountSpotCurrencyQuantity = apiClient.GetIsolatedMarginAccountAssets().FirstOrDefault(x => x.Symbol == spotOrderPublishInfo.Symbol).BaseFree; + + updateSpotOrder = updateSpotOrder.SetIf(interest > 0M, o => o.LoanInterest, interest) + .Set(o => o.Profit, profit) + .Set(o => o.HistoryTotalProfit, robot.RobotAccount.TotalProfit + profit) + .Set(o => o.RobotAccountSpotCurrencyQuantity, robot.RobotAccount.SpotCurrencyQuantity - spotOrderPublishInfo.CummulativeTradeQuantity) + .Set(o => o.ExchangeAccountSpotCurrencyQuantity, exchangAccountSpotCurrencyQuantity); if (profit > 0) //盈利复投 updateD21Policy = fsql.Update(robot.D21Policy.Id).Set(p => p.Position + profit); + var capitalChangeType = profit > 0M ? Enums.CapitalChangeType.Add : Enums.CapitalChangeType.Reduce; var userList = userBusiness.GetUserList(multiplyBy100: false); foreach (var user in userList) @@ -162,6 +173,9 @@ namespace Binance.TradeRobot.Business }); } } + + + } fsql.Transaction(() => diff --git a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs index d851a28..120c95c 100644 --- a/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs +++ b/Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs @@ -243,7 +243,7 @@ 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(); + fsql.Update(robot.RobotAccount.Id).Set(ra => ra.LoanAmount, accountLoanAmount).ExecuteAffrows(); if (previewTradeAmount != d21Robot.D21Policy.Position) //借币失败 仓位减少 fsql.Update(d21Robot.D21Policy.Id).Set(d => d.Position, previewTradeAmount).ExecuteAffrows(); }); diff --git a/Binance.TradeRobot.Business/GlobalContext.cs b/Binance.TradeRobot.Business/GlobalContext.cs index bcece0a..ca3ce58 100644 --- a/Binance.TradeRobot.Business/GlobalContext.cs +++ b/Binance.TradeRobot.Business/GlobalContext.cs @@ -7,6 +7,7 @@ using SDKAdapter.WebSockets.Order.Spot; using System; using System.Collections.Generic; using System.Linq; +using System.Threading; namespace Binance.TradeRobot.Business { @@ -100,6 +101,7 @@ namespace Binance.TradeRobot.Business public void OnSpotOrderPublish(SpotOrderPublishInfo spotOrderPublishInfo) { var orderPublishBusiness = spotOrderPublishBusinessList.FirstOrDefault(p => p.TradePolicy == spotOrderPublishInfo.TradePolicy); + Thread.Sleep(1000); orderPublishBusiness.OnSpotOrderPublish(spotOrderPublishInfo); } } diff --git a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml index b87ee4a..9330602 100644 --- a/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml +++ b/Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml @@ -264,6 +264,16 @@ 借币利息 + + + 机器人账户持仓数 + + + + + 交易所账户持仓数 + + 执行模式 diff --git a/Binance.TradeRobot.Model/Db/Order/SpotOrder.cs b/Binance.TradeRobot.Model/Db/Order/SpotOrder.cs index 5bc66b5..c6e1ea5 100644 --- a/Binance.TradeRobot.Model/Db/Order/SpotOrder.cs +++ b/Binance.TradeRobot.Model/Db/Order/SpotOrder.cs @@ -109,6 +109,19 @@ namespace Binance.TradeRobot.Model.Db /// [Column(DbType = "decimal(18,8)")] public decimal LoanInterest { get; set; } = 0.0M; + + + /// + /// 机器人账户持仓数 + /// + [Column(DbType = "decimal(18,8)")] + public decimal RobotAccountSpotCurrencyQuantity { get; set; } = 0.0M; + + /// + /// 交易所账户持仓数 + /// + [Column(DbType = "decimal(18,8)")] + public decimal ExchangeAccountSpotCurrencyQuantity { get; set; } = 0.0M; } } diff --git a/SDKTestConsole/Program.cs b/SDKTestConsole/Program.cs index 774b9a4..68550e3 100644 --- a/SDKTestConsole/Program.cs +++ b/SDKTestConsole/Program.cs @@ -22,20 +22,6 @@ namespace SDKTestConsole var marginList = client.GetIsolatedMarginAccountAssets(); var s = JsonConvert.SerializeObject(marginList); - //查询最大借币额度 - var maxLoan = client.QueryMaxLoanAmount("GMTUSDT"); - //Console.WriteLine(maxLoan); - - //借币 - //var r1 = client.IsolatedMarginLoan("ETHUSDT", 10M); - //var r2 = client.IsolatedMarginLoan("ETHUSDT", 10M); - //Console.WriteLine(r2.AccountLoanAmount); - - //还币 - //var r3 = client.IsolatedMarginRepay("ETHUSDT", 20M); - //Console.WriteLine(r3); - - var spotClientOption = new BinanceApiClientOptions() { BaseAddress = "https://api.binance.com", @@ -54,106 +40,7 @@ namespace SDKTestConsole var binanceSocketClient = new BinanceSocketClient(); - //市价买币 - //var r = client.IsolatedMarginPlaceOrder("ETHUSDT", - // Enums.TradeDirection.Buy, - // Enums.OrderType.MARKET, - // quoteAmount: 20M); - - //var r = binanceClient.SpotApi.Trading.PlaceMarginOrderAsync("ETHUSDT", - // Binance.Net.Enums.OrderSide.Buy, - // Binance.Net.Enums.SpotOrderType.Market, - // quoteQuantity: 30M, //报价币金额 - // //quantity: 100M, - // //timeInForce: Binance.Net.Enums.TimeInForce.GoodTillCanceled, - // //stopPrice: 1899M, - // isIsolated: true, - // orderResponseType: Binance.Net.Enums.OrderResponseType.Full).Result; - // - - //市价卖币 - //var qty = 0.00985570M.CutDecimal(4); - //var r = client.IsolatedMarginPlaceOrder("ETHUSDT", - // Enums.TradeDirection.Sell, - // Enums.OrderType.MARKET, - // quantity: qty); - - //var r = binanceClient.SpotApi.Trading.PlaceMarginOrderAsync("ETHUSDT", - // Binance.Net.Enums.OrderSide.Sell, - // Binance.Net.Enums.SpotOrderType.Market, - // quantity: 0.0098M, - // //quoteQuantity: 20M, //报价币金额 - // //quantity: 100M, - // //timeInForce: Binance.Net.Enums.TimeInForce.GoodTillCanceled, - // //stopPrice: 1899M, - // isIsolated: true, - // orderResponseType: Binance.Net.Enums.OrderResponseType.Full).Result; - - - - //止损卖币 - //var qty = 0.01224350M.CutDecimal(4); - //var r = client.IsolatedMarginPlaceOrder("ETHUSDT", - // Enums.TradeDirection.Sell, - // Enums.OrderType.STOP_LOSS_LIMIT, - // quantity: qty, - // price: 2033M, - // stopPrice: 2035M); - - - - //var r = binanceClient.SpotApi.Trading.PlaceMarginOrderAsync("ETHUSDT", - // Binance.Net.Enums.OrderSide.Sell, - // Binance.Net.Enums.SpotOrderType.StopLossLimit, - // quantity: 0.0149M, - // price: 1699M, - // //quoteQuantity: 20M, //报价币金额 - // //quantity: 100M, - // timeInForce: Binance.Net.Enums.TimeInForce.GoodTillCanceled, - // stopPrice: 1699M, - // isIsolated: true, - // orderResponseType: Binance.Net.Enums.OrderResponseType.Full).Result; - // - //var s = JsonConvert.SerializeObject(r); - //Console.WriteLine(s); - // - //var r1 = binanceClient.SpotApi.Trading.PlaceMarginOrderAsync("ETHUSDT", - // Binance.Net.Enums.OrderSide.Sell, - // Binance.Net.Enums.SpotOrderType.StopLossLimit, - // quantity: 0.0149M, - // price: 1699M, - // //quoteQuantity: 20M, //报价币金额 - // //quantity: 100M, - // timeInForce: Binance.Net.Enums.TimeInForce.GoodTillCanceled, - // stopPrice: 1699M, - // isIsolated: true, - // orderResponseType: Binance.Net.Enums.OrderResponseType.Full).Result; - //var s1 = JsonConvert.SerializeObject(r1); - //var s = JsonConvert.SerializeObject(r); - //Console.WriteLine(s); - //var orderClient = new BinanceSpotOrderWebSocketClient(Enums.BusinessType.IsolateMargin, 0, apiKey, secret, LogManager.GetCurrentClassLogger()); - //orderClient.Start("ETHUSDT"); - - //timer = new System.Threading.Timer(new System.Threading.TimerCallback(Callback), null, -1, 5000); - //while (true) - //{ - // var input = Console.ReadLine(); - // if (input == "start") - // timer.Change(3000, 5000); - // else if (input == "stop") - // timer.Change(-1, 5000); - // else if (input == "close") - // { - // timer.Dispose(); - // break; - // } - //} Console.ReadKey(); } - - private static void Callback(object? o) - { - Console.WriteLine($"Callback on {DateTime.Now}"); - } } }