остановка торговли вообще
test / deploy_trader_prod (push) Successful in 59s
Details
test / deploy_trader_prod (push) Successful in 59s
Details
parent
47e94a5620
commit
bbc1b33d84
|
@ -3,8 +3,11 @@
|
||||||
internal static class Constants
|
internal static class Constants
|
||||||
{
|
{
|
||||||
internal const string _1minCacheKey = "1min";
|
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 _1minSellCacheKey = "1min_sell";
|
||||||
internal const string _1minBuyCacheKey = "1min_buy";
|
internal const string _1minBuyCacheKey = "1min_buy";
|
||||||
|
|
||||||
internal const string BigWindowCrossingAverageProcessor = "Trader_big";
|
internal const string BigWindowCrossingAverageProcessor = "Trader_big";
|
||||||
internal const string SmallWindowCrossingAverageProcessor = "Trader_small";
|
internal const string SmallWindowCrossingAverageProcessor = "Trader_small";
|
||||||
internal const string AreasRelationProcessor = "balancescalc30min";
|
internal const string AreasRelationProcessor = "balancescalc30min";
|
||||||
|
|
|
@ -157,7 +157,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
};
|
};
|
||||||
|
|
||||||
await _tradeDataProvider.AddData(message, TimeSpan.FromHours(7));
|
await _tradeDataProvider.AddData(message, TimeSpan.FromHours(7));
|
||||||
await _eventBus.Broadcast(message);
|
//await _eventBus.Broadcast(message);
|
||||||
|
|
||||||
var exchangeState = ExchangeScheduler.GetCurrentState();
|
var exchangeState = ExchangeScheduler.GetCurrentState();
|
||||||
if (exchangeState == Models.Trading.ExchangeState.ClearingTime
|
if (exchangeState == Models.Trading.ExchangeState.ClearingTime
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
private readonly ConcurrentDictionary<string, TradingMode> TradingModes = new();
|
private readonly ConcurrentDictionary<string, TradingMode> TradingModes = new();
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<string, DateTime> LongOpeningStops = new();
|
private readonly ConcurrentDictionary<string, DateTime> LongOpeningStops = new();
|
||||||
|
private readonly ConcurrentDictionary<string, DateTime> ShortOpeningStops = new();
|
||||||
private readonly ConcurrentDictionary<string, DateTime> LongClosingStops = new();
|
private readonly ConcurrentDictionary<string, DateTime> LongClosingStops = new();
|
||||||
private readonly ConcurrentDictionary<string, DateTime> ShortClosingStops = new();
|
private readonly ConcurrentDictionary<string, DateTime> ShortClosingStops = new();
|
||||||
private readonly ConcurrentDictionary<string, InstrumentSettings> Leverages = new();
|
private readonly ConcurrentDictionary<string, InstrumentSettings> Leverages = new();
|
||||||
|
@ -171,6 +172,63 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Подсчёт торгового баланса по сберу и IMOEXF
|
||||||
|
if (message.Figi == "BBG004730N88" || message.Figi == "FUTIMOEXF000")
|
||||||
|
{
|
||||||
|
if (message.Direction == 1)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (message.Direction == 2)
|
||||||
|
{
|
||||||
|
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 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", (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
|
try
|
||||||
{
|
{
|
||||||
if (timesCache.TryGetValue(message.Figi, out var dt))
|
if (timesCache.TryGetValue(message.Figi, out var dt))
|
||||||
|
@ -195,50 +253,12 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
{
|
{
|
||||||
await LogPrice(message, "trading_mode", (decimal)mode);
|
await LogPrice(message, "trading_mode", (decimal)mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
//continue;
|
|
||||||
#endregion
|
|
||||||
if (message.Figi == "BBG004730N88")
|
|
||||||
{
|
|
||||||
if (message.Direction == 1)
|
|
||||||
{
|
|
||||||
await _tradeDataProvider.AddDataTo5MinuteWindowCache(message.Figi, Constants._1minBuyCacheKey, new Contracts.Declisions.Dtos.CachedValue()
|
|
||||||
{
|
|
||||||
Time = message.Time,
|
|
||||||
Value = (decimal)message.Count
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (message.Direction == 2)
|
|
||||||
{
|
|
||||||
await _tradeDataProvider.AddDataTo5MinuteWindowCache(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;
|
|
||||||
if (su != 0)
|
|
||||||
{
|
|
||||||
await LogPrice(message, "sellsbuysbalance", (sells / su - 0.5m) * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_tradingInstrumentsFigis.Contains(message.Figi))
|
|
||||||
{
|
|
||||||
var currentTime = message.IsHistoricalData ? message.Time : DateTime.UtcNow;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ProcessStops(message, currentTime);
|
ProcessStops(message, currentTime);
|
||||||
var windowMaxSize = 2000;
|
var windowMaxSize = 2000;
|
||||||
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);
|
||||||
await ProcessClearing(data, state, message);
|
|
||||||
|
|
||||||
if (TradingModes[message.Figi] == TradingMode.Stable)
|
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)
|
private void ProcessStops(INewPrice message, DateTime currentTime)
|
||||||
{
|
{
|
||||||
if (LongOpeningStops.TryGetValue(message.Figi, out var dt))
|
if (LongOpeningStops.TryGetValue(message.Figi, out var dt))
|
||||||
|
@ -680,6 +684,13 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
LongClosingStops.TryRemove(message.Figi, out _);
|
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)
|
private async Task LogPrice(INewPrice message, string processor, decimal value)
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace KLHZ.Trader.Service.Controllers
|
||||||
//var figi1 = "BBG004730N88";
|
//var figi1 = "BBG004730N88";
|
||||||
var figi2 = "BBG004730N88";
|
var figi2 = "BBG004730N88";
|
||||||
//var figi2 = "FUTIMOEXF000";
|
//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 time1 = new DateTime(2025, 9, 4, 14, 0, 0, DateTimeKind.Utc);
|
||||||
//var time2 = DateTime.UtcNow.AddMinutes(18);
|
//var time2 = DateTime.UtcNow.AddMinutes(18);
|
||||||
using var context1 = await _dbContextFactory.CreateDbContextAsync();
|
using var context1 = await _dbContextFactory.CreateDbContextAsync();
|
||||||
|
|
Loading…
Reference in New Issue