Смена источника данных + обновление стратегии
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 const int CacheMaxLength = 500;
private const int _arrayMaxLength = 1500;
public const int CacheMaxLength = 1500;
private const int _arrayMaxLength = 5000;
public string Figi { get; init; }

View File

@ -95,7 +95,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
await ProcessDeferredLongCloses(message, currentTime);
if (message.Figi == "FUTIMOEXF000")
{
var windowMaxSize = 100;
var windowMaxSize = 1000;
var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize);
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)
{
var trade = new DeferredTrade()
if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase())
{
Figi = message.Figi,
Price = message.Value,
Time = message.Time.AddSeconds(15)
};
DeferredLongOpens[message.Figi] = trade;
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,
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketBuy,
Count = 1,
RecomendPrice = null,
});
}
await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
}
}
else
{
await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
}
}
}
if ((res & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
{
var trade = new DeferredTrade()
var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi);
if (!message.IsHistoricalData && BotModeSwitcher.CanSell())
{
Figi = message.Figi,
Price = message.Value,
Time = message.Time.AddSeconds(15)
};
DeferredLongCloses[message.Figi] = trade;
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,
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketSell,
Count = (long)asset.Count,
RecomendPrice = null,
});
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);
}
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();
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

View File

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