From f76564ab270d12b92a01c892626c0b56b3f8d23e Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Tue, 9 Sep 2025 01:14:55 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Declisions/Utils/MovingAverage.cs | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs index 33fc4c6..cbe9274 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs @@ -29,11 +29,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils try { var pricesForFinalComparison = new decimal[size]; - var timesForFinalComparison = new DateTime[size]; var twavss = new decimal[size]; var twavbs = new decimal[size]; var times = new DateTime[size]; - + var crossings = new List(); for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++) { s = shift; @@ -43,7 +42,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils var twavs = CalcTimeWindowAverageValue(timestamps, prices, smallWindow, shift); var twavb = CalcTimeWindowAverageValue(timestamps, prices, bigWindow, shift); pricesForFinalComparison[i2] = prices[prices.Length - 1 - shift]; - timesForFinalComparison[i2] = timestamps[prices.Length - 1 - shift]; + if (shift == 0) { bigWindowAv = twavb.value; @@ -52,11 +51,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils twavss[i2] = twavs.value; twavbs[i2] = twavb.value; times[i2] = twavb.time; - //if (System.Math.Abs(twavb.value - prices[prices.Length - 1]) > 2 * meanfullStep) - //{ - // res |= TradingEvent.StopBuy; - // return (res, bigWindowAv, smallWindowAv); - //} + if (shift > 0) { var isCrossing = Lines.IsLinesCrossing( @@ -72,28 +67,34 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils { break; } + if (isCrossing.res) { - // если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта - if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2]= meanfullStep - // && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) - { - res |= TradingEvent.UptrendStart; - } - break; - } + crossings.Add(i2); - // если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта - if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2]) + if (crossings.Count == 2 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) { - //if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep - // && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) + // если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта + if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2] < twavbs[size - 2]) { - res |= TradingEvent.UptrendEnd; + if (pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]] <= - meanfullStep + && times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart) + { + res |= TradingEvent.UptrendStart; + } + break; + } + + // если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта + if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2]) + { + if (pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]] >= meanfullStep + && times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart) + { + res |= TradingEvent.UptrendEnd; + } + break; } - break; } } }