diff --git a/KLHZ.Trader.Core/Exchange/Constants.cs b/KLHZ.Trader.Core/Exchange/Constants.cs index 820facb..90bc641 100644 --- a/KLHZ.Trader.Core/Exchange/Constants.cs +++ b/KLHZ.Trader.Core/Exchange/Constants.cs @@ -3,8 +3,11 @@ internal static class Constants { internal const string _1minCacheKey = "1min"; + internal const string _5minSellCacheKey = "5min_sell"; + internal const string _5minBuyCacheKey = "5min_buy"; internal const string _1minSellCacheKey = "1min_sell"; internal const string _1minBuyCacheKey = "1min_buy"; + internal const string BigWindowCrossingAverageProcessor = "Trader_big"; internal const string SmallWindowCrossingAverageProcessor = "Trader_small"; internal const string AreasRelationProcessor = "balancescalc30min"; diff --git a/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs b/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs index f6997f7..2483b90 100644 --- a/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/ExchangeDataReader.cs @@ -157,7 +157,7 @@ namespace KLHZ.Trader.Core.Exchange.Services }; await _tradeDataProvider.AddData(message, TimeSpan.FromHours(7)); - await _eventBus.Broadcast(message); + //await _eventBus.Broadcast(message); var exchangeState = ExchangeScheduler.GetCurrentState(); if (exchangeState == Models.Trading.ExchangeState.ClearingTime diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index cf4ec48..d6460f2 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -35,6 +35,7 @@ namespace KLHZ.Trader.Core.Exchange.Services private readonly ConcurrentDictionary TradingModes = new(); private readonly ConcurrentDictionary LongOpeningStops = new(); + private readonly ConcurrentDictionary ShortOpeningStops = new(); private readonly ConcurrentDictionary LongClosingStops = new(); private readonly ConcurrentDictionary ShortClosingStops = new(); private readonly ConcurrentDictionary Leverages = new(); @@ -171,38 +172,19 @@ namespace KLHZ.Trader.Core.Exchange.Services } } - try - { - if (timesCache.TryGetValue(message.Figi, out var dt)) - { - if ((message.Time - dt).TotalSeconds > 10) - { - timesCache[message.Figi] = message.Time; - - TradingModes[message.Figi] = await CalcTradingMode(message); - } - } - else - { - timesCache[message.Figi] = message.Time; - } - } - catch (Exception ex) - { - - } - if (TradingModes.TryGetValue(message.Figi, out var mode)) - { - await LogPrice(message, "trading_mode", (decimal)mode); - } - - //continue; #endregion - if (message.Figi == "BBG004730N88") + + #region Подсчёт торгового баланса по сберу и IMOEXF + if (message.Figi == "BBG004730N88" || message.Figi == "FUTIMOEXF000") { if (message.Direction == 1) { - await _tradeDataProvider.AddDataTo5MinuteWindowCache(message.Figi, Constants._1minBuyCacheKey, new Contracts.Declisions.Dtos.CachedValue() + await _tradeDataProvider.AddDataTo5MinuteWindowCache(message.Figi, Constants._5minBuyCacheKey, new Contracts.Declisions.Dtos.CachedValue() + { + Time = message.Time, + Value = (decimal)message.Count + }); + await _tradeDataProvider.AddDataTo1MinuteWindowCache(message.Figi, Constants._1minBuyCacheKey, new Contracts.Declisions.Dtos.CachedValue() { Time = message.Time, Value = (decimal)message.Count @@ -210,35 +192,73 @@ namespace KLHZ.Trader.Core.Exchange.Services } if (message.Direction == 2) { - await _tradeDataProvider.AddDataTo5MinuteWindowCache(message.Figi, Constants._1minSellCacheKey, new Contracts.Declisions.Dtos.CachedValue() + await _tradeDataProvider.AddDataTo5MinuteWindowCache(message.Figi, Constants._5minSellCacheKey, new Contracts.Declisions.Dtos.CachedValue() + { + Time = message.Time, + Value = (decimal)message.Count + }); + await _tradeDataProvider.AddDataTo1MinuteWindowCache(message.Figi, Constants._1minSellCacheKey, new Contracts.Declisions.Dtos.CachedValue() { Time = message.Time, Value = (decimal)message.Count }); - } - var sberSells = await _tradeDataProvider.GetDataFrom5MinuteWindowCache("BBG004730N88", Constants._1minSellCacheKey); - var sberBuys = await _tradeDataProvider.GetDataFrom5MinuteWindowCache("BBG004730N88", Constants._1minBuyCacheKey); - var sells = sberSells.Sum(s => s.Value); - var buys = sberBuys.Sum(s => s.Value); - var su = sells + buys; + + var sberSells5min = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minSellCacheKey); + var sberBuys5min = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._5minBuyCacheKey); + + var sberSells1min = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._1minSellCacheKey); + var sberBuys1min = await _tradeDataProvider.GetDataFrom5MinuteWindowCache(message.Figi, Constants._1minBuyCacheKey); + + var sells5min = sberSells5min.Sum(s => s.Value); + var buys5min = sberBuys5min.Sum(s => s.Value); + var sells1min = sberSells1min.Sum(s => s.Value); + var buys1min = sberBuys1min.Sum(s => s.Value); + + var su = sells5min + buys5min; if (su != 0) { - await LogPrice(message, "sellsbuysbalance", (sells / su - 0.5m) * 2); + await LogPrice(message, "sellsbuysbalance", (sells5min / su - 0.5m) * 2); + await LogPrice(message, "trades_diff", (buys1min + sells1min) / (su)); } - } + + + } + #endregion if (_tradingInstrumentsFigis.Contains(message.Figi)) { var currentTime = message.IsHistoricalData ? message.Time : DateTime.UtcNow; + try + { + if (timesCache.TryGetValue(message.Figi, out var dt)) + { + if ((message.Time - dt).TotalSeconds > 10) + { + timesCache[message.Figi] = message.Time; + TradingModes[message.Figi] = await CalcTradingMode(message); + } + } + else + { + timesCache[message.Figi] = message.Time; + } + } + catch (Exception ex) + { + + } + if (TradingModes.TryGetValue(message.Figi, out var mode)) + { + await LogPrice(message, "trading_mode", (decimal)mode); + } try { ProcessStops(message, currentTime); var windowMaxSize = 2000; var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize); var state = ExchangeScheduler.GetCurrentState(message.Time); - await ProcessClearing(data, state, message); if (TradingModes[message.Figi] == TradingMode.Stable) { @@ -641,22 +661,6 @@ namespace KLHZ.Trader.Core.Exchange.Services } } - private async Task ProcessClearing((DateTime[] timestamps, decimal[] prices) data, ExchangeState state, INewPrice message) - { - if (state == ExchangeState.ClearingTime - && !message.IsHistoricalData - && data.timestamps.Length > 1 - && (data.timestamps[data.timestamps.Length - 1] - data.timestamps[data.timestamps.Length - 2]) > TimeSpan.FromMinutes(3)) - { - var assets = _portfolioWrapper.Accounts.Values.SelectMany(a => a.Assets.Values).Where(a => a.Figi == message.Figi).ToArray(); - foreach (var a in assets) - { - - } - //await _tradeDataProvider.UpdateFuturesPrice(message, data.prices[data.prices.Length - 2]); - } - } - private void ProcessStops(INewPrice message, DateTime currentTime) { if (LongOpeningStops.TryGetValue(message.Figi, out var dt)) @@ -680,6 +684,13 @@ namespace KLHZ.Trader.Core.Exchange.Services LongClosingStops.TryRemove(message.Figi, out _); } } + if (ShortOpeningStops.TryGetValue(message.Figi, out var dt4)) + { + if (dt4 < currentTime) + { + ShortOpeningStops.TryRemove(message.Figi, out _); + } + } } private async Task LogPrice(INewPrice message, string processor, decimal value) diff --git a/KLHZ.Trader.Service/Controllers/PlayController.cs b/KLHZ.Trader.Service/Controllers/PlayController.cs index 6a59193..9f0958f 100644 --- a/KLHZ.Trader.Service/Controllers/PlayController.cs +++ b/KLHZ.Trader.Service/Controllers/PlayController.cs @@ -34,7 +34,7 @@ namespace KLHZ.Trader.Service.Controllers //var figi1 = "BBG004730N88"; var figi2 = "BBG004730N88"; //var figi2 = "FUTIMOEXF000"; - var time1 = startDate ?? DateTime.UtcNow.AddDays(-17); + var time1 = startDate ?? DateTime.UtcNow.AddDays(-7); //var time1 = new DateTime(2025, 9, 4, 14, 0, 0, DateTimeKind.Utc); //var time2 = DateTime.UtcNow.AddMinutes(18); using var context1 = await _dbContextFactory.CreateDbContextAsync();