Добавил режимы торговли
test / deploy_trader_prod (push) Successful in 3m54s
Details
test / deploy_trader_prod (push) Successful in 3m54s
Details
parent
6643549a93
commit
8b38421be4
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue