shanji 3 years ago
parent
commit
ae882c9a2e
  1. 12
      Binance.TradeRobot.API/Binance.TradeRobot.API.xml
  2. 20
      Binance.TradeRobot.API/Controllers/OrderController.cs
  3. 29
      Binance.TradeRobot.Business/Business/OrderBusiness.cs
  4. 51
      Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs
  5. 16
      Binance.TradeRobot.Business/Business/TradeBusiness/BaseTradeBusiness.cs
  6. 8
      Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs
  7. 5
      Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
  8. 7
      Binance.TradeRobot.Model/Db/Order/SpotOrder.cs
  9. 11
      Binance.TradeRobot.Model/Dto/Request/Order/QueryLogRequest.cs
  10. 11
      Binance.TradeRobot.Model/Dto/Request/Order/QueryOrderRequest.cs
  11. 13
      Binance.TradeRobot.Model/Dto/Response/Order/ExecutionLogPageResponse.cs
  12. 13
      Binance.TradeRobot.Model/Dto/Response/Order/SpotOrderPageResponse.cs
  13. 3
      SDKAdapter/APIClient/BaseAPIClient.cs
  14. 4
      SDKAdapter/APIClient/BinanceAPIClient.cs
  15. 39
      SDKTestConsole/Program.cs

12
Binance.TradeRobot.API/Binance.TradeRobot.API.xml

@ -48,18 +48,18 @@
<param name="exchangeId"></param> <param name="exchangeId"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Binance.TradeRobot.API.Controllers.OrderController.GetSpotOrderList(System.Int64)"> <member name="M:Binance.TradeRobot.API.Controllers.OrderController.GetSpotOrderList(Binance.TradeRobot.Model.Dto.QueryOrderRequest)">
<summary> <summary>
获取现货/逐仓杠杆订单记录(最近20条) 获取现货/逐仓杠杆订单记录
</summary> </summary>
<param name="robotId"></param> <param name="queryOrderRequest"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Binance.TradeRobot.API.Controllers.OrderController.GetExecutionLogList(System.Int64)"> <member name="M:Binance.TradeRobot.API.Controllers.OrderController.GetExecutionLogList(Binance.TradeRobot.Model.Dto.QueryLogRequest)">
<summary> <summary>
获取执行日志记录(最近50条) 获取执行日志记录
</summary> </summary>
<param name="robotId"></param> <param name="queryLogRequest"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Binance.TradeRobot.API.Controllers.RobotController.StartRobot(System.Int64)"> <member name="M:Binance.TradeRobot.API.Controllers.RobotController.StartRobot(System.Int64)">

20
Binance.TradeRobot.API/Controllers/OrderController.cs

@ -17,25 +17,25 @@ namespace Binance.TradeRobot.API.Controllers
} }
/// <summary> /// <summary>
/// 获取现货/逐仓杠杆订单记录(最近20条) /// 获取现货/逐仓杠杆订单记录
/// </summary> /// </summary>
/// <param name="robotId"></param> /// <param name="queryOrderRequest"></param>
/// <returns></returns> /// <returns></returns>
[HttpGet("{robotId}")] [HttpPost]
public IList<SpotOrderResponse> GetSpotOrderList([FromRoute] long robotId) public SpotOrderPageResponse GetSpotOrderList([FromBody] QueryOrderRequest queryOrderRequest)
{ {
return orderBusiness.GetSpotOrderList(robotId); return orderBusiness.GetSpotOrderList(queryOrderRequest);
} }
/// <summary> /// <summary>
/// 获取执行日志记录(最近50条) /// 获取执行日志记录
/// </summary> /// </summary>
/// <param name="robotId"></param> /// <param name="queryLogRequest"></param>
/// <returns></returns> /// <returns></returns>
[HttpGet("{robotId}")] [HttpPost]
public IList<ExecutionLogResponse> GetExecutionLogList([FromRoute] long robotId) public ExecutionLogPageResponse GetExecutionLogList([FromBody] QueryLogRequest queryLogRequest)
{ {
return orderBusiness.GetExecutionLogList(robotId); return orderBusiness.GetExecutionLogList(queryLogRequest);
} }
} }
} }

29
Binance.TradeRobot.Business/Business/OrderBusiness.cs

@ -3,7 +3,6 @@ using Binance.TradeRobot.Model.Db;
using Binance.TradeRobot.Model.Dto; using Binance.TradeRobot.Model.Dto;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace Binance.TradeRobot.Business namespace Binance.TradeRobot.Business
@ -16,14 +15,34 @@ namespace Binance.TradeRobot.Business
} }
public IList<SpotOrderResponse> GetSpotOrderList(long robotId) public SpotOrderPageResponse GetSpotOrderList(QueryOrderRequest queryOrderRequest)
{ {
return fsql.Select<SpotOrder>().Where(o => o.RobotId == robotId).OrderByDescending(o => o.CreateTime).Page(1, 20).ToList<SpotOrderResponse>(); if (queryOrderRequest.PageSize > 100)
queryOrderRequest.PageSize = 100;
return new SpotOrderPageResponse()
{
Items = fsql.Select<SpotOrder>().Where(o => o.RobotId == queryOrderRequest.RobotId)
.OrderByDescending(o => o.CreateTime)
.Page(queryOrderRequest.PageIndex, queryOrderRequest.PageSize)
.Count(out long totalCount)
.ToList<SpotOrderResponse>(),
TotalCount = totalCount
};
} }
public IList<ExecutionLogResponse> GetExecutionLogList(long robotId) public ExecutionLogPageResponse GetExecutionLogList(QueryLogRequest queryLogRequest)
{ {
return fsql.Select<ExecutionLog>().Where(l => l.RobotId == robotId).OrderByDescending(l => l.CreateTime).Page(1, 50).ToList<ExecutionLogResponse>(); if (queryLogRequest.PageSize > 100)
queryLogRequest.PageSize = 100;
return new ExecutionLogPageResponse()
{
Items = fsql.Select<ExecutionLog>().Where(l => l.RobotId == queryLogRequest.RobotId)
.OrderByDescending(l => l.CreateTime)
.Page(queryLogRequest.PageIndex, queryLogRequest.PageSize)
.Count(out long totalCount)
.ToList<ExecutionLogResponse>(),
TotalCount = totalCount
};
} }
} }
} }

51
Binance.TradeRobot.Business/Business/OrderPublishBusiness/Spot/D21OrderPublishBusiness.cs

@ -134,25 +134,25 @@ namespace Binance.TradeRobot.Business
updateUserList = new List<IUpdate<User>>(); updateUserList = new List<IUpdate<User>>();
insertUserAccountProfitLossRecordList = new List<UserAccountProfitLossRecord>(); insertUserAccountProfitLossRecordList = new List<UserAccountProfitLossRecord>();
if (spotOrderPublishInfo.OrderType == Enums.OrderType.MARKET) //if (spotOrderPublishInfo.OrderType == Enums.OrderType.MARKET)
{ //{
//市价卖单完全成交,取消尚未触发的限价止损单 //市价卖单完全成交,取消尚未触发的限价止损单
try //try
{ //{
CancelStopLossOrder(robot, apiClient); // CancelStopLossOrder(robot, apiClient);
} //}
catch (Exception ex) //catch (Exception ex)
{ //{
logList.Add(new ExecutionLog() // logList.Add(new ExecutionLog()
{ // {
Id = idGenerator.NewLong(), // Id = idGenerator.NewLong(),
SourceSingal = Enums.SingalType., // SourceSingal = Enums.SingalType.订单推送,
RobotId = robot.Id, // RobotId = robot.Id,
CreateTime = DateTime.Now, // CreateTime = DateTime.Now,
Content = $"取消止损单失败,{ex.Message}" // Content = $"取消止损单失败,{ex.Message}"
}); // });
} //}
} //}
var interest = 0M; //借币利息 var interest = 0M; //借币利息
var loanAmount = robot.RobotAccount.LoanAmount; //借币金额 var loanAmount = robot.RobotAccount.LoanAmount; //借币金额
@ -275,6 +275,7 @@ namespace Binance.TradeRobot.Business
var stopLossOrder = new SpotOrder() var stopLossOrder = new SpotOrder()
{ {
Id = stopOrderId, Id = stopOrderId,
ClientOrderId = stopLossClientOrderId,
CreateTime = DateTime.Now, CreateTime = DateTime.Now,
ExchangeId = d21Robot.ExchangeId, ExchangeId = d21Robot.ExchangeId,
LoanAmount = 0M, LoanAmount = 0M,
@ -297,17 +298,5 @@ namespace Binance.TradeRobot.Business
Content = $"{(isFirstStopLoss ? 1 : 2)}级止损挂单成功,订单号:{stopOrderId},挂单数量:{stopQuantity}" Content = $"{(isFirstStopLoss ? 1 : 2)}级止损挂单成功,订单号:{stopOrderId},挂单数量:{stopQuantity}"
}); });
} }
private void CancelStopLossOrder(D21PolicyRobotResponse d21Robot, BaseAPIClient baseAPIClient)
{
var stopLossOrderIdList = fsql.Select<SpotOrder>().Where(o => o.OrderType == Enums.OrderType.STOP_LOSS_LIMIT &&
o.State == Enums.SpotOrderState.Created &&
o.RobotId == d21Robot.Id).ToList(o => o.Id);
if (stopLossOrderIdList == null || stopLossOrderIdList.Count() == 0)
return;
foreach (var stopLossOrderId in stopLossOrderIdList)
baseAPIClient.CancelIsolateMarginOrder(d21Robot.Symbol, stopLossOrderId);
}
} }
} }

16
Binance.TradeRobot.Business/Business/TradeBusiness/BaseTradeBusiness.cs

@ -2,8 +2,10 @@
using Binance.TradeRobot.Model.Db; using Binance.TradeRobot.Model.Db;
using Binance.TradeRobot.Model.Dto; using Binance.TradeRobot.Model.Dto;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using SDKAdapter.APIClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using Yitter.IdGenerator; using Yitter.IdGenerator;
@ -53,5 +55,19 @@ namespace Binance.TradeRobot.Business
var random = new Random(guid.GetHashCode()); var random = new Random(guid.GetHashCode());
return $"{Convert.ToChar(random.Next(97, 123))}{guid.ToString().Substring(0, 4)}_{robotId}_{(int)tradePolicy}"; return $"{Convert.ToChar(random.Next(97, 123))}{guid.ToString().Substring(0, 4)}_{robotId}_{(int)tradePolicy}";
} }
protected void CancelStopLossOrder(RobotResponse d21Robot, BaseAPIClient baseAPIClient = null)
{
if (baseAPIClient == null)
baseAPIClient = GetBaseAPIClient(d21Robot.ExchangeId, d21Robot.ExchangeAPIKey.AccountId, d21Robot.ExchangeAPIKey.APIKey, d21Robot.ExchangeAPIKey.SecretKey);
var stopLossOrderList = fsql.Select<SpotOrder>().Where(o => o.OrderType == Enums.OrderType.STOP_LOSS_LIMIT &&
o.State == Enums.SpotOrderState.Created &&
o.RobotId == d21Robot.Id).ToList(o => new { o.Id, o.ClientOrderId });
if (stopLossOrderList == null || stopLossOrderList.Count() == 0)
return;
foreach (var stopLossOrder in stopLossOrderList)
baseAPIClient.CancelIsolateMarginOrder(d21Robot.Symbol, stopLossOrder.Id, stopLossOrder.ClientOrderId);
}
} }
} }

8
Binance.TradeRobot.Business/Business/TradeBusiness/Spot/D21TradeBusiness.cs

@ -218,6 +218,7 @@ namespace Binance.TradeRobot.Business
var buyOrder = new SpotOrder() var buyOrder = new SpotOrder()
{ {
Id = orderId, Id = orderId,
ClientOrderId = clientOrderId,
CreateTime = DateTime.Now, CreateTime = DateTime.Now,
ExchangeId = robot.ExchangeId, ExchangeId = robot.ExchangeId,
LoanAmount = diffAmount, LoanAmount = diffAmount,
@ -304,8 +305,14 @@ namespace Binance.TradeRobot.Business
} }
#endregion #endregion
#region 取消止损限价单
step = "取消止损限价单";
CancelStopLossOrder(robot);
#endregion
#region 验证卖币数量 #region 验证卖币数量
step = "验证卖币数量"; step = "验证卖币数量";
Thread.Sleep(1000);
var saleQuantity = robot.RobotAccount.SpotCurrencyQuantity.CutDecimal(symbolInfo.SaleQuantityAccuracy); var saleQuantity = robot.RobotAccount.SpotCurrencyQuantity.CutDecimal(symbolInfo.SaleQuantityAccuracy);
if (saleQuantity == 0M) if (saleQuantity == 0M)
throw new BusinessException("没有足够的卖币数量"); throw new BusinessException("没有足够的卖币数量");
@ -326,6 +333,7 @@ namespace Binance.TradeRobot.Business
var sellOrder = new SpotOrder() var sellOrder = new SpotOrder()
{ {
Id = orderId, Id = orderId,
ClientOrderId = clientOrderId,
CreateTime = DateTime.Now, CreateTime = DateTime.Now,
ExchangeId = robot.ExchangeId, ExchangeId = robot.ExchangeId,
OrderType = Enums.OrderType.MARKET, OrderType = Enums.OrderType.MARKET,

5
Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml

@ -199,6 +199,11 @@
借币利息 借币利息
</summary> </summary>
</member> </member>
<member name="P:Binance.TradeRobot.Model.Db.SpotOrder.ClientOrderId">
<summary>
客户端订单号
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Db.SpotOrder.ExchangeId"> <member name="P:Binance.TradeRobot.Model.Db.SpotOrder.ExchangeId">
<summary> <summary>
交易所Id 交易所Id

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

@ -12,6 +12,13 @@ namespace Binance.TradeRobot.Model.Db
[Column(DbType = "bigint", IsPrimary = true)] [Column(DbType = "bigint", IsPrimary = true)]
public long Id { get; set; } public long Id { get; set; }
/// <summary>
/// 客户端订单号
/// </summary>
[Column(StringLength = 50)]
public string ClientOrderId { get; set; }
[Column(DbType = "datetime")] [Column(DbType = "datetime")]
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }

11
Binance.TradeRobot.Model/Dto/Request/Order/QueryLogRequest.cs

@ -0,0 +1,11 @@
namespace Binance.TradeRobot.Model.Dto
{
public class QueryLogRequest
{
public long RobotId { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
}
}

11
Binance.TradeRobot.Model/Dto/Request/Order/QueryOrderRequest.cs

@ -0,0 +1,11 @@
namespace Binance.TradeRobot.Model.Dto
{
public class QueryOrderRequest
{
public long RobotId { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
}
}

13
Binance.TradeRobot.Model/Dto/Response/Order/ExecutionLogPageResponse.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Binance.TradeRobot.Model.Dto
{
public class ExecutionLogPageResponse
{
public long TotalCount { get; set; }
public IList<ExecutionLogResponse> Items { get; set; }
}
}

13
Binance.TradeRobot.Model/Dto/Response/Order/SpotOrderPageResponse.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Binance.TradeRobot.Model.Dto
{
public class SpotOrderPageResponse
{
public long TotalCount { get; set; }
public IList<SpotOrderResponse> Items { get; set; }
}
}

3
SDKAdapter/APIClient/BaseAPIClient.cs

@ -98,8 +98,9 @@ namespace SDKAdapter.APIClient
/// </summary> /// </summary>
/// <param name="symbol"></param> /// <param name="symbol"></param>
/// <param name="orderId"></param> /// <param name="orderId"></param>
/// <param name="clientOrderId"></param>
/// <exception cref="NotImplementedException"></exception> /// <exception cref="NotImplementedException"></exception>
public virtual void CancelIsolateMarginOrder(string symbol, long orderId) public virtual void CancelIsolateMarginOrder(string symbol, long orderId, string clientOrderId)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

4
SDKAdapter/APIClient/BinanceAPIClient.cs

@ -135,9 +135,9 @@ namespace SDKAdapter.APIClient
return r.Data.Id; return r.Data.Id;
} }
public override void CancelIsolateMarginOrder(string symbol, long orderId) public override void CancelIsolateMarginOrder(string symbol, long orderId, string clientOrderId)
{ {
_ = binanceClient.SpotApi.Trading.CancelMarginOrderAsync(symbol, orderId, isIsolated: true); _ = binanceClient.SpotApi.Trading.CancelMarginOrderAsync(symbol, orderId, isIsolated: true, newClientOrderId: clientOrderId).Result;
} }
} }
} }

39
SDKTestConsole/Program.cs

@ -4,7 +4,9 @@ using Binance.TradeRobot.Model.Base;
using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Authentication;
using Newtonsoft.Json; using Newtonsoft.Json;
using SDKAdapter.APIClient; using SDKAdapter.APIClient;
using SDKAdapter.WebSockets.Order.Spot;
using System; using System;
using System.Threading.Tasks;
namespace SDKTestConsole namespace SDKTestConsole
{ {
@ -12,15 +14,44 @@ namespace SDKTestConsole
{ {
private static System.Threading.Timer timer; private static System.Threading.Timer timer;
private static SpotOrderWebSocketClient orderWebSocketClient;
static void Main(string[] args) static void Main(string[] args)
{ {
var apiKey = "RsQ5RuhYbNRXCTGAQXhwb5Dt3jgPnwKXfR1OXz0qWmf3IsAC7zPQd14WGIr18rDA"; var apiKey = "pXKdUPbGN4DNar2f2HRoL2qxHoCWcLNf9V5uHTL2lBVCxz66eE8PMPwBw9h8RbKf";
var secret = "yxW4PPb65rVpdo7fMt2mZcbNOtjOe3J4fMSRVtX5YJfj7kRzHW3dY6xfoW4jje1I"; var secret = "c14tJd7kpMnePKRDoo4nzZk4bIn9bDO8ZCYo69amB4uspLgO5s4GlzYvTwD2zYav";
var client = BaseAPIClient.Create(Enums.Exchange.Binance, 0, apiKey, secret); var client = BaseAPIClient.Create(Enums.Exchange.Binance, 0, apiKey, secret);
//逐仓杠杆账户资产 //逐仓杠杆账户资产
var marginList = client.GetIsolatedMarginAccountAssets(); //var marginList = client.GetIsolatedMarginAccountAssets();
var s = JsonConvert.SerializeObject(marginList); //var s = JsonConvert.SerializeObject(marginList);
//var spotClientOption = new BinanceApiClientOptions()
//{
// BaseAddress = "https://api.binance.com",
// ApiCredentials = new ApiCredentials(apiKey, secret)
//};
//var usdFuturesClientOption = new BinanceApiClientOptions()
//{
// BaseAddress = "https://fapi.binance.com",
// ApiCredentials = new ApiCredentials(apiKey, secret)
//};
//var binanceClient = new BinanceClient(new BinanceClientOptions()
//{
// UsdFuturesApiOptions = usdFuturesClientOption,
// SpotApiOptions = spotClientOption
//});
var binanceSocketClient = new BinanceSocketClient();
//var newClientOrderId = "abcd_286129845448773_1";
//var orderId = client.IsolatedMarginPlaceOrder("ETHUSDT", Enums.TradeDirection.Buy, Enums.OrderType.MARKET, quoteAmount: 20M, newClientOrderId: newClientOrderId);
var logger = NLog.LogManager.GetLogger("test");
var stopLossClientOrderId = "stoploss2_286129845448773_1";
long stopLossOrderId = 0;
var spotClientOption = new BinanceApiClientOptions() var spotClientOption = new BinanceApiClientOptions()
{ {

Loading…
Cancel
Save