diff --git a/KLHZ.Trader.Core.Tests/HistoryCacheUnit3Tests.cs b/KLHZ.Trader.Core.Tests/HistoryCacheUnit3Tests.cs index 0fc8b18..194779e 100644 --- a/KLHZ.Trader.Core.Tests/HistoryCacheUnit3Tests.cs +++ b/KLHZ.Trader.Core.Tests/HistoryCacheUnit3Tests.cs @@ -5,16 +5,16 @@ namespace KLHZ.Trader.Core.Tests { public class HistoryCacheUnit3Tests { - private static PriceChange[] GetHistory(int count, string figi) + private static Trade[] GetHistory(int count, string figi) { - var res = new PriceChange[count]; + var res = new Trade[count]; if (count != 0) { var startDt = DateTime.UtcNow.AddSeconds(-count); for (int i = 0; i < count; i++) { startDt = startDt.AddSeconds(1); - res[i] = new PriceChange() + res[i] = new Trade() { Figi = figi, Ticker = figi + "_ticker", diff --git a/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs b/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs deleted file mode 100644 index a69d3ec..0000000 --- a/KLHZ.Trader.Core/DataLayer/Entities/Orders/OrderbookItem.cs +++ /dev/null @@ -1,32 +0,0 @@ -using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; -using KLHZ.Trader.Core.DataLayer.Entities.Orders.Enums; -using System.ComponentModel.DataAnnotations.Schema; - -namespace KLHZ.Trader.Core.DataLayer.Entities.Orders -{ - [Table("orderbook_items")] - public class OrderbookItem : 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/Entities/Experiments/ExperimentsResult.cs b/KLHZ.Trader.Core/DataLayer/Entities/Prices/ExperimentsResult.cs similarity index 100% rename from KLHZ.Trader.Core/DataLayer/Entities/Experiments/ExperimentsResult.cs rename to KLHZ.Trader.Core/DataLayer/Entities/Prices/ExperimentsResult.cs diff --git a/KLHZ.Trader.Core/DataLayer/Entities/Prices/PriceChange.cs b/KLHZ.Trader.Core/DataLayer/Entities/Prices/PriceChange.cs deleted file mode 100644 index 80e35b6..0000000 --- a/KLHZ.Trader.Core/DataLayer/Entities/Prices/PriceChange.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations.Schema; - -namespace KLHZ.Trader.Core.DataLayer.Entities.Prices -{ - [Table("price_changes")] - public class PriceChange : Trade - { - - } -} diff --git a/KLHZ.Trader.Core/DataLayer/Entities/Prices/ProcessedPrice.cs b/KLHZ.Trader.Core/DataLayer/Entities/Prices/ProcessedPrice.cs deleted file mode 100644 index 3113060..0000000 --- a/KLHZ.Trader.Core/DataLayer/Entities/Prices/ProcessedPrice.cs +++ /dev/null @@ -1,45 +0,0 @@ -using KLHZ.Trader.Core.Contracts.Messaging.Dtos; -using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; -using System.ComponentModel.DataAnnotations.Schema; - -namespace KLHZ.Trader.Core.DataLayer.Entities.Prices -{ - [Table("experiment_results")] - public class ProcessedPrice : IProcessedPrice - { - [Column("id")] - public long Id { get; set; } - - [Column("time")] - public DateTime Time { get; set; } - - [Column("value")] - public decimal Price { get; set; } - - [Column("figi")] - public required string Figi { get; set; } - - [Column("ticker")] - public required string Ticker { get; set; } - - public bool IsHistoricalData { get; set; } - - [Column("processor")] - public required string Processor { get; set; } - - [NotMapped] - public long Count { get; set; } - - [NotMapped] - public int Direction { get; set; } - - [NotMapped] - public decimal Value { get; set; } - - [NotMapped] - public decimal Value2 { get; set; } - - [NotMapped] - public AttachedInfo? AttachedInfo { get; private set; } - } -} diff --git a/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs b/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs index 8d1f5ae..8b7c966 100644 --- a/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs +++ b/KLHZ.Trader.Core/DataLayer/TraderDbContext.cs @@ -10,9 +10,7 @@ namespace KLHZ.Trader.Core.DataLayer { public DbSet Declisions { get; set; } public DbSet Trades { get; set; } - //public DbSet PriceChanges { get; set; } - public DbSet ProcessedPrices { get; set; } - public DbSet OrderbookItems { get; set; } + public DbSet ExperimentsResults { get; set; } public DbSet OrderbookElements { get; set; } public TraderDbContext(DbContextOptions options) : base(options) @@ -32,16 +30,6 @@ namespace KLHZ.Trader.Core.DataLayer v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); }); - //modelBuilder.Entity(entity => - //{ - // entity.HasKey(e1 => e1.Id); - // entity.Ignore(e1 => e1.IsHistoricalData); - // entity.Property(e => e.Time) - // .HasConversion( - // v => v.ToUniversalTime(), - // v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); - //}); - modelBuilder.Entity(entity => { entity.HasKey(e1 => new { e1.Time, e1.Id }); @@ -54,7 +42,7 @@ namespace KLHZ.Trader.Core.DataLayer v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); }); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.HasKey(e1 => new { e1.Time, e1.Id }); entity.Ignore(e1 => e1.IsHistoricalData); @@ -66,15 +54,6 @@ 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 => new { e1.Time, e1.Id }); @@ -85,16 +64,6 @@ namespace KLHZ.Trader.Core.DataLayer v => v.ToUniversalTime(), v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); }); - - //modelBuilder.Entity(entity => - //{ - // entity.HasKey(e1 => e1.Id); - // entity.Ignore(e1 => e1.IsHistoricalData); - // entity.Property(e => e.Time) - // .HasConversion( - // v => v.ToUniversalTime(), - // v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); - //}); } } } diff --git a/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs b/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs index 7303384..7aafab8 100644 --- a/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs @@ -137,7 +137,7 @@ namespace KLHZ.Trader.Core.Exchange.Services SubscribeOrderBookRequest = bookRequest }); - var lastUpdateDict = new Dictionary(); + var lastUpdateDict = new Dictionary(); var pricesBuffer = new List(); var orderbookItemsBuffer = new List(); var lastWrite = DateTime.UtcNow; diff --git a/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs b/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs index a4801bb..111ac96 100644 --- a/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs +++ b/KLHZ.Trader.Core/Exchange/Services/TraderDataProvider.cs @@ -1,4 +1,5 @@ -using KLHZ.Trader.Core.Contracts.Messaging.Dtos; +using Google.Protobuf.WellKnownTypes; +using KLHZ.Trader.Core.Contracts.Messaging.Dtos; using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; using KLHZ.Trader.Core.DataLayer; using KLHZ.Trader.Core.DataLayer.Entities.Declisions; @@ -10,6 +11,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Collections.Concurrent; +using System.Diagnostics; using System.Threading.Channels; using Tinkoff.InvestApi; using AssetType = KLHZ.Trader.Core.Exchange.Models.AssetsAccounting.AssetType; @@ -167,13 +169,13 @@ namespace KLHZ.Trader.Core.Exchange.Services { return _assetTypesCache.TryGetValue(figi, out var t) ? t : AssetType.Unknown; } - internal async Task LogPrice(ProcessedPrice price, bool saveImmediately) + internal async Task LogPrice(ExperimentsResult price, bool saveImmediately) { if (saveImmediately) { using var context = await _dbContextFactory.CreateDbContextAsync(); context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - await context.ProcessedPrices.AddRangeAsync(price); + await context.ExperimentsResults.AddRangeAsync(price); await context.SaveChangesAsync(); } else @@ -198,7 +200,7 @@ namespace KLHZ.Trader.Core.Exchange.Services internal async Task LogPrice(ITradeDataItem message, string processor, decimal value) { - await LogPrice(new ProcessedPrice() + await LogPrice(new ExperimentsResult() { Figi = message.Figi, Ticker = message.Ticker, @@ -210,7 +212,7 @@ namespace KLHZ.Trader.Core.Exchange.Services internal async Task LogPrice(string figi, string ticker, DateTime time, decimal value, string processor) { - await LogPrice(new ProcessedPrice() + await LogPrice(new ExperimentsResult() { Figi = figi, Ticker = ticker, @@ -222,6 +224,15 @@ namespace KLHZ.Trader.Core.Exchange.Services internal async Task LogDeclision(DeclisionTradeAction action, ITradeDataItem message, decimal? profit = null) { + await LogPrice(new ExperimentsResult() + { + Figi = message.Figi, + Ticker = message.Ticker, + Processor = action.ToString(), + Time = message.Time, + Price = message.Price, + }, false); + await LogDeclision(new Declision() { AccountId = string.Empty, @@ -250,14 +261,14 @@ namespace KLHZ.Trader.Core.Exchange.Services private async Task WritePricesTask() { - var buffer1 = new List(); + var buffer1 = new List(); var buffer2 = new List(); while (await _forSave.Reader.WaitToReadAsync()) { try { var obj = await _forSave.Reader.ReadAsync(); - if (obj is ProcessedPrice price) + if (obj is ExperimentsResult price) { buffer1.Add(price); } @@ -271,7 +282,7 @@ namespace KLHZ.Trader.Core.Exchange.Services context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; if (buffer1.Count > 0) { - await context.ProcessedPrices.AddRangeAsync(buffer1); + await context.ExperimentsResults.AddRangeAsync(buffer1); } if (buffer2.Count > 0) { diff --git a/KLHZ.Trader.Core/Exchange/Utils/TraderUtils.cs b/KLHZ.Trader.Core/Exchange/Utils/TraderUtils.cs index 637cf6a..92d84f1 100644 --- a/KLHZ.Trader.Core/Exchange/Utils/TraderUtils.cs +++ b/KLHZ.Trader.Core/Exchange/Utils/TraderUtils.cs @@ -76,7 +76,7 @@ namespace KLHZ.Trader.Core.Exchange.Utils } else { - message = new PriceChange() + message = new Trade() { Figi = message.Figi, Ticker = message.Ticker, diff --git a/KLHZ.Trader.Service/Controllers/PlayController.cs b/KLHZ.Trader.Service/Controllers/PlayController.cs index 1b33e2e..3145706 100644 --- a/KLHZ.Trader.Service/Controllers/PlayController.cs +++ b/KLHZ.Trader.Service/Controllers/PlayController.cs @@ -43,7 +43,7 @@ namespace KLHZ.Trader.Service.Controllers var data = new List(); var data2 = new List(); var time2 = time1.AddHours(1); - var orderbooks = await context1.OrderbookItems + var orderbooks = await context1.OrderbookElements .Where(oi => (oi.Figi == figi1 || oi.Figi == figi2) && oi.Time >= time1 && oi.Time < time2) .OrderBy(c => c.Time) .ToArrayAsync(); @@ -77,7 +77,7 @@ namespace KLHZ.Trader.Service.Controllers .OrderByDescending(o => o.Price) .ToList(); - var forRemove = new List(); + var forRemove = new List(); if (asks.Count > 4 || bids.Count > 4) { @@ -124,7 +124,7 @@ namespace KLHZ.Trader.Service.Controllers .Where(i => i.ItemType == Core.DataLayer.Entities.Orders.Enums.OrderbookItemType.Bid) .OrderByDescending(o => o.Price) .ToList(); - var forRemove = new List(); + var forRemove = new List(); if (asks.Count > 4 || bids.Count > 4) { @@ -242,7 +242,7 @@ namespace KLHZ.Trader.Service.Controllers var time = DateTime.UtcNow.AddDays(-shift ?? -7).Date; while (time < DateTime.UtcNow) { - var forSave = new List(); + var forSave = new List(); time = time.AddMinutes(timeStep); var figi1 = "FUTIMOEXF000"; //var figi1 = "BBG004730N88"; @@ -273,7 +273,7 @@ namespace KLHZ.Trader.Service.Controllers if (pricesToSave.Any()) { var p1 = pricesToSave.Last(); - forSave.Add(new Core.DataLayer.Entities.Prices.ProcessedPrice() + forSave.Add(new Core.DataLayer.Entities.Prices.ExperimentsResult() { Figi = p1.Figi, Processor = "support_level_calc", @@ -332,7 +332,7 @@ namespace KLHZ.Trader.Service.Controllers { if (price.Price >= p.left && price.Price <= p.right) { - forSave.Add(new Core.DataLayer.Entities.Prices.ProcessedPrice() + forSave.Add(new Core.DataLayer.Entities.Prices.ExperimentsResult() { Figi = price.Figi, Processor = "support_level", @@ -346,7 +346,7 @@ namespace KLHZ.Trader.Service.Controllers } } - await context1.ProcessedPrices.AddRangeAsync(forSave); + await context1.ExperimentsResults.AddRangeAsync(forSave); await context1.SaveChangesAsync(); } }