From ac9cb5352527fd17fa79ff969589832bc402cdfe Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Thu, 25 Sep 2025 12:58:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20=D1=81=D0=B1=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=B0=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Declisions/Utils/LocalTrends.cs | 10 ++++-- KLHZ.Trader.Core/Exchange/Services/Trader.cs | 32 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/LocalTrends.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/LocalTrends.cs index af287aa..a010c2f 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/LocalTrends.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/LocalTrends.cs @@ -20,8 +20,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils } var x1 = new List(); var y1 = new List(); + var x1d = new List(); var x2 = new List(); var y2 = new List(); + var x2d = new List(); var y1_approximated = new List(); var y2_approximated = new List(); @@ -37,11 +39,13 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils if (dt1 <= lastPeriod) { x2.Add((times[times.Length - i] - firstTime).TotalSeconds); + x2d.Add(times[times.Length - i]); y2.Add((double)prices[times.Length - i]); } else if (dt1 <= fullPeriod) { x1.Add((times[times.Length - i] - firstTime).TotalSeconds); + x1d.Add(times[times.Length - i]); y1.Add((double)prices[times.Length - i]); } else @@ -67,13 +71,13 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils var diff2 = y2_approximated[0] - y2_approximated[y2_approximated.Count - 1]; if (diff1 <= -meanfullDiff && diff2 >= meanfullDiff) { - res |= TradingEvent.UptrendStart; + res |= TradingEvent.DowntrendEnd; } - else if (diff1 >= meanfullDiff && diff2 <= 0) + else if (diff1 >= meanfullDiff && diff2 <= -meanfullDiff) { res |= TradingEvent.UptrendEnd; } - else if (diff1 <= -meanfullDiff && diff2 >= 0) + else if (diff1 <= -meanfullDiff && diff2 >= meanfullDiff) { res |= TradingEvent.DowntrendEnd; } diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index c123785..b4ada6d 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -574,26 +574,29 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt var resTask1 = GetWindowAverageStartData(data, 30, 180, message, windowMaxSize, 0m, 0.5m); //var resTask3 = GetWindowAverageStartData(data, 30, 180, message, windowMaxSize, 0, 0,0.7m); var getFFTModsTask = GetFFTMods(message); + var getLocalTrendsModsTask = GetLocalTrendsMods(data, message); //var getAreasModsTask = GetAreasMods(data, message); var getSellsDiffsModsTask = GetSellsDiffsMods(message); var getTradingModeModsTask = GetTradingModeMods(message); - await Task.WhenAll(resTask1, getFFTModsTask, getSellsDiffsModsTask, getTradingModeModsTask); + await Task.WhenAll(resTask1, getFFTModsTask, getSellsDiffsModsTask, getTradingModeModsTask, getLocalTrendsModsTask); //var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi); //if (resTask1.Result[TradingEvent.UptrendStart] >= 1) //{ //} - var result = resTask1.Result; + var result = getLocalTrendsModsTask.Result; //result = MergeResults(result, resTask2.Result.ToImmutableDictionary()); //result = MergeResults(result, resTask3.Result.ToImmutableDictionary()); - result = MergeResultsMax(result, changeModeData); - result = MergeResultsMult(result, getFFTModsTask.Result); - //////result = MergeResults(result, getAreasModsTask.Result); + //result = MergeResultsMax(result, changeModeData); + //result = MergeResultsMax(result, getLocalTrendsModsTask.Result); + //result = MergeResultsMult(result, getFFTModsTask.Result); + ////////result = MergeResults(result, getAreasModsTask.Result); //result = MergeResultsMult(result, getSellsDiffsModsTask.Result); - result = MergeResultsMult(result, getTradingModeModsTask.Result); + + //result = MergeResultsMult(result, getTradingModeModsTask.Result); if (result[TradingEvent.UptrendStart] >= Constants.UppingCoefficient && !LongOpeningStops.ContainsKey(message.Figi) @@ -903,6 +906,23 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt } return res.ToImmutableDictionary(); } + + private Task> GetLocalTrendsMods((DateTime[] timestamps, decimal[] prices) data, INewPrice message) + { + var res = GetInitDict(0); + if (LocalTrends.TryGetLocalTrends(data.timestamps, data.prices, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15), 0.5, out var localTrends)) + { + if ((localTrends & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd) + { + res[TradingEvent.UptrendEnd] = Constants.PowerUppingCoefficient; + } + if ((localTrends & TradingEvent.DowntrendEnd) == TradingEvent.DowntrendEnd) + { + res[TradingEvent.DowntrendEnd] = Constants.PowerUppingCoefficient; + } + } + return Task.FromResult(res.ToImmutableDictionary()); + } private async Task> GetSellsDiffsMods(INewPrice message) {