Я должен рассчитать вещи для 50 элементов. Каждый из них требует предыдущих 20 элементов. Посмотрите на следующий код:
var klines = _client.GetKlines(bot.Symbol, bot.Interval, limit: 51).Data.SkipLast(1).ToList(); // 50 elements
for (int i = 0; i < klines.Count; i++)
{
var candles = _client.GetKlines(bot.Symbol, bot.Interval, endTime: klines[i].OpenTime, limit: 20).Data;
decimal SMA5 = ExponentialMovingAverage.SMA(candles.TakeLast(5).ToList());
decimal SMA10 = ExponentialMovingAverage.SMA(candles.TakeLast(10).ToList());
decimal SMA20 = ExponentialMovingAverage.SMA(candles.TakeLast(20).ToList());
Console.WriteLine($"OpenTime: {klines[i].OpenTime.ToLocalTime()} | MA5: {decimal.Round(SMA5, 6, MidpointRounding.AwayFromZero)} | MA10: {decimal.Round(SMA10, 6, MidpointRounding.AwayFromZero)} | MA20: {decimal.Round(SMA20, 6, MidpointRounding.AwayFromZero)}");
}
Я извлекаю данные с серверов на каждой итерации с помощью _client.GetKlines
. Самый быстрый способ - получить данные сразу, а затем обработать их. Например, вместо 50 элементов в начале я получу 70, потому что мне не хватает только первых 20 для первого элемента. Остальные элементы содержатся в списке.
Что-то вроде:
var klines = _client.GetKlines(bot.Symbol, bot.Interval, limit: 51 + 20).Data.SkipLast(1).ToList(); // 50 elements + previous 20 for the first element
for (int i = 0 + 20; i < klines.Count; i++)
{
// process elements from the existing records, instead of _client.GetKlines everytime
}
Какой самый быстрый способ сделать это? С точки зрения производительности.
Редактировать: Рабочий код, как я и хотел. Можно ли его оптимизировать больше?
int j = 0;
for (int i = 19; i < klines.Count; i++)
{
var candles = klines.Skip(j).Take(20);
decimal SMA5 = ExponentialMovingAverage.SMA(candles.TakeLast(5).ToList());
decimal SMA10 = ExponentialMovingAverage.SMA(candles.TakeLast(10).ToList());
decimal SMA20 = ExponentialMovingAverage.SMA(candles.TakeLast(20).ToList());
Console.WriteLine($"OpenTime: {klines[i].OpenTime.ToLocalTime()} | MA5: {decimal.Round(SMA5, 6, MidpointRounding.AwayFromZero)} | MA10: {decimal.Round(SMA10, 6, MidpointRounding.AwayFromZero)} | MA20: {decimal.Round(SMA20, 6, MidpointRounding.AwayFromZero)}");
j++;
}