From 23c0dd886b0adbbcc138a4a4c438034e84e5ece6 Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Mon, 29 Sep 2025 23:22:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20FFT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs | 25 +++++++++++++++++++ KLHZ.Trader.Core/Exchange/Services/Trader.cs | 20 ++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs index ab480b5..51c19b4 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs @@ -82,6 +82,31 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils return (resDt, resVs); } + + public static (DateTime[] timestamps, decimal[] values) TrimValues(DateTime[] timestamps, decimal[] values, TimeSpan leftBound, TimeSpan rightBound) + { + var resDt = new List(); + var resVs = new List(); + var lastTime = timestamps[timestamps.Length - 1]; + var rightTime = lastTime - rightBound; + var leftTime = lastTime - leftBound; + for (var i = 0; i < timestamps.Length; i++) + { + var t = timestamps[timestamps.Length - i - 1]; + if (t > leftTime && t <= rightTime) + { + resDt.Add(t); + resVs.Add(values[values.Length - i - 1]); + } + else if (t<= leftTime) + { + break; + } + } + + return (resDt.ToArray(), resVs.ToArray()); + } + public static FFTAnalyzeResult GetMainHarmonic(DateTime[] timestamps, decimal[] values, string key, TimeSpan minPeriod) { var startPeriod = timestamps[timestamps.Length - 1] - timestamps[0]; diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index 3e896cc..2df9349 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -533,21 +533,29 @@ namespace KLHZ.Trader.Core.Exchange.Services } } - private async Task> CheckDivergency(INewPrice message) + private async Task> CheckDivergency(DateTime[] timestamps, decimal[] values, INewPrice message) { var res = GetInitDict(1); - var buys = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minBuyCacheKey); - var sells = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minSellCacheKey); var time1 = message.Time - TimeSpan.FromMinutes(4); var time2 = message.Time - TimeSpan.FromMinutes(2); + + var data1 = FFT.TrimValues(timestamps, values, TimeSpan.FromMinutes(4), TimeSpan.FromMinutes(2)); + var data2 = FFT.TrimValues(timestamps, values, TimeSpan.FromMinutes(2), TimeSpan.FromSeconds(-1)); + var p1 = data1.values.Sum() / data1.values.Length; + var p2 = data2.values.Sum() / data2.values.Length; + var dp = p2 - p1; + + var buys = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minBuyCacheKey); + var sells = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minSellCacheKey); + var buysOld = buys.Where(b => b.Time < time2 && b.Time >= time1).ToArray(); var sellsOld = sells.Where(b => b.Time < time2 && b.Time >= time1).ToArray(); var buysNew = buys.Where(b => b.Time >= time2).ToArray(); var sellNew = sells.Where(b => b.Time >= time2).ToArray(); if (buysNew.Length>0 && buysOld.Length > 0) { - var dpriceNew = buysNew.Sum(b => b.Value) / buysNew.Length; - var dpriceOld = buysOld.Sum(b => b.Value) / buysOld.Length; + var dpriceNew = buysNew.Sum(b => b.Value); + var dpriceOld = buysOld.Sum(b => b.Value); } @@ -752,7 +760,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt //result = MergeResults(result, resTask3.Result.ToImmutableDictionary()); result = MergeResultsMax(result, changeModeData); // result = MergeResultsMax(result, getLocalTrendsModsTask.Result); - result = MergeResultsMult(result, getFFTModsTask.Result); + //result = MergeResultsMult(result, getFFTModsTask.Result); result = MergeResultsMult(result, getSellsDiffsModsTask.Result); result = MergeResultsMult(result, getTradingModeModsTask.Result); result = MergeResultsMult(result, getSpeedResultantModsTask.Result);