diff --git a/src/Managing.Api.Workers/Workers/PricesFiveMinutesWorker.cs b/src/Managing.Api.Workers/Workers/PricesFiveMinutesWorker.cs index 8dff08f..31e6288 100644 --- a/src/Managing.Api.Workers/Workers/PricesFiveMinutesWorker.cs +++ b/src/Managing.Api.Workers/Workers/PricesFiveMinutesWorker.cs @@ -6,18 +6,18 @@ namespace Managing.Api.Workers.Workers; public class PricesFiveMinutesWorker : PricesBaseWorker { public PricesFiveMinutesWorker( - ILogger logger, - IPricesService pricesService, - IStatisticService statisticService, - IWorkerService workerService) : base( - logger, - pricesService, - workerService, - statisticService, - TimeSpan.FromMinutes(2.5), - WorkerType.PriceFiveMinutes, - Timeframe.FiveMinutes + ILogger logger, + IPricesService pricesService, + IStatisticService statisticService, + IWorkerService workerService) : base( + logger, + pricesService, + workerService, + statisticService, + TimeSpan.FromMinutes(1), + WorkerType.PriceFiveMinutes, + Timeframe.FiveMinutes ) { } -} +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/SpotlightWorker.cs b/src/Managing.Api.Workers/Workers/SpotlightWorker.cs index 0a23db8..5830a95 100644 --- a/src/Managing.Api.Workers/Workers/SpotlightWorker.cs +++ b/src/Managing.Api.Workers/Workers/SpotlightWorker.cs @@ -12,15 +12,15 @@ public class SpotlightWorker : BaseWorker ILogger logger, IWorkerService workerService, IStatisticService statisticService) : base( - Enums.WorkerType.Spotlight, - logger, - TimeSpan.FromMinutes(5), - workerService) + Enums.WorkerType.Spotlight, + logger, + TimeSpan.FromMinutes(5), + workerService) { _statisticService = statisticService; } - protected async override Task Run(CancellationToken cancellationToken) + protected override async Task Run(CancellationToken cancellationToken) { try { @@ -32,4 +32,4 @@ public class SpotlightWorker : BaseWorker throw; } } -} +} \ No newline at end of file diff --git a/src/Managing.Api/Controllers/BacktestController.cs b/src/Managing.Api/Controllers/BacktestController.cs index e9f7d5e..e951ff2 100644 --- a/src/Managing.Api/Controllers/BacktestController.cs +++ b/src/Managing.Api/Controllers/BacktestController.cs @@ -1,9 +1,7 @@ using Managing.Application.Abstractions; using Managing.Application.Abstractions.Services; using Managing.Application.Hubs; -using Managing.Core; using Managing.Domain.Backtests; -using Managing.Domain.Candles; using Managing.Domain.MoneyManagements; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; diff --git a/src/Managing.Api/Controllers/BotController.cs b/src/Managing.Api/Controllers/BotController.cs index 75275a1..219dde7 100644 --- a/src/Managing.Api/Controllers/BotController.cs +++ b/src/Managing.Api/Controllers/BotController.cs @@ -107,7 +107,7 @@ public class BotController : ControllerBase foreach (var bot in bots) { result += $"{bot.Name} : "; - result = await _mediator.Send(new StopBotCommand(bot.BotType, bot.Name)); + result += await _mediator.Send(new StopBotCommand(bot.BotType, bot.Name)); result += $" |"; } @@ -147,7 +147,7 @@ public class BotController : ControllerBase foreach (var bot in bots) { result += $"{bot.Name} : "; - result = await _mediator.Send(new RestartBotCommand(bot.BotType, bot.Name)); + result += await _mediator.Send(new RestartBotCommand(bot.BotType, bot.Name)); result += $" |"; } diff --git a/src/Managing.Application.Tests/PositionTests.cs b/src/Managing.Application.Tests/PositionTests.cs index 6084b54..d872a97 100644 --- a/src/Managing.Application.Tests/PositionTests.cs +++ b/src/Managing.Application.Tests/PositionTests.cs @@ -35,7 +35,7 @@ public class PositionTests : BaseTests } [Fact] - public async void Shoud_Close_Position() + public async Task Shoud_Close_Position() { // var hexPositions = "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000425deab364e9121f7ca284129da854fd5cf22ed00000000000000000000000070d95587d40a2caf56bd97485ab3eec10bee6336000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000fc11babdd3961cb7d1bacca000000000000000000000000000000000000000000000000000002049cca7c844e20000000000000000000000000000000000000000000000000000000000986f7e0000000000000000000000000000000000000001df508d0801ecf73c8058280500000000000000000000000000000000000000000000000df3ff1939e2b50cdd0000000000000000000000000000000000000000026bf951a8f07f8cc891bf920000000000000000000000000000000000000000000000001ac6ce5c364c6c570000000000000000000000000000000000000000000000000000000066db675e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425deab364e9121f7ca284129da854fd5cf22ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024d78200000000000000000000000000000000000000000000000000000b8a74a0cf2200000000000000000000000000000000000000000000000000000000000034ea00000000000000000000000000000000000000000000001481cd70725c3c1c03000000000000000000000000000000000000000004798d9b51ab57ddc2209ef50000000000000000000000000000000000000000000000002430a13e0606cefd000000000000000000000000000000000000000df008568002fcb46874db7fa100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000004ab88d39efb5958075000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9f4c00dde985003ca14b5000000000000000000000000000000000000000000c9f4c00dde985003ca14b5000000000000000000000000000000000000000000001f04ef12cb04cf15800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ab88d39efb5958075000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000024d7830000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffbd4eecf9670c9bc2d3c2942e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a323f06526aa4eff43bd81573b1d00000000000000000000001031bcf5ca9bcbacd1e14f4423ec048d2860e6be400000000000000000000000149385b7c14fb69bfecc8920f26e8908c05b23600000000000000000000000001031bcf5ca9bcbacd19e9e311d531128eb34a9526e0000000000000000000000000425deab364e9121f7ca284129da854fd5cf22ed00000000000000000000000047c031236e19d024b42f8ae6780e44a573170703000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000052c3a7bfeaccb2af542a7eec1f000000000000000000000000000000000000000000000000000000000000184e100000000000000000000000000000000000000000000000000000000031fce8100000000000000000000000000000000000000026bdba31976b8f5eb6839942f000000000000000000000000000000000000000000000013051f6fe1b99e5f29000000000000000000000000000000000000000000000000002318fb454fb7ef000000000000000000000000000000000000000000000000a633867ed0a624d5000000000000000000000000000000000000000000000000000000006793580e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425deab364e9121f7ca284129da854fd5cf22ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000008d16000000000000000000000000000000000000000000000013051f6fe1b99e5f290000000000000000000000000000000000000000000000000023aeb7ce5e2ae0000000000000000000000000000000000000000000000000aafa986b91e6895200000000000000000000000000000000000000007044e6adc56544d604423d6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ab88d39efb5958075000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9f4c00dde985003ca14b5000000000000000000000000000000000000000000c9f4c00dde985003ca14b50000000000000000000000000000000000000000000014adf4b7320334b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ab88d39efb595807500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064db77dc6667d396fff8db0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014285629eea2ec15d977e8b13dec5d0000000000000000000000000000001e9eda061bea538c139c4c474bf9c33e100000000000000000000000000000001e9eda061bea538c139c4c474bf9c33e100000000000000000000000000000001e9eda061c4f2f03f002b41ae2f9bc191a"; // _ = new GetAccountPositioqwnInfoListOutputDTO().DecodeOutput(hexPositions).d diff --git a/src/Managing.Application.Tests/StrategyTests.cs b/src/Managing.Application.Tests/StrategyTests.cs index 9b875ce..7a5ef2f 100644 --- a/src/Managing.Application.Tests/StrategyTests.cs +++ b/src/Managing.Application.Tests/StrategyTests.cs @@ -78,12 +78,12 @@ namespace Managing.Application.Tests [Theory] [InlineData(TradingExchanges.Ftx, Ticker.ADA, Timeframe.OneDay, -500)] - public async void Shoud_Return_Signal_On_Macd_Cross(TradingExchanges exchange, Ticker ticker, + public async Task Shoud_Return_Signal_On_Macd_Cross(TradingExchanges exchange, Ticker ticker, Timeframe timeframe, int days) { // Arrange var account = GetAccount(exchange); - var rsiStrategy = new MACDCrossStrategy("unittest", timeframe, 12, 26, 9); + var rsiStrategy = new MacdCrossStrategy("unittest", timeframe, 12, 26, 9); var candles = await _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe); var resultSignal = new List(); diff --git a/src/Managing.Application.Workers/PricesService.cs b/src/Managing.Application.Workers/PricesService.cs index e87b853..abc5216 100644 --- a/src/Managing.Application.Workers/PricesService.cs +++ b/src/Managing.Application.Workers/PricesService.cs @@ -1,7 +1,6 @@ using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; -using Managing.Domain.Candles; using Microsoft.Extensions.Logging; using static Managing.Common.Enums; diff --git a/src/Managing.Application.Workers/StatisticService.cs b/src/Managing.Application.Workers/StatisticService.cs index dde6191..a1083d8 100644 --- a/src/Managing.Application.Workers/StatisticService.cs +++ b/src/Managing.Application.Workers/StatisticService.cs @@ -1,5 +1,4 @@ -using Managing.Application.Abstractions; -using Managing.Application.Abstractions.Repositories; +using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; using Managing.Domain.Accounts; diff --git a/src/Managing.Application/Backtesting/Backtester.cs b/src/Managing.Application/Backtesting/Backtester.cs index a456dce..5f5ff64 100644 --- a/src/Managing.Application/Backtesting/Backtester.cs +++ b/src/Managing.Application/Backtesting/Backtester.cs @@ -139,11 +139,9 @@ namespace Managing.Application.Backtesting throw new Exception("No candle to backtest"); } - var hodlBalances = new Dictionary(); bot.WalletBalances.Add(candles.FirstOrDefault().Date, balance); foreach (var candle in candles) { - hodlBalances.Add(candle.Date, candle.Close); bot.Candles.Add(candle); bot.Run(); } diff --git a/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs b/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs index 7a39f79..9039dd5 100644 --- a/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs +++ b/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs @@ -21,7 +21,7 @@ public class LoadBackupBotCommandHandler : IRequestHandler Handle(LoadBackupBotCommand request, CancellationToken cancellationToken) { BotStatus botStatus = BotStatus.Down; - var backupBots = _botService.GetSavedBots(); + var backupBots = _botService.GetSavedBots().ToList(); var activeBots = _botService.GetActiveBots(); var result = new Dictionary(); @@ -79,6 +79,9 @@ public class LoadBackupBotCommandHandler : IRequestHandler $"{b.Key} - {b.Value}")}"); + return Task.FromResult(botStatus.ToString()); } } diff --git a/src/Managing.Application/ManageBot/StartBotCommandHandler.cs b/src/Managing.Application/ManageBot/StartBotCommandHandler.cs index f1cdc24..0a49f5c 100644 --- a/src/Managing.Application/ManageBot/StartBotCommandHandler.cs +++ b/src/Managing.Application/ManageBot/StartBotCommandHandler.cs @@ -41,8 +41,6 @@ namespace Managing.Application.ManageBot return Task.FromResult(fBot.GetStatus()); } - ; - return Task.FromResult(botStatus.ToString()); } } diff --git a/src/Managing.Application/Trading/TradingService.cs b/src/Managing.Application/Trading/TradingService.cs index cca869c..a759998 100644 --- a/src/Managing.Application/Trading/TradingService.cs +++ b/src/Managing.Application/Trading/TradingService.cs @@ -207,7 +207,7 @@ public class TradingService : ITradingService } return _cacheService.GetOrSave($"Fee-{account.Exchange}", - () => { return _tradingRepository.GetFee(TradingExchanges.Evm)?.Cost ?? 0m; }, TimeSpan.FromHours(2)); + () => { return (decimal)_tradingRepository.GetFee(TradingExchanges.Evm)?.Cost; }, TimeSpan.FromHours(2)); } public void UpdatePosition(Position position) diff --git a/src/Managing.Domain/Scenarios/ScenarioHelpers.cs b/src/Managing.Domain/Scenarios/ScenarioHelpers.cs index ccd750e..12e975c 100644 --- a/src/Managing.Domain/Scenarios/ScenarioHelpers.cs +++ b/src/Managing.Domain/Scenarios/ScenarioHelpers.cs @@ -17,7 +17,7 @@ public static class ScenarioHelpers strategy.Period.Value), StrategyType.RsiDivergenceConfirm => new RSIDivergenceConfirmStrategy(strategy.Name, strategy.Timeframe, strategy.Period.Value), - StrategyType.MacdCross => new MACDCrossStrategy(strategy.Name, strategy.Timeframe, + StrategyType.MacdCross => new MacdCrossStrategy(strategy.Name, strategy.Timeframe, strategy.FastPeriods.Value, strategy.SlowPeriods.Value, strategy.SignalPeriods.Value), StrategyType.EmaCross => new EmaCrossStrategy(strategy.Name, strategy.Timeframe, strategy.Period.Value), StrategyType.ThreeWhiteSoldiers => new ThreeWhiteSoldiersStrategy(strategy.Name, strategy.Timeframe, diff --git a/src/Managing.Domain/Shared/Helpers/TradingBox.cs b/src/Managing.Domain/Shared/Helpers/TradingBox.cs index c5c5779..b7637aa 100644 --- a/src/Managing.Domain/Shared/Helpers/TradingBox.cs +++ b/src/Managing.Domain/Shared/Helpers/TradingBox.cs @@ -46,8 +46,8 @@ public static class TradingBox Signal signal = null; if (strategies.Count > 1) { - var trendSignal = signalOnCandles.Where(s => s.SignalType == SignalType.Trend); - var signals = signalOnCandles.Where(s => s.SignalType == SignalType.Signal); + var trendSignal = signalOnCandles.Where(s => s.SignalType == SignalType.Trend).ToList(); + var signals = signalOnCandles.Where(s => s.SignalType == SignalType.Signal).ToList(); var contextStrategiesCount = strategies.Count(s => s.SignalType == SignalType.Context); var validContext = true; @@ -111,7 +111,7 @@ public static class TradingBox { var position = positions[i]; var nextPosition = i + 1 < positions.Count ? positions[i + 1] : null; - var (stopLoss, takeProfit) = GetBestSLTPForPosition(candles, position, nextPosition); + var (stopLoss, takeProfit) = GetBestSltpForPosition(candles, position, nextPosition); stoplossPercentage.Add(stopLoss); takeProfitsPercentage.Add(takeProfit); @@ -126,13 +126,14 @@ public static class TradingBox return moneyManagement; } - public static (decimal Stoploss, decimal TakeProfit) GetBestSLTPForPosition(List candles, Position position, + public static (decimal Stoploss, decimal TakeProfit) GetBestSltpForPosition(List candles, Position position, Position nextPosition) { var stopLoss = 0M; var takeProfit = 0M; var candlesBeforeNextPosition = candles.Where(c => - c.Date >= position.Date && c.Date <= (nextPosition == null ? candles.Last().Date : nextPosition.Date)); + c.Date >= position.Date && c.Date <= (nextPosition == null ? candles.Last().Date : nextPosition.Date)) + .ToList(); if (position.OriginDirection == TradeDirection.Long) { diff --git a/src/Managing.Domain/Shared/Helpers/TradingHelpers.cs b/src/Managing.Domain/Shared/Helpers/TradingHelpers.cs index eff5939..f2e8967 100644 --- a/src/Managing.Domain/Shared/Helpers/TradingHelpers.cs +++ b/src/Managing.Domain/Shared/Helpers/TradingHelpers.cs @@ -21,7 +21,7 @@ public static class TradingHelpers public static PerformanceMetrics GetStatistics(Dictionary pnls) { - var priceSeries = new TimePriceSeries(pnls); + var priceSeries = new TimePriceSeries(pnls.DistinctBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value)); return priceSeries.CalculatePerformanceMetrics(); } diff --git a/src/Managing.Domain/Strategies/MACDCrossStrategy.cs b/src/Managing.Domain/Strategies/MACDCrossStrategy.cs index 1bdbe56..25ac6f1 100644 --- a/src/Managing.Domain/Strategies/MACDCrossStrategy.cs +++ b/src/Managing.Domain/Strategies/MACDCrossStrategy.cs @@ -6,11 +6,12 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies; -public class MACDCrossStrategy : Strategy +public class MacdCrossStrategy : Strategy { public List Signals { get; set; } - public MACDCrossStrategy(string name, Timeframe timeframe, int fastPeriods, int slowPeriods, int signalPeriods) : base(name, timeframe, StrategyType.MacdCross) + public MacdCrossStrategy(string name, Timeframe timeframe, int fastPeriods, int slowPeriods, int signalPeriods) : + base(name, timeframe, StrategyType.MacdCross) { Signals = new List(); FastPeriods = fastPeriods; @@ -20,7 +21,7 @@ public class MACDCrossStrategy : Strategy public override List Run() { - if (Candles.Count <= 2*(SlowPeriods + SignalPeriods)) + if (Candles.Count <= 2 * (SlowPeriods + SignalPeriods)) { return null; } @@ -29,7 +30,7 @@ public class MACDCrossStrategy : Strategy { var macd = Candles.GetMacd(FastPeriods.Value, SlowPeriods.Value, SignalPeriods.Value).ToList(); var macdCandle = MapMacdToCandle(macd, Candles.TakeLast(SignalPeriods.Value)); - + if (macd.Count == 0) return null; @@ -72,19 +73,20 @@ public class MACDCrossStrategy : Strategy Date = candle.Date, Ticker = candle.Ticker, Exchange = candle.Exchange, - FastEma = currentMacd.FastEma.Value, - SlowEma = currentMacd.SlowEma.Value, Macd = currentMacd.Macd.Value, Histogram = currentMacd.Histogram.Value }); } } + return macdList; } - private void AddSignal(CandleMacd candleSignal, Timeframe timeframe, TradeDirection direction, Confidence confidence) + private void AddSignal(CandleMacd candleSignal, Timeframe timeframe, TradeDirection direction, + Confidence confidence) { - var signal = new Signal(MiscExtensions.ParseEnum(candleSignal.Ticker), direction, confidence, candleSignal, candleSignal.Date, candleSignal.Exchange, timeframe, Type, SignalType); + var signal = new Signal(MiscExtensions.ParseEnum(candleSignal.Ticker), direction, confidence, + candleSignal, candleSignal.Date, candleSignal.Exchange, timeframe, Type, SignalType); if (!Signals.Any(s => s.Identifier == signal.Identifier)) { Signals.AddItem(signal); @@ -96,7 +98,5 @@ public class MACDCrossStrategy : Strategy public double Macd { get; set; } public double Signal { get; set; } public double Histogram { get; set; } - public double FastEma { get; set; } - public double SlowEma { get; set; } } -} +} \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/InfluxDb/PriceHelpers.cs b/src/Managing.Infrastructure.Database/InfluxDb/PriceHelpers.cs index 1cb2cbe..ef962b5 100644 --- a/src/Managing.Infrastructure.Database/InfluxDb/PriceHelpers.cs +++ b/src/Managing.Infrastructure.Database/InfluxDb/PriceHelpers.cs @@ -13,10 +13,10 @@ public static class PriceHelpers { Exchange = candle.Exchange.ToString(), Ticker = candle.Ticker, - OpenTime = candle.OpenTime.ToUniversalTime(), + OpenTime = candle.OpenTime, Open = candle.Open, Close = candle.Close, - CloseTime = candle.Date.ToUniversalTime(), + CloseTime = candle.Date, High = candle.High, Low = candle.Low, BaseVolume = candle.BaseVolume, @@ -50,9 +50,4 @@ public static class PriceHelpers Timeframe = MiscExtensions.ParseEnum(dto.Timeframe) }; } - - internal static IEnumerable Map(IEnumerable candles) - { - return candles.Select(candle => Map(candle)); - } -} +} \ No newline at end of file diff --git a/src/Managing.Infrastructure.Messengers/Discord/DiscordService.cs b/src/Managing.Infrastructure.Messengers/Discord/DiscordService.cs index 1fd833c..92dc870 100644 --- a/src/Managing.Infrastructure.Messengers/Discord/DiscordService.cs +++ b/src/Managing.Infrastructure.Messengers/Discord/DiscordService.cs @@ -227,7 +227,6 @@ namespace Managing.Infrastructure.Messengers.Discord await OpenPosition(component, trade.AccountName, trade.MoneyManagementName, PositionInitiator.CopyTrading, trade.Ticker, trade.Direction, Timeframe.FifteenMinutes, DateTime.Now.AddMinutes(trade.ExpirationMinute), true, trade.Leverage); - ; } public async Task OpenPosition(SocketMessageComponent component, string[] parameters) diff --git a/src/Managing.Infrastructure.Tests/EvmManagerTests.cs b/src/Managing.Infrastructure.Tests/EvmManagerTests.cs index 14959a7..bc6f17f 100644 --- a/src/Managing.Infrastructure.Tests/EvmManagerTests.cs +++ b/src/Managing.Infrastructure.Tests/EvmManagerTests.cs @@ -40,7 +40,7 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData("")] - public async void Should_get_address_balance(string address) + public async Task Should_get_address_balance(string address) { var balance = await _manager.GetAddressBalance(address); Assert.IsType(balance); @@ -51,7 +51,7 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData("0x17f4BAa9D35Ee54fFbCb2608e20786473c7aa49f")] - public async void Should_return_holder_list_for_nft_collection(string contract) + public async Task Should_return_holder_list_for_nft_collection(string contract) { var holders = await _manager.GetContractHolders(contract, DateTime.UtcNow.AddDays(-30)); Assert.IsType>(holders); @@ -61,7 +61,7 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData("0xa435530d50d7D17Fd9fc6E1c897Dbf7C08E12d35", "0x17f4BAa9D35Ee54fFbCb2608e20786473c7aa49f")] - public async void Should_return_event_transfer_nft(string owner, string contract) + public async Task Should_return_event_transfer_nft(string owner, string contract) { var manager = new EvmManager(Subgraphs); var holders = await manager.GetNftEvent(owner, contract); @@ -72,7 +72,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_return_date_of_block() + public async Task Should_return_date_of_block() { var manager = new EvmManager(Subgraphs); var date = await manager.GetBlockDate(38793245); @@ -121,7 +121,7 @@ public class EvmManagerTests [Theory] [InlineData("0x0425dEAb364E9121F7CA284129dA854FD5cF22eD", Constants.Chains.Arbitrum)] // [InlineData("0x7002AE0Bae7fC67416230F025A32EfE086C0934E", Constants.Chains.Arbitrum)] - public async void Should_return_balances(string publicAddress, string chainName) + public async Task Should_return_balances(string publicAddress, string chainName) { var manager = new EvmManager(Subgraphs); var chain = _chains.First(c => c.Name == chainName); @@ -135,7 +135,7 @@ public class EvmManagerTests [Theory] //[InlineData("0x7002ae0bae7fc67416230f025a32efe086c0934e", Constants.Chains.Arbitrum)] [InlineData("0xc62F5499789b716Aa94a421A60c76c8c13A31ab6", Constants.Chains.Ethereum)] - public async void Should_return_all_balance(string publicAddress, string chainName) + public async Task Should_return_all_balance(string publicAddress, string chainName) { var manager = new EvmManager(Subgraphs); var chain = _chains.First(c => c.Name == chainName); @@ -160,7 +160,7 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData("")] - public async void Should_return_balance_of_ethers(string publicAddress) + public async Task Should_return_balance_of_ethers(string publicAddress) { var manager = new EvmManager(Subgraphs); var chain = _chains.First(c => c.Name == Constants.Chains.Ethereum); @@ -172,7 +172,7 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData("")] - public async void Should_return_all_balance_for_all_chain(string publicAddress) + public async Task Should_return_all_balance_for_all_chain(string publicAddress) { var manager = new EvmManager(Subgraphs); var balances = await manager.GetAllBalancesOnAllChain(publicAddress); @@ -184,12 +184,12 @@ public class EvmManagerTests [Ignore] [Theory] [InlineData(Ticker.BTC, Timeframe.FiveMinutes)] - public async void Get_Prices(Ticker ticker, Timeframe timeframe) + public async Task Get_Prices(Ticker ticker, Timeframe timeframe) { var manager = new EvmManager(Subgraphs); var candles = await manager.GetCandles(SubgraphProvider.ChainlinkPrice, ticker, DateTime.UtcNow, timeframe); - if (candles == null || !candles.Any()) + if (!candles.Any()) { candles = await manager.GetCandles(SubgraphProvider.ChainlinkGmx, ticker, DateTime.UtcNow, timeframe); } @@ -200,7 +200,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Get_Available_Tickers() + public async Task Get_Available_Tickers() { var manager = new EvmManager(Subgraphs); var tickers = await manager.GetAvailableTicker(); @@ -210,7 +210,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void GetLastCandle() + public async Task GetLastCandle() { var manager = new EvmManager(Subgraphs); var candle = await manager.GetCandle(SubgraphProvider.Gbc, Ticker.BTC); @@ -220,7 +220,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_Init_Address_For_Trading() + public async Task Should_Init_Address_For_Trading() { var manager = new EvmManager(Subgraphs); var accountInitilized = await manager.InitAddress(Constants.Chains.Arbitrum, PublicAddress, "PrivateKey"); @@ -230,7 +230,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_send_eth_from_account() + public async Task Should_send_eth_from_account() { var manager = new EvmManager(Subgraphs); var chain = _chains.First(c => c.Name == Constants.Chains.Arbitrum); @@ -250,7 +250,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_send_Gmx_from_account() + public async Task Should_send_Gmx_from_account() { var manager = new EvmManager(Subgraphs); var chain = _chains.First(c => c.Name == Constants.Chains.Arbitrum); @@ -270,7 +270,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_return_allowance() + public async Task Should_return_allowance() { var manager = new EvmManager(Subgraphs); var account = PrivateKeys.GetAccount(); @@ -281,7 +281,7 @@ public class EvmManagerTests [Ignore] [Fact] - public async void Should_set_allowance() + public async Task Should_set_allowance() { var manager = new EvmManager(Subgraphs); var account = PrivateKeys.GetAccount(); @@ -294,7 +294,7 @@ public class EvmManagerTests } [Fact] - public async void Should_return_GmxGasPrice() + public async Task Should_return_GmxGasPrice() { var result = await EvmBase.GetGasPrice(new Web3(_chains.First(c => c.Name == Constants.Chains.Arbitrum).RpcUrl)); diff --git a/src/Managing.Infrastructure.Web3/EvmManager.cs b/src/Managing.Infrastructure.Web3/EvmManager.cs index 2c3ec3d..7fd782c 100644 --- a/src/Managing.Infrastructure.Web3/EvmManager.cs +++ b/src/Managing.Infrastructure.Web3/EvmManager.cs @@ -10,7 +10,6 @@ using Managing.Domain.Statistics; using Managing.Domain.Trades; using Managing.Infrastructure.Evm.Abstractions; using Managing.Infrastructure.Evm.Models; -using Managing.Infrastructure.Evm.Models.Gmx.v1; using Managing.Infrastructure.Evm.Models.Gmx.v2; using Managing.Infrastructure.Evm.Referentials; using Managing.Infrastructure.Evm.Services; @@ -318,7 +317,7 @@ public class EvmManager : IEvmManager var geckoToken = geckoTokens.FirstOrDefault(x => string.Equals(x.Symbol, tokens[i].Symbol, StringComparison.InvariantCultureIgnoreCase)); - evmTokens.Add((tokenBalance, geckoToken)); + evmTokens.Add((tokenBalance, geckoToken)!); } } @@ -379,14 +378,16 @@ public class EvmManager : IEvmManager if (gmxPrices == null) return null; - gmxPrices.Candles = gmxPrices.Candles.Where(p => p[0] >= startDate.ToUnixTimestamp()).ToList(); - gmxPrices.Candles.RemoveAt(gmxPrices.Candles.Count - 1); + var filteredCandles = gmxPrices.Candles.Where(p => p[0] >= startDate.ToUnixTimestamp()).ToList(); var candles = new List(); - var timeBetweenCandles = gmxPrices.Candles[0][0] - gmxPrices.Candles[1][0]; - for (int i = 0; i < gmxPrices.Candles.Count; i++) + + var timeBetweenCandles = + gmxPrices.Candles.Count > 2 ? gmxPrices.Candles[0][0] - gmxPrices.Candles[1][0] : 900; // Default 15 minutes + + for (int i = 0; i < filteredCandles.Count; i++) { - var c = GmxV2Mappers.Map(gmxPrices.Candles[i], ticker, timeframe, (int)timeBetweenCandles); + var c = GmxV2Mappers.Map(filteredCandles[i], ticker, timeframe, (int)timeBetweenCandles); candles.Add(c); } diff --git a/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs b/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs index 59ba263..0472d10 100644 --- a/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs +++ b/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs @@ -110,7 +110,7 @@ internal static class GmxV2Mappers { return new Candle() { - Date = DateHelpers.GetFromUnixTimestamp((int)marketPrices[0]).AddSeconds(timeBetween).AddSeconds(-1), + Date = DateHelpers.GetFromUnixTimestamp((int)marketPrices[0] + timeBetween).AddSeconds(-1), OpenTime = DateHelpers.GetFromUnixTimestamp((int)marketPrices[0]), Open = Convert.ToDecimal(marketPrices[1]), High = Convert.ToDecimal(marketPrices[2]), diff --git a/src/Managing.WebApp/src/app/store/customMoneyManagement.tsx b/src/Managing.WebApp/src/app/store/customMoneyManagement.tsx new file mode 100644 index 0000000..8cad8fc --- /dev/null +++ b/src/Managing.WebApp/src/app/store/customMoneyManagement.tsx @@ -0,0 +1,18 @@ +import { create } from 'zustand' + +import type { MoneyManagement } from '../../generated/ManagingApi' + +type CustomMoneyManagementStore = { + setCustomMoneyManagement: (custom: MoneyManagement) => void + moneyManagement: MoneyManagement | null +} + +export const useCustomMoneyManagement = create((set) => ({ + moneyManagement: null, + setCustomMoneyManagement: (custom) => { + set((state) => ({ + ...state, + moneyManagement: custom, + })) + }, +})) diff --git a/src/Managing.WebApp/src/components/mollecules/LogIn/LogIn.tsx b/src/Managing.WebApp/src/components/mollecules/LogIn/LogIn.tsx index 1614339..dbe9edb 100644 --- a/src/Managing.WebApp/src/components/mollecules/LogIn/LogIn.tsx +++ b/src/Managing.WebApp/src/components/mollecules/LogIn/LogIn.tsx @@ -22,8 +22,6 @@ const LogIn = () => { const message = 'wagmi' const signature = await signMessageAsync({ message }) const t = new Toast('Creating token') - console.log(t) - if (signature && address) { const userClient = new UserClient({}, apiUrl) @@ -37,10 +35,9 @@ const LogIn = () => { }) .then((data) => { setCookie('token', data, 1) - console.log('token', data) setTimeout(() => { location.assign("/"); - }, 2000); + }, 1000); }) .catch((err: any) => { t.update('error', 'Error : Some thing bad happen') diff --git a/src/Managing.WebApp/src/components/organism/Backtest/backtestModal.tsx b/src/Managing.WebApp/src/components/organism/Backtest/backtestModal.tsx index 8289667..6829a4a 100644 --- a/src/Managing.WebApp/src/components/organism/Backtest/backtestModal.tsx +++ b/src/Managing.WebApp/src/components/organism/Backtest/backtestModal.tsx @@ -38,7 +38,7 @@ const BacktestModal: React.FC = ({ showLoopSlider ? 3 : 1 ) const [balance, setBalance] = React.useState(10000) - const [days, setDays] = React.useState(-10) + const [days, setDays] = React.useState(-17) const [customMoneyManagement, setCustomMoneyManagement] = React.useState() @@ -58,6 +58,7 @@ const BacktestModal: React.FC = ({ const { register, handleSubmit } = useForm() const onSubmit: SubmitHandler = async (form) => { const { scenarioName, tickers } = form + console.log(customMoneyManagement) closeModal() for (let sIndex = 0; sIndex < scenarioName.length; sIndex++) { for (let tIndex = 0; tIndex < tickers.length; tIndex++) { @@ -76,7 +77,7 @@ const BacktestModal: React.FC = ({ form: IBacktestsFormInput, ticker: string, scenarioName: string, - moneyManagement: MoneyManagement | undefined, + customMoneyManagement: MoneyManagement | undefined, loopCount: number ) { const t = new Toast(ticker + ' is running') @@ -92,7 +93,7 @@ const BacktestModal: React.FC = ({ balance, selectedMoneyManagement, form.save, - selectedMoneyManagement ? undefined : moneyManagement + showCustomMoneyManagement ? customMoneyManagement : undefined ) .then((backtest: Backtest) => { t.update('success', `${backtest.ticker} Backtest Succeeded`) @@ -125,8 +126,7 @@ const BacktestModal: React.FC = ({ } function onMoneyManagementChange(e: any) { - console.log(e.target.value) - if (e.target.value == 'Custom') { + if (e.target.value == 'custom') { setShowCustomMoneyManagement(true) } else { setShowCustomMoneyManagement(false) @@ -210,6 +210,24 @@ const BacktestModal: React.FC = ({ ))} + + + + + - - - - setLeverage(e.target.value)} - prefixValue="x " - > + type='number' + className='input input-bordered' + > - - + setTakeProfit(e.target.value)} step="0.01" max="20" - suffixValue=" %" - > + type='number' + className='input input-bordered' + > - - + setStopLoss(e.target.value)} step="0.01" max="20" - suffixValue=" %" - > + type='number' + className='input input-bordered' + > diff --git a/src/Managing.WebApp/src/generated/AuthorizedApiBase.ts b/src/Managing.WebApp/src/generated/AuthorizedApiBase.ts index f1b8d02..4601cbd 100644 --- a/src/Managing.WebApp/src/generated/AuthorizedApiBase.ts +++ b/src/Managing.WebApp/src/generated/AuthorizedApiBase.ts @@ -16,11 +16,7 @@ export default class AuthorizedApiBase { transformOptions = (options: any): Promise => { const cookies = new Cookies() - - // Retrieve the bearer token from the cookies const bearerToken = cookies.get('token') - // eslint-disable-next-line no-console - console.log(bearerToken) if (bearerToken) { options.headers.Authorization = `Bearer ${bearerToken}` }