From bbef0a757b4be3a56b29cd90fb485bc1e215f04b Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Tue, 9 Sep 2025 00:23:43 +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 | 85 ++++--------------- KLHZ.Trader.Core/Exchange/Services/Trader.cs | 8 +- .../Controllers/PlayController.cs | 82 ++++++++++++------ 3 files changed, 75 insertions(+), 100 deletions(-) diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs index ea7ac40..33fc4c6 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs @@ -25,6 +25,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils var res = TradingEvent.None; var bigWindowAv = 0m; var smallWindowAv = 0m; + var s = 0; try { var pricesForFinalComparison = new decimal[size]; @@ -32,12 +33,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils var twavss = new decimal[size]; var twavbs = new decimal[size]; var times = new DateTime[size]; - var areas = new List(); - var sign = 1d; - var areaValue = 0d; - var crossingsCounter = 1; + for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++) { + s = shift; var i2 = size - 1 - shift; var i1 = size - 2 - shift; @@ -50,19 +49,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils bigWindowAv = twavb.value; smallWindowAv = twavs.value; } - twavss[i2] = twavs.value; twavbs[i2] = twavb.value; times[i2] = twavb.time; - - var debugArrayB = twavbs.Reverse().ToArray(); - var debugArrayS = twavss.Reverse().ToArray(); - var debugArrayT = times.Reverse().ToArray(); - if (System.Math.Abs(twavb.value - prices[prices.Length - 1]) > 2 * meanfullStep) - { - res |= TradingEvent.StopBuy; - return (res, bigWindowAv, smallWindowAv); - } + //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( @@ -78,41 +72,13 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils { break; } - - if (shift == 1 && isCrossing.res)//обработка ситуации когда одна из точек - совпадение + if (isCrossing.res) { // если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта - //if (twavbs[size - 1] <= twavss[size - 1] && twavbs[size - 2] > twavss[size - 2]) - //{ - // sign = -1d; - //} - //// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта - //if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2]) - //{ - // sign = 1d; - //} - // если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта - if ((debugArrayS[0] == debugArrayB[0] && debugArrayB[1] > debugArrayS[1]) - || (debugArrayB[0] < debugArrayS[0] && debugArrayB[1] > debugArrayS[1])) + if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2] debugArrayB[0] && debugArrayS[1] < debugArrayB[1])) - { - sign = 1d; - } - } - - if (shift > 1 && isCrossing.res) - { - // если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта - if (twavbs[size - 1] <= twavss[size - 1] && twavbs[size - 2] > twavss[size - 2]) - { - if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep - && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) + //if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep + // && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) { res |= TradingEvent.UptrendStart; } @@ -120,37 +86,16 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils } // если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта - if ((debugArrayS[0] == debugArrayB[0] && debugArrayS[1] < debugArrayB[1]) - || (debugArrayS[0] > debugArrayB[0] && debugArrayS[1] < debugArrayB[1])) + if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2]) { - if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep - && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) + //if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep + // && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart) { res |= TradingEvent.UptrendEnd; } break; } } - - if (shift > 1) - { - if (isCrossing.res) - { - var ar = ShapeAreaCalculator.CalculateTriangleArea( - isCrossing.x, isCrossing.y, times[i1 + 1], twavss[i1 + 1], times[i1 + 1], twavbs[i1 + 1]); - areas.Add(ar); - areaValue += sign* areas.Sum(); - sign *= -1; - areas.Clear(); - crossingsCounter++; - } - else - { - var ar = ShapeAreaCalculator.CalculateQuadrilateralArea( - times[i1 + 1], twavss[i1 + 1], times[i1 + 1], twavbs[i1 + 1], times[i2 + 1], twavss[i2 + 1], times[i2 + 1], twavbs[i2 + 1]); - areas.Add(ar); - } - } } } } diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index 849fdfc..5594919 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -172,7 +172,8 @@ namespace KLHZ.Trader.Core.Exchange.Services && !OpeningStops.TryGetValue(message.Figi, out _) && state == ExchangeState.Open && data.timestamps.Length > 1 - && (data.timestamps[data.timestamps.Length - 1] - data.timestamps[data.timestamps.Length - 2] < TimeSpan.FromMinutes(1))) + //&& (data.timestamps[data.timestamps.Length - 1] - data.timestamps[data.timestamps.Length - 2] < TimeSpan.FromMinutes(1)) + ) { var fullData = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromMinutes(60)); if (fullData.isFullIntervalExists) @@ -180,7 +181,7 @@ namespace KLHZ.Trader.Core.Exchange.Services var max = fullData.prices.Max(); var min = fullData.prices.Min(); - if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4) + //if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4) { if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase()) { @@ -209,9 +210,10 @@ namespace KLHZ.Trader.Core.Exchange.Services } else { - await LogDeclision(DeclisionTradeAction.OpenLong, message); + // await LogDeclision(DeclisionTradeAction.OpenLong, message); } } + await LogDeclision(DeclisionTradeAction.OpenLong, message); } } diff --git a/KLHZ.Trader.Service/Controllers/PlayController.cs b/KLHZ.Trader.Service/Controllers/PlayController.cs index f5028b2..1d4c43f 100644 --- a/KLHZ.Trader.Service/Controllers/PlayController.cs +++ b/KLHZ.Trader.Service/Controllers/PlayController.cs @@ -52,33 +52,61 @@ namespace KLHZ.Trader.Service.Controllers } } - [HttpGet] - public async Task LoadTradesToHistory(string figi) - { - try - { - using var context1 = await _dbContextFactory.CreateDbContextAsync(); - context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - var data = await context1.InstrumentTrades - .Where(c => c.Figi == figi) - .OrderBy(c => c.BoughtAt) - .Select(c => new PriceChange() - { - Figi = figi, - Ticker = c.Ticker, - Time = c.BoughtAt, - Value = c.Price, - IsHistoricalData = true - }) - .ToArrayAsync(); - await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); - await context1.PriceChanges.AddRangeAsync(data); - await context1.SaveChangesAsync(); - } - catch (Exception ex) - { + ////[HttpGet] + //public async Task LoadTradesToHistory(string figi) + //{ + // try + // { + // using var context1 = await _dbContextFactory.CreateDbContextAsync(); + // context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + // var data = await context1.InstrumentTrades + // .Where(c => c.Figi == figi) + // .OrderBy(c => c.BoughtAt) + // .Select(c => new PriceChange() + // { + // Figi = figi, + // Ticker = c.Ticker, + // Time = c.BoughtAt, + // Value = c.Price, + // IsHistoricalData = true + // }) + // .ToArrayAsync(); + // await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); + // await context1.PriceChanges.AddRangeAsync(data); + // await context1.SaveChangesAsync(); + // } + // catch (Exception ex) + // { - } - } + // } + //} + ////[HttpGet] + //public async Task LoadTradesToHistory(string figi) + //{ + // try + // { + // using var context1 = await _dbContextFactory.CreateDbContextAsync(); + // context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + // var data = await context1.InstrumentTrades + // .Where(c => c.Figi == figi) + // .OrderBy(c => c.BoughtAt) + // .Select(c => new PriceChange() + // { + // Figi = figi, + // Ticker = c.Ticker, + // Time = c.BoughtAt, + // Value = c.Price, + // IsHistoricalData = true + // }) + // .ToArrayAsync(); + // await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); + // await context1.PriceChanges.AddRangeAsync(data); + // await context1.SaveChangesAsync(); + // } + // catch (Exception ex) + // { + + // } + //} } }