отключение продаж и покупок
test / deploy_trader_prod (push) Has been cancelled Details

dev
vlad zverzhkhovskiy 2025-09-10 09:26:32 +03:00
parent ac32d89ad4
commit 8b217f6cb9
5 changed files with 81 additions and 35 deletions

View File

@ -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;
}

View File

@ -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; }
}
}

View File

@ -16,6 +16,7 @@ namespace KLHZ.Trader.Core.DataLayer
public DbSet<ProcessedPrice> ProcessedPrices { get; set; }
public DbSet<Candle> Candles { get; set; }
public DbSet<OrderbookItem> OrderbookItems { get; set; }
public DbSet<OrderbookItemr> OrderbookItemsReserve { get; set; }
public TraderDbContext(DbContextOptions<TraderDbContext> options)
: base(options)
{
@ -71,6 +72,15 @@ namespace KLHZ.Trader.Core.DataLayer
v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
});
modelBuilder.Entity<OrderbookItemr>(entity =>
{
entity.HasKey(e1 => e1.Id);
entity.Property(e => e.Time)
.HasConversion(
v => v.ToUniversalTime(),
v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
});
modelBuilder.Entity<ProcessedPrice>(entity =>
{
entity.HasKey(e1 => e1.Id);

View File

@ -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);

View File

@ -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)
//{