126 lines
4.6 KiB
C#
126 lines
4.6 KiB
C#
using KLHZ.Trader.Core.Contracts.Messaging.Dtos;
|
|
using KLHZ.Trader.Core.Contracts.Messaging.Interfaces;
|
|
using KLHZ.Trader.Core.DataLayer;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace KLHZ.Trader.Service.Controllers
|
|
{
|
|
[ApiController]
|
|
[Route("[controller]/[action]")]
|
|
public class PlayController : ControllerBase
|
|
{
|
|
private readonly IDataBus _dataBus;
|
|
private readonly IDbContextFactory<TraderDbContext> _dbContextFactory;
|
|
|
|
public PlayController(IDataBus dataBus, IDbContextFactory<TraderDbContext> dbContextFactory)
|
|
{
|
|
_dbContextFactory = dbContextFactory;
|
|
_dataBus = dataBus;
|
|
}
|
|
|
|
[HttpGet]
|
|
public async Task Run(string figi)
|
|
{
|
|
try
|
|
{
|
|
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 >= time1 && c.Time <= time2)
|
|
.OrderBy(c => c.Time)
|
|
.Select(c => new NewPriceMessage()
|
|
{
|
|
Figi = figi,
|
|
Ticker = c.Ticker,
|
|
Time = c.Time,
|
|
Value = c.Value,
|
|
IsHistoricalData = true
|
|
})
|
|
.ToArrayAsync();
|
|
|
|
foreach (var mess in data)
|
|
{
|
|
await _dataBus.Broadcast(mess);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
[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,
|
|
|
|
}).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)
|
|
//{
|
|
// 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)
|
|
// {
|
|
|
|
// }
|
|
//}
|
|
}
|
|
}
|