Browse Source

d21补救检查 刷新机器人运行时长

master
shanji 3 years ago
parent
commit
1eb5d69998
  1. 18
      Binance.TradeRobot.API/Controllers/RobotController.cs
  2. 77
      Binance.TradeRobot.Business/Business/RobotBusiness.cs
  3. 8
      Binance.TradeRobot.Business/Business/SingalBusiness.cs
  4. 5
      Binance.TradeRobot.Model/Dto/Response/Robot/RobotResponse.cs

18
Binance.TradeRobot.API/Controllers/RobotController.cs

@ -37,6 +37,15 @@ namespace Binance.TradeRobot.API.Controllers
robotBusiness.StopRobot(robotId);
}
/// <summary>
/// 刷新机器人运行时长
/// </summary>
[HttpPost]
public void RefreshRobotRuningTime()
{
robotBusiness.RefreshRobotRuningTime();
}
/// <summary>
/// 创建金字塔策略机器人
/// </summary>
@ -66,5 +75,14 @@ namespace Binance.TradeRobot.API.Controllers
{
return robotBusiness.GetD21PolicyRobotList();
}
/// <summary>
/// D21补救检查
/// </summary>
[HttpPost]
public void D21Remedy()
{
robotBusiness.D21Remedy();
}
}
}

77
Binance.TradeRobot.Business/Business/RobotBusiness.cs

@ -4,12 +4,15 @@ using Binance.TradeRobot.Common.Extensions;
using Binance.TradeRobot.Model.Base;
using Binance.TradeRobot.Model.Db;
using Binance.TradeRobot.Model.Dto;
using Binance.TradeRobot.Model.RuningInfo;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace Binance.TradeRobot.Business
@ -20,9 +23,23 @@ namespace Binance.TradeRobot.Business
private Lazy<GlobalContext> globalContextLazy;
private GlobalContext globalContext => globalContextLazy.Value;
public RobotBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IMemoryCache memoryCache, IServiceProvider serviceProvider) : base(fsql, logManager, idGenerator, memoryCache)
private IEnumerable<ITradeBusiness> tradeBusinessList;
private TaskSchedulerManager taskSchedulerManager;
private ExchangeBusiness exchangeBusiness;
public RobotBusiness(IFreeSql fsql,
NLogManager logManager,
IIdGenerator idGenerator,
IMemoryCache memoryCache,
IEnumerable<ITradeBusiness> tradeBusinessList,
TaskSchedulerManager taskSchedulerManager,
ExchangeBusiness exchangeBusiness,
IServiceProvider serviceProvider) : base(fsql, logManager, idGenerator, memoryCache)
{
this.globalContextLazy = new Lazy<GlobalContext>(() => serviceProvider.GetService<GlobalContext>());
this.tradeBusinessList = tradeBusinessList;
this.taskSchedulerManager = taskSchedulerManager;
this.exchangeBusiness = exchangeBusiness;
}
/// <summary>
@ -82,6 +99,14 @@ namespace Binance.TradeRobot.Business
globalContext.UnSubscribeOrderPublish(robot);
}
/// <summary>
/// 刷新机器人运行时长
/// </summary>
public void RefreshRobotRuningTime()
{
fsql.Update<Robot>().Set(r => r.RunningTime + 60).Where(r => r.State == Enums.RobotState.Runing).ExecuteAffrows();
}
/// <summary>
/// 添加机器人和账户
/// </summary>
@ -286,5 +311,55 @@ namespace Binance.TradeRobot.Business
}
return robotList;
}
public void D21Remedy()
{
var d21RobotList = GetD21PolicyRobotList(robotState: Enums.RobotState.Runing, isLoadRecentTradeProfit: false, isLoadAPIKey: true);
if (d21RobotList == null || d21RobotList.Count() == 0)
throw new BusinessException("未找到符合条件的机器人");
foreach (var d21Robot in d21RobotList)
{
var runingInfo = RedisHelper.Get<D21RuningInfo>(d21Robot.Id.ToString()) ?? new D21RuningInfo() { RobotId = d21Robot.Id };
if (runingInfo.ErrorCrossSingal == null || runingInfo.ErrorCrossSingalTime == 0)
continue;
var previouKID = DateTime.Now.GetKID(d21Robot.D21Policy.PeriodicSignal, true);
var currentKID = DateTime.Now.GetKID(d21Robot.D21Policy.PeriodicSignal, false);
var cycle = currentKID - previouKID; //单位周期的时间戳差距
if ((previouKID - runingInfo.ErrorCrossSingalTime) / cycle > 3)
{
var errorCrossSingal = runingInfo.ErrorCrossSingal.Value;
runingInfo.ErrorCrossSingal = null;
runingInfo.ErrorCrossSingalTime = 0;
RedisHelper.Set(d21Robot.Id.ToString(), runingInfo);
var symbolInfo = exchangeBusiness.GetSymbol(d21Robot.ExchangeId, d21Robot.Symbol);
var d21TradeBusiness = tradeBusinessList.FirstOrDefault(t => t.TradePolicy == Enums.TradePolicy.D21);
if (errorCrossSingal == Enums.SingalType.)
{
Task.Factory.StartNew(() => d21TradeBusiness.LongCross(new D21SingalRequest()
{
RobotId = d21Robot.Id,
KLinePeriodic = d21Robot.D21Policy.PeriodicSignal,
SingalType = errorCrossSingal,
Symbol = d21Robot.Symbol
}, d21Robot, true, symbolInfo), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SingalTaskScheduler);
}
else if (errorCrossSingal == Enums.SingalType.)
{
Task.Factory.StartNew(() => d21TradeBusiness.ShortCross(new D21SingalRequest()
{
RobotId = d21Robot.Id,
KLinePeriodic = d21Robot.D21Policy.PeriodicSignal,
SingalType = errorCrossSingal,
Symbol = d21Robot.Symbol
}, d21Robot, true, symbolInfo), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SingalTaskScheduler);
}
}
}
}
}
}

8
Binance.TradeRobot.Business/Business/SingalBusiness.cs

@ -1,6 +1,7 @@
using Binance.TradeRobot.Common.DI;
using Binance.TradeRobot.Model.Base;
using Binance.TradeRobot.Model.Dto;
using Binance.TradeRobot.Model.RuningInfo;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
@ -75,11 +76,6 @@ namespace Binance.TradeRobot.Business
}
}
public void D21Remedy()
{
var d21RobotList = robotBusiness.GetD21PolicyRobotList(robotState: Enums.RobotState.Runing, isLoadRecentTradeProfit: false, isLoadAPIKey: true);
if (d21RobotList == null || d21RobotList.Count() == 0)
throw new BusinessException("未找到符合条件的机器人");
}
}
}

5
Binance.TradeRobot.Model/Dto/Response/Robot/RobotResponse.cs

@ -27,9 +27,6 @@ namespace Binance.TradeRobot.Model.Dto
public Enums.Exchange ExchangeId { get; set; }
/// <summary>
/// 订单推送日志Key
/// </summary>
//public virtual string OrderPublishLogKey
//{
// get
@ -38,8 +35,6 @@ namespace Binance.TradeRobot.Model.Dto
// }
//}
public SymbolInfoResponse SymbolInfo { get; set; }
/// <summary>
/// 机器人账户对象
/// </summary>

Loading…
Cancel
Save