Browse Source

订单记录机器人账户持仓数量和交易所账户持仓数量

master
shanji 3 years ago
parent
commit
61888080ba
  1. 28
      Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs
  2. 2
      Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs
  3. 2
      Binance.TradeRobot.Business/GlobalContext.cs
  4. 10
      Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
  5. 13
      Binance.TradeRobot.Model/Db/Order/SpotOrder.cs
  6. 113
      SDKTestConsole/Program.cs

28
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<ExecutionLog>();
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<SpotOrder> updateSpotOrder = fsql.Update<SpotOrder>(spotOrderPublishInfo.OrderId).Set(o => o.State, spotOrderPublishInfo.SpotOrderState);
IUpdate<RobotAccount> updateRobotAccount = null;
IList<IUpdate<User>> 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<RobotAccount>(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<RobotAccount>(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<D21Policy>(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(() =>

2
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<RobotAccount>(robot.RobotAccount.Id).Set(ra => ra.LoanAmount + diffAmount).ExecuteAffrows();
fsql.Update<RobotAccount>(robot.RobotAccount.Id).Set(ra => ra.LoanAmount, accountLoanAmount).ExecuteAffrows();
if (previewTradeAmount != d21Robot.D21Policy.Position) //借币失败 仓位减少
fsql.Update<D21Policy>(d21Robot.D21Policy.Id).Set(d => d.Position, previewTradeAmount).ExecuteAffrows();
});

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

10
Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml

@ -264,6 +264,16 @@
借币利息
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Db.SpotOrder.RobotAccountSpotCurrencyQuantity">
<summary>
机器人账户持仓数
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Db.SpotOrder.ExchangeAccountSpotCurrencyQuantity">
<summary>
交易所账户持仓数
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Db.D21Policy.ExecutionMode">
<summary>
执行模式

13
Binance.TradeRobot.Model/Db/Order/SpotOrder.cs

@ -109,6 +109,19 @@ namespace Binance.TradeRobot.Model.Db
/// </summary>
[Column(DbType = "decimal(18,8)")]
public decimal LoanInterest { get; set; } = 0.0M;
/// <summary>
/// 机器人账户持仓数
/// </summary>
[Column(DbType = "decimal(18,8)")]
public decimal RobotAccountSpotCurrencyQuantity { get; set; } = 0.0M;
/// <summary>
/// 交易所账户持仓数
/// </summary>
[Column(DbType = "decimal(18,8)")]
public decimal ExchangeAccountSpotCurrencyQuantity { get; set; } = 0.0M;
}
}

113
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}");
}
}
}

Loading…
Cancel
Save