let
// === Буферизация значений из Excel ===
БуферКонтракт = Excel.CurrentWorkbook(){[Name="Позапозапрошлый_контракт"]}[Content]{0}[Column1],
БуферДней = Excel.CurrentWorkbook(){[Name="Дней_для_загрузки"]}[Content]{0}[Column1],
БуферДатаЭксп = Date.From(Excel.CurrentWorkbook(){[Name="Дата_экспирации_позапозапрошлый_контракт"]}[Content]{0}[Column1]),
БуферДнейДоЭксп = Excel.CurrentWorkbook(){[Name="Дней_до_экспирации"]}[Content]{0}[Column1],
// === Присвоение переменных
ТекущийКонтракт = БуферКонтракт,
ДнейДляЗагрузки = БуферДней,
ДатаЭкспирации = БуферДатаЭксп,
ДнейДоЭкспирации = БуферДнейДоЭксп,
// === Расчёт диапазона from/till
ДатаНачальная = Date.AddDays(ДатаЭкспирации, -ДнейДляЗагрузки),
ДатаКонечная = ДатаЭкспирации,
// === Загрузка JSON с MOEX
Source = Json.Document(Web.Contents(
"https://iss.moex.com/iss/history/engines/futures/markets/forts/securities/"
& ТекущийКонтракт
& ".json?from="
& DateTime.ToText(DateTime.From(ДатаНачальная), "yyyy-MM-dd")
& "&till="
& DateTime.ToText(DateTime.From(ДатаКонечная), "yyyy-MM-dd")
)),
// === Преобразование JSON-таблицы
Таблица = Table.FromRows(Source[history][data], Source[history][columns]),
// === Удаление ненужных столбцов только если они существуют
НенужныеСтолбцы = {
"BOARDID", "SECID", "SHORTNAME", "NUMSEC", "OPENPOSITIONVALUE", "VALUE",
"SETTLEPRICE", "SWAPRATE", "WAPRICE", "SETTLEPRICEDAY", "QTY"
},
#"Удаленные столбцы" = Table.RemoveColumns(Таблица, List.Intersect({Table.ColumnNames(Таблица), НенужныеСтолбцы})),
// === Выбор нужных столбцов
ПолезныеСтолбцы = {
"TRADEDATE", "OPEN", "HIGH", "LOW", "CLOSE", "VOLUME", "NUMTRADES", "OPENPOSITION", "CHANGE"
},
СуществующиеПолезные = List.Intersect({Table.ColumnNames(#"Удаленные столбцы"), ПолезныеСтолбцы}),
#"Выбранные столбцы" = Table.SelectColumns(#"Удаленные столбцы", СуществующиеПолезные),
// === Переименование
#"Переименованные столбцы" = Table.RenameColumns(#"Выбранные столбцы", {
{"TRADEDATE", "Дата"}, {"OPEN", "Открытие"}, {"HIGH", "Максимум"},
{"LOW", "Минимум"}, {"CLOSE", "Закрытие"}, {"VOLUME", "Объем"},
{"NUMTRADES", "Кол-во сделок"}, {"OPENPOSITION", "ОИ"},
{"CHANGE", "% изменения"}
}, MissingField.Ignore),
// === Преобразование типов
#"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы", {
{"Открытие", type number}, {"Максимум", type number}, {"Минимум", type number},
{"Закрытие", type number}, {"% изменения", type number}, {"Объем", Int64.Type},
{"Кол-во сделок", Int64.Type}, {"ОИ", Int64.Type}, {"Дата", type date}
}),
// === Определение позиции даты экспирации
ИндексЭкспирации = List.PositionOf(#"Измененный тип"[Дата], ДатаЭкспирации),
ИндексГраницы = ИндексЭкспирации - ДнейДоЭкспирации,
// === Обрезка по экспирации
Результат = if ИндексГраницы >= 0
then Table.FirstN(#"Измененный тип", ИндексГраницы + 1)
else #"Измененный тип"
in
Результат |