diff --git a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs index 83debc3..0112677 100644 --- a/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs +++ b/KLHZ.Trader.Core.Math/Declisions/Utils/MovingAverage.cs @@ -71,7 +71,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils if (isCrossing.res) { crossings.Add(i2); - if (crossings.Count == 4 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) + if (crossings.Count == 6 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) { if ((shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) { @@ -81,7 +81,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils for (int crossingShift = 1; crossingShift < crossings.Count - 2; crossingShift++) { var diff = pricesForFinalComparison[crossings[crossingShift]] - pricesForFinalComparison[crossings[crossingShift + 1]]; - if (diff >= 0) + if (diff >= -0.5m) { diffTotal += diff; } diff --git a/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs b/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs index a69d3ec..88ac5ab 100644 --- a/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs +++ b/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs @@ -29,4 +29,30 @@ namespace KLHZ.Trader.Core.DataLayer.Entities.Orders public OrderbookItemType ItemType { get; set; } } + + [Table("orderbook_items_reserve")] + public class OrderbookItemr: IOrderbookItem + { + [Column("id")] + public long Id { get; set; } + + [Column("time")] + public DateTime Time { get; set; } + + [Column("price")] + public decimal Price { get; set; } + + [Column("count")] + public long Count { get; set; } + + [Column("figi")] + public required string Figi { get; set; } + + [Column("ticker")] + public required string Ticker { get; set; } + + [Column("item_type")] + public OrderbookItemType ItemType { get; set; } + + } } diff --git a/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs b/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs index b319583..d3227b6 100644 --- a/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs +++ b/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs @@ -16,6 +16,7 @@ namespace KLHZ.Trader.Core.DataLayer public DbSet ProcessedPrices { get; set; } public DbSet Candles { get; set; } public DbSet OrderbookItems { get; set; } + public DbSet OrderbookItemsReserve { get; set; } public TraderDbContext(DbContextOptions options) : base(options) { @@ -71,6 +72,15 @@ namespace KLHZ.Trader.Core.DataLayer v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); }); + modelBuilder.Entity(entity => + { + entity.HasKey(e1 => e1.Id); + entity.Property(e => e.Time) + .HasConversion( + v => v.ToUniversalTime(), + v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); + }); + modelBuilder.Entity(entity => { entity.HasKey(e1 => e1.Id); diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index d6d577a..f3f1b8f 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -98,7 +98,7 @@ namespace KLHZ.Trader.Core.Exchange.Services var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize); var state = ExchangeScheduler.GetCurrentState(message.Time); await ProcessClearing(data, state, message); - await SellOldAssetsIfCan(message); + //await SellOldAssetsIfCan(message); ProcessOpeningStops(message, currentTime); await ProcessNewPriceIMOEXF(data, state, message, windowMaxSize); diff --git a/KLHZ.Trader.Service/Controllers/PlayController.cs b/KLHZ.Trader.Service/Controllers/PlayController.cs index 9dc2761..c99f958 100644 --- a/KLHZ.Trader.Service/Controllers/PlayController.cs +++ b/KLHZ.Trader.Service/Controllers/PlayController.cs @@ -24,11 +24,12 @@ namespace KLHZ.Trader.Service.Controllers { try { - var time = DateTime.UtcNow.AddDays(-7); + var time1 = DateTime.UtcNow.AddDays(-7); + var time2 = DateTime.UtcNow.AddMinutes(-30); using var context1 = await _dbContextFactory.CreateDbContextAsync(); context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var data = await context1.PriceChanges - .Where(c => c.Figi == figi && c.Time >= time) + .Where(c => c.Figi == figi && c.Time >= time1 && c.Time <= time2) .OrderBy(c => c.Time) .Select(c => new NewPriceMessage() { @@ -51,38 +52,47 @@ namespace KLHZ.Trader.Service.Controllers } } - //[HttpGet] - //public async Task LoadTradesToHistory() - //{ - // 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 = c.Figi, - // Ticker = c.Ticker, - // Time = c.BoughtAt, - // Value = c.Price, - // IsHistoricalData = true, - // Count = (long)c.Count, - // Direction = (int)c.Direction, + [HttpGet] + public async Task LoadTradesToHistory() + { + try + { + using var context1 = await _dbContextFactory.CreateDbContextAsync(); + context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + var data = await context1.OrderbookItemsReserve + //.Where(c => c.Figi == figi) + //.OrderBy(c => c.BoughtAt) + .ToArrayAsync(); + data = data.DistinctBy(d => new { d.Figi, d.Time, d.ItemType}).ToArray(); + //await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); + var data2 = data.Select(d => new Core.DataLayer.Entities.Orders.OrderbookItem() + { + Figi = d.Figi, + Time = d.Time, + ItemType = d.ItemType, + Ticker = d.Ticker, + Count = d.Count, + Price = d.Price, - // }) - // .ToArrayAsync(); - // data = data.DistinctBy(d => new { d.Figi, d.Time }).ToArray(); - // //await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); - // await context1.PriceChanges.AddRangeAsync(data); - // await context1.SaveChangesAsync(); - // } - // catch (Exception ex) - // { + }).ToArray(); + int count = 0; + foreach(var mess in data2) + { + count++; + await context1.OrderbookItems.AddAsync(mess); + if (count > 10000) + { + await context1.SaveChangesAsync(); + count = 0; + } + } + await context1.SaveChangesAsync(); + } + catch (Exception ex) + { - // } - //} + } + } ////[HttpGet] //public async Task LoadTradesToHistory(string figi) //{