Смена источника данных + обновление стратегии
test / deploy_trader_prod (push) Successful in 1m57s Details

dev
vlad zverzhkhovskiy 2025-09-08 15:41:18 +03:00
parent f7e6b8080b
commit 8bfcb1968d
4 changed files with 101 additions and 17 deletions

View File

@ -5,8 +5,8 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
{ {
public class PriceHistoryCacheUnit2 : IPriceHistoryCacheUnit public class PriceHistoryCacheUnit2 : IPriceHistoryCacheUnit
{ {
public const int CacheMaxLength = 500; public const int CacheMaxLength = 1500;
private const int _arrayMaxLength = 1500; private const int _arrayMaxLength = 5000;
public string Figi { get; init; } public string Figi { get; init; }

View File

@ -95,7 +95,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
await ProcessDeferredLongCloses(message, currentTime); await ProcessDeferredLongCloses(message, currentTime);
if (message.Figi == "FUTIMOEXF000") if (message.Figi == "FUTIMOEXF000")
{ {
var windowMaxSize = 100; var windowMaxSize = 1000;
var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize); var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize);
var state = ExchangeScheduler.GetCurrentState(message.Time); var state = ExchangeScheduler.GetCurrentState(message.Time);
@ -182,26 +182,80 @@ namespace KLHZ.Trader.Core.Exchange.Services
if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4) if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4)
{ {
var trade = new DeferredTrade() if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase())
{ {
var accounts = _tradeDataProvider.Accounts
.Where(a => !a.Value.Assets.ContainsKey(message.Figi))
.ToArray();
foreach (var acc in accounts)
{
if (IsBuyAllowed(acc.Value, message.Value, 1, _accountCashPartFutures, _accountCashPart))
{
if (RandomNumberGenerator.GetInt32(100) > 50)
{
await _dataBus.Broadcast(new TradeCommand()
{
AccountId = acc.Value.AccountId,
Figi = message.Figi, Figi = message.Figi,
Price = message.Value, CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketBuy,
Time = message.Time.AddSeconds(15) Count = 1,
}; RecomendPrice = null,
DeferredLongOpens[message.Figi] = trade; });
}
await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
}
}
else
{
await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
} }
} }
} }
if ((res & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd) if ((res & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
{ {
var trade = new DeferredTrade() var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi);
if (!message.IsHistoricalData && BotModeSwitcher.CanSell())
{ {
var assetsForClose = _tradeDataProvider.Accounts
.SelectMany(a => a.Value.Assets.Values)
.Where(a => a.Figi == message.Figi && a.Count > 0)
.ToArray();
foreach (var asset in assetsForClose)
{
var profit = 0m;
if (assetType == AssetType.Common && asset.Count > 0)
{
profit = TradingCalculator.CaclProfit(asset.BoughtPrice, message.Value,
GetComission(assetType), 1, false);
}
if (assetType == AssetType.Futures)
{
profit = TradingCalculator.CaclProfit(asset.BoughtPrice, message.Value,
GetComission(assetType), GetLeverage(message.Figi, asset.Count < 0), asset.Count < 0);
}
if (profit > 0)
{
await _dataBus.Broadcast(new TradeCommand()
{
AccountId = asset.AccountId,
Figi = message.Figi, Figi = message.Figi,
Price = message.Value, CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketSell,
Time = message.Time.AddSeconds(15) Count = (long)asset.Count,
}; RecomendPrice = null,
DeferredLongCloses[message.Figi] = trade; });
await LogDeclision(DeclisionTradeAction.CloseLong, message, profit);
}
}
}
else
{
await LogDeclision(DeclisionTradeAction.CloseLong, message);
}
} }
} }

View File

@ -392,7 +392,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
buffer2.Add(dec); buffer2.Add(dec);
} }
if ((buffer1.Count + buffer2.Count) > 10000 || _forSave.Reader.Count == 0) if ((buffer1.Count + buffer2.Count) > 50000 || _forSave.Reader.Count == 0)
{ {
using var context = await _dbContextFactory.CreateDbContextAsync(); using var context = await _dbContextFactory.CreateDbContextAsync();
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

View File

@ -1,6 +1,7 @@
using KLHZ.Trader.Core.Contracts.Messaging.Dtos; using KLHZ.Trader.Core.Contracts.Messaging.Dtos;
using KLHZ.Trader.Core.Contracts.Messaging.Interfaces; using KLHZ.Trader.Core.Contracts.Messaging.Interfaces;
using KLHZ.Trader.Core.DataLayer; using KLHZ.Trader.Core.DataLayer;
using KLHZ.Trader.Core.DataLayer.Entities.Prices;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -24,7 +25,7 @@ namespace KLHZ.Trader.Service.Controllers
{ {
try try
{ {
var time = DateTime.UtcNow.AddHours(-4); var time = DateTime.UtcNow.AddDays(-40);
using var context1 = await _dbContextFactory.CreateDbContextAsync(); using var context1 = await _dbContextFactory.CreateDbContextAsync();
context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var data = await context1.PriceChanges var data = await context1.PriceChanges
@ -50,5 +51,34 @@ 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)
{
}
}
} }
} }