Добавил режимы торговли
test / deploy_trader_prod (push) Successful in 3m54s Details

dev
vlad zverzhkhovskiy 2025-09-17 16:27:22 +03:00
parent 6643549a93
commit 8b38421be4
1 changed files with 142 additions and 127 deletions

View File

@ -140,127 +140,135 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
var message = await _pricesChannel.Reader.ReadAsync(); var message = await _pricesChannel.Reader.ReadAsync();
#region Ускорение обработки исторических данных при отладке try
if (message.IsHistoricalData)
{ {
await _tradeDataProvider.AddData(message, TimeSpan.FromHours(6)); #region Ускорение обработки исторических данных при отладке
if (!pricesCache.TryGetValue(message.Figi, out var list)) if (message.IsHistoricalData)
{
list = new List<INewPrice>();
pricesCache[message.Figi] = list;
}
list.Add(message);
if ((list.Last().Time - list.First().Time).TotalSeconds < 0.5)
{ {
await _tradeDataProvider.AddData(message, TimeSpan.FromHours(6));
if (!pricesCache.TryGetValue(message.Figi, out var list))
{
list = new List<INewPrice>();
pricesCache[message.Figi] = list;
}
list.Add(message); list.Add(message);
continue;
}
else
{
message = new PriceChange()
{
Figi = message.Figi,
Ticker = message.Ticker,
Count = message.Count,
Direction = message.Direction,
IsHistoricalData = message.IsHistoricalData,
Time = message.Time,
Value = list.Sum(l => l.Value) / list.Count
};
list.Clear();
}
try if ((list.Last().Time - list.First().Time).TotalSeconds < 0.5)
{
if (timesCache.TryGetValue(message.Figi, out var dt))
{ {
if ((message.Time - dt).TotalSeconds > 120) list.Add(message);
continue;
}
else
{
message = new PriceChange()
{
Figi = message.Figi,
Ticker = message.Ticker,
Count = message.Count,
Direction = message.Direction,
IsHistoricalData = message.IsHistoricalData,
Time = message.Time,
Value = list.Sum(l => l.Value) / list.Count
};
list.Clear();
}
try
{
if (timesCache.TryGetValue(message.Figi, out var dt))
{
if ((message.Time - dt).TotalSeconds > 120)
{
timesCache[message.Figi] = message.Time;
TradingModes[message.Figi] = await CalcTradingMode(message);
}
}
else
{ {
timesCache[message.Figi] = message.Time; timesCache[message.Figi] = message.Time;
TradingModes[message.Figi] = await CalcTradingMode(message);
} }
} }
else catch (Exception ex)
{ {
timesCache[message.Figi] = message.Time;
} }
} }
catch(Exception ex) var mode = (decimal)TradingModes[message.Figi];
await LogPrice(message, "trading_mode", 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
{
ProcessStops(message, currentTime);
var windowMaxSize = 2000;
await SellAssetsIfNeed(message);
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)
{
await ProcessNewPriceIMOEXF_Stable(data, state, message, windowMaxSize);
}
else if (TradingModes[message.Figi] == TradingMode.SlowDropping)
{
await ProcessNewPriceIMOEXF_Dropping(data, state, message, windowMaxSize, 3);
}
else if (TradingModes[message.Figi] == TradingMode.Dropping)
{
await ProcessNewPriceIMOEXF_Dropping(data, state, message, windowMaxSize, 6);
}
else
{
await ProcessNewPriceIMOEXF2(data, state, message, windowMaxSize);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при боработке новой цены IMOEXF");
}
} }
} }
catch(Exception e)
await LogPrice(message, "trading_mode", (int)TradingModes[message.Figi]);
//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
{
ProcessStops(message, currentTime);
var windowMaxSize = 2000;
await SellAssetsIfNeed(message);
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)
{
await ProcessNewPriceIMOEXF_Stable(data, state, message, windowMaxSize);
}
else if (TradingModes[message.Figi] == TradingMode.SlowDropping)
{
await ProcessNewPriceIMOEXF_Dropping(data,state,message,windowMaxSize,3);
}
else if (TradingModes[message.Figi] == TradingMode.Dropping)
{
await ProcessNewPriceIMOEXF_Dropping(data, state, message, windowMaxSize, 6);
}
else
{
await ProcessNewPriceIMOEXF2(data, state, message, windowMaxSize);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при боработке новой цены IMOEXF");
}
}
} }
} }
@ -711,23 +719,26 @@ namespace KLHZ.Trader.Core.Exchange.Services
await LogDeclision(DeclisionTradeAction.OpenLong, message); await LogDeclision(DeclisionTradeAction.OpenLong, message);
} }
foreach (var acc in _tradeDataProvider.Accounts) if (!message.IsHistoricalData)
{ {
if (acc.Value.Assets.TryGetValue(message.Figi, out var asset)) foreach (var acc in _tradeDataProvider.Accounts)
{ {
var order = acc.Value.Orders.Values.FirstOrDefault(o => o.Figi == message.Figi && o.Direction == DealDirection.Sell); if (acc.Value.Assets.TryGetValue(message.Figi, out var asset))
if (order == null && asset.Count>0)
{ {
var command = new TradeCommand() var order = acc.Value.Orders.Values.FirstOrDefault(o => o.Figi == message.Figi && o.Direction == DealDirection.Sell);
if (order == null && asset.Count > 0)
{ {
AccountId = asset.AccountId, var command = new TradeCommand()
Figi = message.Figi, {
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.LimitSell, AccountId = asset.AccountId,
Count = (long)asset.Count, Figi = message.Figi,
RecomendPrice = asset.BoughtPrice + 3, CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.LimitSell,
EnableMargin = false, Count = (long)asset.Count,
}; RecomendPrice = asset.BoughtPrice + 3,
await _dataBus.Broadcast(command); EnableMargin = false,
};
await _dataBus.Broadcast(command);
}
} }
} }
} }
@ -845,23 +856,27 @@ namespace KLHZ.Trader.Core.Exchange.Services
await LogDeclision(DeclisionTradeAction.CloseShort, message); await LogDeclision(DeclisionTradeAction.CloseShort, message);
} }
} }
foreach (var acc in _tradeDataProvider.Accounts)
if (!message.IsHistoricalData)
{ {
if (acc.Value.Assets.TryGetValue(message.Figi, out var asset)) foreach (var acc in _tradeDataProvider.Accounts)
{ {
var order = acc.Value.Orders.Values.FirstOrDefault(o => o.Figi == message.Figi && o.Direction == DealDirection.Buy); if (acc.Value.Assets.TryGetValue(message.Figi, out var asset))
if (order == null && asset.Count<0)
{ {
var command = new TradeCommand() var order = acc.Value.Orders.Values.FirstOrDefault(o => o.Figi == message.Figi && o.Direction == DealDirection.Buy);
if (order == null && asset.Count < 0)
{ {
AccountId = asset.AccountId, var command = new TradeCommand()
Figi = message.Figi, {
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.LimitBuy, AccountId = asset.AccountId,
Count = System.Math.Abs((long)asset.Count), Figi = message.Figi,
RecomendPrice = asset.BoughtPrice - step, CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.LimitBuy,
EnableMargin = false, Count = System.Math.Abs((long)asset.Count),
}; RecomendPrice = asset.BoughtPrice - step,
await _dataBus.Broadcast(command); EnableMargin = false,
};
await _dataBus.Broadcast(command);
}
} }
} }
} }