обновление алгоритма принятия решений + добавление соотношения стакана глубиной 4
test / deploy_trader_prod (push) Successful in 1m3s Details

main
vlad zverzhkhovskiy 2025-09-04 11:57:36 +03:00
parent 6efea45378
commit 21833412d8
10 changed files with 101 additions and 158 deletions

View File

@ -9,5 +9,7 @@
ShortClose = 4, ShortClose = 4,
LongClose = 8, LongClose = 8,
ShortOpen = 16, ShortOpen = 16,
UptrendEnd = 32,
UptrendStart = 64,
} }
} }

View File

@ -9,7 +9,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
/// <summary> /// <summary>
/// Обработка последних интервалов истории изменения цен. /// Обработка последних интервалов истории изменения цен.
/// </summary> /// </summary>
public static class TwoPeriods public static class LocalTrends
{ {
internal static PeriodPricesInfoDto GetPriceDiffForTimeSpan(this IPriceHistoryCacheUnit unit, TimeSpan timeShift, TimeSpan timeSpan, int? pointsShift = null) internal static PeriodPricesInfoDto GetPriceDiffForTimeSpan(this IPriceHistoryCacheUnit unit, TimeSpan timeShift, TimeSpan timeSpan, int? pointsShift = null)
{ {
@ -302,42 +302,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
{ {
var data = unit.GetData().Result; var data = unit.GetData().Result;
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff); var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff);
var trendRelation = CalcTrendRelationAbs(periodStat);
var isStartOk = periodStat.Success && periodStat.DiffStart < -meanfullDiff; var isStartOk = periodStat.Success && periodStat.DiffStart < -meanfullDiff;
var isEndOk = periodStat.Success && periodStat.DiffEnd >= meanfullDiff; var isEndOk = periodStat.Success && periodStat.DiffEnd >= meanfullDiff;
if (isEndOk)
{
}
if (isStartOk)
{
}
if (isEndOk && isStartOk)
{
}
return isStartOk && isEndOk && data.prices[periodStat.Start] - data.prices[periodStat.End] >= meanfullDiff; return isStartOk && isEndOk && data.prices[periodStat.Start] - data.prices[periodStat.End] >= meanfullDiff;
} }
public static TradingEvent Detect(IPriceHistoryCacheUnit data) public static TradingEvent Detect(IPriceHistoryCacheUnit data)
{ {
decimal meanfullDiff; decimal meanfullDiff = 1m;
if (data.Figi == "BBG004730N88")
{
meanfullDiff = 0.05m;
}
else if (data.Figi == "FUTIMOEXF000")
{
meanfullDiff = 1m;
}
else
{
return TradingEvent.None;
}
var res = TradingEvent.None; var res = TradingEvent.None;
//var downtrendStarts = data.CheckDowntrendStarting(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(7), meanfullDiff); //var downtrendStarts = data.CheckDowntrendStarting(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(7), meanfullDiff);

View File

@ -77,10 +77,9 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
{ {
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep) if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep)
{ {
res |= TradingEvent.LongOpen; res |= TradingEvent.UptrendStart;
res |= TradingEvent.ShortClose;
break;
} }
break;
} }
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта // если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
@ -88,10 +87,9 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
{ {
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep) if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep)
{ {
res |= TradingEvent.LongClose; res |= TradingEvent.UptrendEnd;
res |= TradingEvent.ShortOpen;
break;
} }
break;
} }
} }
} }

View File

@ -45,7 +45,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 0; var shift = 0;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -79,7 +79,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 0; var shift = 0;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -114,7 +114,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 1; var shift = 1;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -149,7 +149,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 0; var shift = 0;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -184,7 +184,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 3; var shift = 3;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -219,7 +219,7 @@ namespace KLHZ.Trader.Core.Tests
var periodLength = 4; var periodLength = 4;
var shift = 3; var shift = 3;
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue1 = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength))); var maxValue1 = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
var minValue1 = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift); var minValue1 = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
@ -260,7 +260,7 @@ namespace KLHZ.Trader.Core.Tests
} }
var result2 = TwoPeriods.GetPriceDiffForTimeSpan(unit2, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength)); var result2 = LocalTrends.GetPriceDiffForTimeSpan(unit2, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
var maxValue2 = 100; var maxValue2 = 100;
var minValue2 = -100; var minValue2 = -100;

View File

@ -4,6 +4,7 @@
{ {
Unknown = 0, Unknown = 0,
StopBuy = 1, StopBuy = 1,
StopBuyShortTime = 2,
OpenLong = 100, OpenLong = 100,
CloseLong = 200, CloseLong = 200,
OpenShort = 300, OpenShort = 300,

View File

@ -5,7 +5,9 @@
Unknown = 0, Unknown = 0,
Ask = 1, Ask = 1,
Bid = 2, Bid = 2,
AsksSummary = 3, AsksSummary10 = 3,
BidsSummary = 4 BidsSummary10 = 4,
AsksSummary4 = 5,
BidsSummary4 = 6,
} }
} }

View File

@ -178,34 +178,54 @@ namespace KLHZ.Trader.Core.Exchange.Services
} }
if (response.Orderbook != null) if (response.Orderbook != null)
{ {
var asksSummary = new OrderbookItem() var asksSummary10 = new OrderbookItem()
{ {
Figi = response.Orderbook.Figi, Figi = response.Orderbook.Figi,
Ticker = GetTickerByFigi(response.Orderbook.Figi), Ticker = GetTickerByFigi(response.Orderbook.Figi),
Count = response.Orderbook.Asks.Sum(a => (int)a.Quantity), Count = response.Orderbook.Asks.Sum(a => (int)a.Quantity),
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary, ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary10,
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(), Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
}; };
var bidsSummary = new OrderbookItem() var asksSummary4 = new OrderbookItem()
{
Figi = response.Orderbook.Figi,
Ticker = GetTickerByFigi(response.Orderbook.Figi),
Count = response.Orderbook.Asks.Take(4).Sum(a => (int)a.Quantity),
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary4,
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
};
var bidsSummary10 = new OrderbookItem()
{ {
Figi = response.Orderbook.Figi, Figi = response.Orderbook.Figi,
Ticker = GetTickerByFigi(response.Orderbook.Figi), Ticker = GetTickerByFigi(response.Orderbook.Figi),
Count = response.Orderbook.Bids.Sum(a => (int)a.Quantity), Count = response.Orderbook.Bids.Sum(a => (int)a.Quantity),
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary, ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary10,
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(), Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
}; };
orderbookItemsBuffer.Add(asksSummary); var bidsSummary4 = new OrderbookItem()
orderbookItemsBuffer.Add(bidsSummary); {
Figi = response.Orderbook.Figi,
Ticker = GetTickerByFigi(response.Orderbook.Figi),
Count = response.Orderbook.Bids.Take(4).Sum(a => (int)a.Quantity),
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary4,
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
};
orderbookItemsBuffer.Add(asksSummary4);
orderbookItemsBuffer.Add(asksSummary10);
orderbookItemsBuffer.Add(bidsSummary4);
orderbookItemsBuffer.Add(bidsSummary10);
var message = new NewOrderbookMessage() var message = new NewOrderbookMessage()
{ {
Ticker = GetTickerByFigi(response.Orderbook.Figi), Ticker = GetTickerByFigi(response.Orderbook.Figi),
Figi = response.Orderbook.Figi, Figi = response.Orderbook.Figi,
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(), Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
AsksCount = asksSummary.Count, AsksCount = asksSummary10.Count,
BidsCount = bidsSummary.Count, BidsCount = bidsSummary10.Count,
}; };
await _eventBus.Broadcast(message); await _eventBus.Broadcast(message);
} }

View File

@ -101,25 +101,14 @@ namespace KLHZ.Trader.Core.Exchange.Services
_ = ProcessOrdersbooks(); _ = ProcessOrdersbooks();
} }
private async Task InitStops()
{
using var context = await _dbContextFactory.CreateDbContextAsync();
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var dt = DateTime.UtcNow.AddMinutes(-_buyStopLength);
var stops = await context.Declisions.Where(d => d.Time > dt && d.Action == DeclisionTradeAction.StopBuy).ToArrayAsync();
foreach (var stop in stops)
{
var time = stop.Time.AddMinutes(_buyStopLength);
OpeningStops.TryAdd(stop.Figi, time);
}
}
private async Task ProcessPrices() private async Task ProcessPrices()
{ {
var declisionsForSave = new List<Declision>(); var declisionsForSave = new List<Declision>();
var processedPrices = new List<ProcessedPrice>(); var processedPrices = new List<ProcessedPrice>();
while (await _pricesChannel.Reader.WaitToReadAsync()) while (await _pricesChannel.Reader.WaitToReadAsync())
{ {
var bigWindowProcessor = nameof(Trader) + "_big";
var smallWindowProcessor = nameof(Trader) + "_small";
var message = await _pricesChannel.Reader.ReadAsync(); var message = await _pricesChannel.Reader.ReadAsync();
if (_tradingInstrumentsFigis.Contains(message.Figi)) if (_tradingInstrumentsFigis.Contains(message.Figi))
{ {
@ -149,112 +138,45 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(3); var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(3);
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo); OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
declisionsForSave.Add(new Declision() LogDeclision(declisionsForSave, DeclisionTradeAction.StopBuyShortTime, message);
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Value = 3,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.StopBuy,
});
} }
var result = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 15, 120); var resultLongOpen = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 45, 180, 2.5m);
if (result.bigWindowAv != 0) var resultLongClose = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 15, 120, 2.5m);
if (resultLongOpen.bigWindowAv != 0)
{ {
var priceb = new ProcessedPrice() LogPrice(processedPrices, message, bigWindowProcessor, resultLongOpen.bigWindowAv);
{ LogPrice(processedPrices, message, smallWindowProcessor, resultLongOpen.smallWindowAv);
Figi = message.Figi,
Ticker = message.Ticker,
Processor = nameof(Trader) + "_big",
Time = message.Time,
Value = result.bigWindowAv,
};
var prices = new ProcessedPrice()
{
Figi = message.Figi,
Ticker = message.Ticker,
Processor = nameof(Trader) + "_small",
Time = message.Time,
Value = result.smallWindowAv,
};
processedPrices.Add(priceb);
processedPrices.Add(prices);
} }
if ((result.events & TradingEvent.StopBuy) == TradingEvent.StopBuy) if ((resultLongClose.events & TradingEvent.StopBuy) == TradingEvent.StopBuy)
{ {
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(_buyStopLength); var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(_buyStopLength);
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo); OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
declisionsForSave.Add(new Declision() //LogDeclision(declisionsForSave, DeclisionTradeAction.StopBuy, message);
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Value = (decimal)_buyStopLength,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.StopBuy,
});
} }
if ((result.events & TradingEvent.LongOpen) == TradingEvent.LongOpen if ((resultLongOpen.events & TradingEvent.UptrendStart) == TradingEvent.UptrendStart
&& !OpeningStops.TryGetValue(message.Figi, out _) && !OpeningStops.TryGetValue(message.Figi, out _))
&& ((unit.BidsCount / unit.AsksCount) > 0.5m))
{ {
declisionsForSave.Add(new Declision() LogDeclision(declisionsForSave, DeclisionTradeAction.OpenLong, message);
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.OpenLong,
});
} }
if ((result.events & TradingEvent.LongClose) == TradingEvent.LongClose) if ((resultLongClose.events & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
{ {
declisionsForSave.Add(new Declision() LogDeclision(declisionsForSave, DeclisionTradeAction.CloseLong, message);
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.CloseLong,
});
} }
if ((result.events & TradingEvent.ShortOpen) == TradingEvent.ShortOpen //if ((resultLongOpen.events & TradingEvent.ShortOpen) == TradingEvent.ShortOpen
&& !OpeningStops.TryGetValue(message.Figi, out _) // && !OpeningStops.TryGetValue(message.Figi, out _))
&& (unit.BidsCount / unit.AsksCount < 2)) //{
{ // LogDeclision(declisionsForSave, DeclisionTradeAction.OpenShort, message);
declisionsForSave.Add(new Declision() //}
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.OpenShort,
});
}
if ((result.events & TradingEvent.ShortClose) == TradingEvent.ShortClose) //if ((resultLongOpen.events & TradingEvent.ShortClose) == TradingEvent.ShortClose)
{ //{
declisionsForSave.Add(new Declision() // LogDeclision(declisionsForSave, DeclisionTradeAction.CloseShort, message);
{ //}
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = DeclisionTradeAction.CloseShort,
});
}
if ((!message.IsHistoricalData && (processedPrices.Count > 0 || declisionsForSave.Count > 0)) if ((!message.IsHistoricalData && (processedPrices.Count > 0 || declisionsForSave.Count > 0))
|| (message.IsHistoricalData && ((processedPrices.Count + declisionsForSave.Count > 10000) || _pricesChannel.Reader.Count == 0))) || (message.IsHistoricalData && ((processedPrices.Count + declisionsForSave.Count > 10000) || _pricesChannel.Reader.Count == 0)))
@ -284,6 +206,31 @@ namespace KLHZ.Trader.Core.Exchange.Services
} }
} }
private static void LogPrice(List<ProcessedPrice> prices, INewPrice message, string processor, decimal value)
{
prices.Add(new ProcessedPrice()
{
Figi = message.Figi,
Ticker = message.Ticker,
Processor = processor,
Time = message.Time,
Value = value,
});
}
private static void LogDeclision(List<Declision> declisions, DeclisionTradeAction action, INewPrice message)
{
declisions.Add(new Declision()
{
AccountId = string.Empty,
Figi = message.Figi,
Ticker = message.Ticker,
Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = action,
});
}
private async Task ProcessOrdersbooks() private async Task ProcessOrdersbooks()
{ {
while (await _ordersbookChannel.Reader.WaitToReadAsync()) while (await _ordersbookChannel.Reader.WaitToReadAsync())

View File

@ -24,6 +24,7 @@ namespace KLHZ.Trader.Service.Controllers
{ {
try try
{ {
var time = new DateTime(2025, 9, 3, 13, 5, 0, DateTimeKind.Utc);
using var context1 = await _dbContextFactory.CreateDbContextAsync(); using var context1 = await _dbContextFactory.CreateDbContextAsync();
context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var data = await context1.PriceChanges var data = await context1.PriceChanges
@ -38,7 +39,7 @@ namespace KLHZ.Trader.Service.Controllers
IsHistoricalData = true IsHistoricalData = true
}) })
.ToArrayAsync(); .ToArrayAsync();
//data = data.Where(d=>d.Time> time).ToArray();
foreach (var mess in data) foreach (var mess in data)
{ {
await _dataBus.Broadcast(mess); await _dataBus.Broadcast(mess);

View File

@ -8,7 +8,7 @@
}, },
"LokiUrl": "", "LokiUrl": "",
"ExchangeConfig": { "ExchangeConfig": {
"StopBuyLengthMinuts": 20, "StopBuyLengthMinuts": 15,
"ExchangeDataRecievingEnabled": true, "ExchangeDataRecievingEnabled": true,
"Token": "", "Token": "",
"ManagingAccountNamePatterns": [ "автотрейд 1" ], "ManagingAccountNamePatterns": [ "автотрейд 1" ],