From 0aad9297d9b561dfb55ce70c8790077b11e48bb9 Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Mon, 29 Sep 2025 16:04:52 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs | 58 +++++++++---------- KLHZ.Trader.Core/Exchange/Services/Trader.cs | 28 +++++---- .../Controllers/PlayController.cs | 2 +- 3 files changed, 41 insertions(+), 47 deletions(-) diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs index 9ef1b2f..ab480b5 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs @@ -15,14 +15,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils { return ValueAmplitudePosition.UpperThen30Decil; } - else if (value < fftData.Mediana && System.Math.Sign(value2) >= 0) + else if (value < fftData.Mediana) { return ValueAmplitudePosition.LowerThenMedianaGrowing; } - else if (value < fftData.Mediana && System.Math.Sign(value2) < 0) - { - return ValueAmplitudePosition.LowerThenMedianaFalling; - } else { return ValueAmplitudePosition.Middle; @@ -65,7 +61,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils } } - internal static (DateTime[] timestamps, decimal[] values) TrimValues(DateTime[] timestamps, decimal[] values, TimeSpan period) + public static (DateTime[] timestamps, decimal[] values) TrimValues(DateTime[] timestamps, decimal[] values, TimeSpan period) { int i = 0; var lastTime = timestamps[timestamps.Length - 1]; @@ -86,35 +82,35 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils return (resDt, resVs); } - public static FFTAnalyzeResult GetMainHarmonic(DateTime[] timestamps, decimal[] values, string key, TimeSpan minPeriod, TimeSpan maxPeriod) + public static FFTAnalyzeResult GetMainHarmonic(DateTime[] timestamps, decimal[] values, string key, TimeSpan minPeriod) { - - var harmonics = GetHarmonics(values, timestamps[timestamps.Length - 1] - timestamps[0], minPeriod, maxPeriod); - var newValues = new decimal[timestamps.Length]; - var newValues2 = new decimal[timestamps.Length]; - var startTime = timestamps[0]; - for (int i = 0; i < timestamps.Length; i++) + var startPeriod = timestamps[timestamps.Length - 1] - timestamps[0]; + var results = new List<(float, Harmonic[], TimeSpan, Harmonic)>(); + var max = 0f; + while (startPeriod> minPeriod) { - newValues[i] = (decimal)CalcAmplitude(harmonics, startTime, timestamps[i]); - newValues2[i] = (decimal)CalcExtremum(harmonics, startTime, timestamps[i]); + var data = TrimValues(timestamps, values, startPeriod); + var harmonics = GetHarmonics(values, startPeriod, TimeSpan.FromSeconds(5), startPeriod); + var summMagn = harmonics.Sum(h => h.Magnitude); + (float, Harmonic[], TimeSpan, Harmonic)? res = null; + for (int i=2;i< harmonics.Length; i++) + { + var currentMagn = harmonics[i].Magnitude / summMagn/ harmonics.Length; + if (currentMagn> max) + { + res = (currentMagn, harmonics, startPeriod, harmonics[i]); + } + } + if (res != null) + { + results.Add(res.Value); + } + startPeriod = startPeriod - TimeSpan.FromSeconds(30); } - newValues = newValues.Order().ToArray(); - var ma = newValues2.Max(); - var mi = newValues2.Min(); - return new FFTAnalyzeResult() - { - Key = key, - Harmonics = harmonics, - LastTime = timestamps[timestamps.Length - 1], - StartTime = startTime, - Mediana = newValues[newValues.Length / 2], - Upper30Decil = newValues[(int)(newValues.Length * 0.7)], - Lower30Decil = newValues[(int)(newValues.Length * 0.3)], - Max = newValues.Max(), - Min = newValues.Min(), - Length = values.Length, - }; + var t = results.MaxBy(r => r.Item1); + + return FFTAnalyzeResult.Empty; } public static FFTAnalyzeResult Analyze(DateTime[] timestamps, decimal[] values, string key, TimeSpan minPeriod, TimeSpan maxPeriod) diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index 3d5300e..0090d3e 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -95,15 +95,11 @@ namespace KLHZ.Trader.Core.Exchange.Services public async ValueTask<(DateTime[] timestamps, decimal[] prices, bool isFullIntervalExists)> GetData(INewPrice message, TimeSpan? windowSize = null) { - var data2 = await _tradeDataProvider.GetData(message.Figi, windowSize??TimeSpan.FromHours(1.5)); - if (!data2.isFullIntervalExists) - { - data2 = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromHours(1)); - } - if (!data2.isFullIntervalExists) - { - data2 = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromHours(0.75)); - } + var data2 = await _tradeDataProvider.GetData(message.Figi, windowSize??TimeSpan.FromHours(1)); + //if (!data2.isFullIntervalExists) + //{ + // data2 = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromHours(0.75)); + //} return data2; } @@ -141,13 +137,13 @@ namespace KLHZ.Trader.Core.Exchange.Services if (data.isFullIntervalExists) { var interpolatedData = SignalProcessing.InterpolateData(data.timestamps, data.prices, TimeSpan.FromSeconds(5)); - fftFull = FFT.Analyze(interpolatedData.timestamps, interpolatedData.values, message.Figi+"_full", TimeSpan.FromSeconds(30), TimeSpan.FromHours(24)); + fftFull = FFT.Analyze(interpolatedData.timestamps, interpolatedData.values, message.Figi+"_full", TimeSpan.FromMinutes(2), TimeSpan.FromMinutes(30)); - fft = FFT.ReAnalyze(fftFull, message.Figi, TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(60)); + //fft = FFT.ReAnalyze(fftFull, message.Figi, TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(60)); //highFreq = FFT.ReAnalyze(fftFull, message.Figi + "_low_freq", TimeSpan.FromMinutes(20), TimeSpan.FromMinutes(60)); //lowFreq = FFT.ReAnalyze(fftFull, message.Figi + "_high_freq", TimeSpan.FromMinutes(3), TimeSpan.FromMinutes(20)); - - await _tradeDataProvider.SetFFtResult(fft); + //var tmp = FFT.GetMainHarmonic(interpolatedData.timestamps, interpolatedData.values, "mainHarm", TimeSpan.FromMinutes(20)); + //await _tradeDataProvider.SetFFtResult(fft); await _tradeDataProvider.SetFFtResult(fftFull); //await _tradeDataProvider.SetFFtResult(lowFreq); //await _tradeDataProvider.SetFFtResult(highFreq); @@ -166,7 +162,7 @@ namespace KLHZ.Trader.Core.Exchange.Services - position = FFT.Check(fft, message.Time); + position = FFT.Check(fftFull, message.Time); if (position == Math.Declisions.Dtos.FFT.Enums.ValueAmplitudePosition.UpperThen30Decil) { await LogPrice(message, "upper30percent", message.Value); @@ -176,6 +172,8 @@ namespace KLHZ.Trader.Core.Exchange.Services await LogPrice(message, "lower30percent", message.Value); } + + //var hposition = FFT.CheckExtremums(highFreq, message.Time); //if (hposition == Math.Declisions.Dtos.FFT.Enums.ValueAmplitudePosition.UpperThen30Decil) //{ @@ -699,7 +697,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt var windows = await GetWindowsSizes(message); //var resTask1 = GetWindowAverageStartData(data, 30, 180, message, windowMaxSize, -2m, 2m,3); - var resTask1 = GetWindowAverageStartData(data, (int)windows.smallWindow, (int)windows.bigWindow, message, windowMaxSize, -0.5m, 0.5m); + var resTask1 = GetWindowAverageStartData(data, (int)windows.smallWindow, (int)windows.bigWindow, message, windowMaxSize, -1m, 1m); ////var resTask3 = GetWindowAverageStartData(data, 30, 180, message, windowMaxSize, 0, 0,0.7m); var getFFTModsTask = GetFFTMods(message); var getLocalTrendsModsTask = GetLocalTrendsMods(data, message); diff --git a/KLHZ.Trader.Service/Controllers/PlayController.cs b/KLHZ.Trader.Service/Controllers/PlayController.cs index 12d54df..bf493e8 100644 --- a/KLHZ.Trader.Service/Controllers/PlayController.cs +++ b/KLHZ.Trader.Service/Controllers/PlayController.cs @@ -46,7 +46,7 @@ namespace KLHZ.Trader.Service.Controllers context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - while (time1 < DateTime.UtcNow) + while (time1 < DateTime.UtcNow.Date) { var data = new List(); var data2 = new List();