From 9554b988e331925fd72793e4ca9a56fd8b7671a2 Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Tue, 7 Oct 2025 13:16:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KLHZ.Trader.Core/Exchange/Services/Trader.cs | 86 ++++--------------- .../Exchange/Services/TraderDataProvider.cs | 53 ++++++++++++ 2 files changed, 69 insertions(+), 70 deletions(-) diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index ec5ff17..38e2395 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -4,9 +4,7 @@ using KLHZ.Trader.Core.Contracts.Messaging.Dtos; using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Enums; using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; using KLHZ.Trader.Core.Contracts.Messaging.Interfaces; -using KLHZ.Trader.Core.DataLayer.Entities.Declisions; using KLHZ.Trader.Core.DataLayer.Entities.Declisions.Enums; -using KLHZ.Trader.Core.DataLayer.Entities.Prices; using KLHZ.Trader.Core.Exchange.Interfaces; using KLHZ.Trader.Core.Exchange.Models.Configs; using KLHZ.Trader.Core.Exchange.Models.Trading; @@ -212,8 +210,8 @@ namespace KLHZ.Trader.Core.Exchange.Services if (trades2.TryCalcTimeWindowsDiff(bigWindow, smallWindow, v => v.Count, false, out var tradesDiff) && buys.TryCalcTimeWindowsDiff(bigWindow, smallWindow, v => v.Price, true, out var pricesDiff)) { - await LogPrice(message, "privcesDiff", pricesDiff); - await LogPrice(message, "tradevolume_diff", tradesDiff); + await _tradeDataProvider.LogPrice(message, "privcesDiff", pricesDiff); + await _tradeDataProvider.LogPrice(message, "tradevolume_diff", tradesDiff); await _tradeDataProvider.AddDataTo15MinuteWindowCache(message.Figi, "5min_diff", new Contracts.Declisions.Dtos.CachedValue() { Time = message.Time, @@ -225,12 +223,12 @@ namespace KLHZ.Trader.Core.Exchange.Services if (diffs.TryCalcTimeWindowsDiff(bigWindow, smallWindow, (c) => c.Value, true, out var resdp) && diffs.TryCalcTimeWindowsDiff(bigWindow, smallWindow, (c) => c.Value2, true, out var resv)) { - await LogPrice(message, "privcesDiffDiff", (decimal)resdp); - await LogPrice(message, "tradevolume_diff_diff", (decimal)resv); + await _tradeDataProvider.LogPrice(message, "privcesDiffDiff", (decimal)resdp); + await _tradeDataProvider.LogPrice(message, "tradevolume_diff_diff", (decimal)resv); if (diffs.TryCalcPirsonCorrelation(meanWindow, out var pirson)) { - await LogPrice(message, "diffs_pirson", (decimal)pirson); + await _tradeDataProvider.LogPrice(message, "diffs_pirson", (decimal)pirson); await _tradeDataProvider.AddDataTo15MinuteWindowCache(message.Figi, "diffs_pirson", new Contracts.Declisions.Dtos.CachedValue() { Time = message.Time, @@ -243,7 +241,7 @@ namespace KLHZ.Trader.Core.Exchange.Services { if (olddpirs < 0.5m && res > 0.5m) { - await LogPrice(message, "diffs_pirson_diff_point0.5", message.Price); + await _tradeDataProvider.LogPrice(message, "diffs_pirson_diff_point0.5", message.Price); } } DPirsonValues[message.Figi] = res; @@ -306,7 +304,7 @@ namespace KLHZ.Trader.Core.Exchange.Services if (loggedDeclisions == 0) { loggedDeclisions++; - await LogDeclision(asset.Count < 0 ? DeclisionTradeAction.CloseShortReal : DeclisionTradeAction.CloseLongReal, message, profit); + await _tradeDataProvider.LogDeclision(asset.Count < 0 ? DeclisionTradeAction.CloseShortReal : DeclisionTradeAction.CloseLongReal, message, profit); } } } @@ -344,7 +342,7 @@ namespace KLHZ.Trader.Core.Exchange.Services if (loggedDeclisions == 0) { - await LogDeclision(DeclisionTradeAction.OpenLongReal, message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.OpenLongReal, message); loggedDeclisions++; } } @@ -367,9 +365,9 @@ namespace KLHZ.Trader.Core.Exchange.Services .ToArray(); await OpenPositions(accounts, message, PositionType.Long, stops.stopLoss, stops.takeProfit, 1); } - await LogDeclision(DeclisionTradeAction.OpenLong, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); - await LogDeclision(DeclisionTradeAction.ResetStopsLong, message.Price + stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(300, 1000)), message); - await LogDeclision(DeclisionTradeAction.ResetStopsLong, message.Price - stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.OpenLong, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.ResetStopsLong, message.Price + stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(300, 1000)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.ResetStopsLong, message.Price - stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); } if (result[TradingEvent.DowntrendStart] >= Constants.UppingCoefficient && state == ExchangeState.Open @@ -386,9 +384,9 @@ namespace KLHZ.Trader.Core.Exchange.Services await OpenPositions(accounts, message, PositionType.Short, stops.stopLoss, stops.takeProfit, 1); } - await LogDeclision(DeclisionTradeAction.OpenShort, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); - await LogDeclision(DeclisionTradeAction.ResetStopsShort, message.Price - stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(300, 1000)), message); - await LogDeclision(DeclisionTradeAction.ResetStopsShort, message.Price + stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.OpenShort, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.ResetStopsShort, message.Price - stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(300, 1000)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.ResetStopsShort, message.Price + stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); } if (result[TradingEvent.UptrendEnd] >= Constants.UppingCoefficient * 10) { @@ -400,7 +398,7 @@ namespace KLHZ.Trader.Core.Exchange.Services .ToArray(); await ClosePositions(assetsForClose, message); } - await LogDeclision(DeclisionTradeAction.CloseLong, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.CloseLong, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); } @@ -414,63 +412,11 @@ namespace KLHZ.Trader.Core.Exchange.Services .ToArray(); await ClosePositions(assetsForClose, message); } - await LogDeclision(DeclisionTradeAction.CloseShort, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); + await _tradeDataProvider.LogDeclision(DeclisionTradeAction.CloseShort, message.Price, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(-100, 100)), message); } } - private async Task LogPrice(INewPrice message, string processor, decimal value) - { - await _tradeDataProvider.LogPrice(new ProcessedPrice() - { - Figi = message.Figi, - Ticker = message.Ticker, - Processor = processor, - Time = message.Time, - Price = value, - }, false); - } - - private async Task LogPrice(string figi, string ticker, DateTime time, decimal value, string processor) - { - await _tradeDataProvider.LogPrice(new ProcessedPrice() - { - Figi = figi, - Ticker = ticker, - Processor = processor, - Time = time, - Price = value, - }, false); - } - - private async Task LogDeclision(DeclisionTradeAction action, INewPrice message, decimal? profit = null) - { - await _tradeDataProvider.LogDeclision(new Declision() - { - AccountId = string.Empty, - Figi = message.Figi, - Ticker = message.Ticker, - Value = profit, - Price = message.Price, - Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow, - Action = action, - }, false); - } - - private async Task LogDeclision(DeclisionTradeAction action, decimal price, DateTime time, INewPrice message) - { - await _tradeDataProvider.LogDeclision(new Declision() - { - AccountId = string.Empty, - Figi = message.Figi, - Ticker = message.Ticker, - Value = price, - Price = price, - Time = time, - Action = action, - }, false); - } - public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; diff --git a/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs b/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs index 00b03b2..62ee788 100644 --- a/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs +++ b/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs @@ -5,6 +5,7 @@ using KLHZ.Trader.Core.Contracts.Messaging.Dtos; using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; using KLHZ.Trader.Core.DataLayer; using KLHZ.Trader.Core.DataLayer.Entities.Declisions; +using KLHZ.Trader.Core.DataLayer.Entities.Declisions.Enums; using KLHZ.Trader.Core.DataLayer.Entities.Prices; using KLHZ.Trader.Core.Exchange.Models.Configs; using KLHZ.Trader.Core.Math.Declisions.Dtos.FFT; @@ -297,6 +298,58 @@ namespace KLHZ.Trader.Core.Exchange.Services await _forSave.Writer.WriteAsync(declision); } } + + internal async Task LogPrice(INewPrice message, string processor, decimal value) + { + await LogPrice(new ProcessedPrice() + { + Figi = message.Figi, + Ticker = message.Ticker, + Processor = processor, + Time = message.Time, + Price = value, + }, false); + } + + internal async Task LogPrice(string figi, string ticker, DateTime time, decimal value, string processor) + { + await LogPrice(new ProcessedPrice() + { + Figi = figi, + Ticker = ticker, + Processor = processor, + Time = time, + Price = value, + }, false); + } + + internal async Task LogDeclision(DeclisionTradeAction action, INewPrice message, decimal? profit = null) + { + await LogDeclision(new Declision() + { + AccountId = string.Empty, + Figi = message.Figi, + Ticker = message.Ticker, + Value = profit, + Price = message.Price, + Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow, + Action = action, + }, false); + } + + internal async Task LogDeclision(DeclisionTradeAction action, decimal price, DateTime time, INewPrice message) + { + await LogDeclision(new Declision() + { + AccountId = string.Empty, + Figi = message.Figi, + Ticker = message.Ticker, + Value = price, + Price = price, + Time = time, + Action = action, + }, false); + } private async Task WritePricesTask() { var buffer1 = new List();