Войти Регистрация
Фронтенд

92. Средняя цена позиции и прибыль по сделкам в Т‑Инвестициях

Средняя

В портфеле Т‑Инвестиций у бумаги показывают количество, среднюю цену покупки и прибыль по закрытым сделкам. Всё считается в копейках, чтобы не ловить ошибки дробей.

Напишите portfolio(trades). Сделка — { ticker, side, qty, price }, side — 'buy' или 'sell', price — цена одной бумаги в копейках, сделки идут по времени.

Покупка добавляет бумаги и их стоимость. Продажа списывает бумаги и долю стоимости Math.round(cost * qty / held); прибыль сделки — выручка минус эта доля. Средняя цена позиции — Math.round(cost / held), продажа её почти не двигает. Позиция, проданная целиком, пропадает, а следующая покупка считает среднюю заново.

Продажа больше, чем есть, — ошибка RangeError. Вернуть { positions: [[ticker, held, avg], ...] по алфавиту, realized }.

В работе: Экран портфеля: 30 бумаг, 2 000 сделок за год, средняя и прибыль пересчитываются после каждой сделки.

Пример 1: две покупки — средняя

Аргументы теста
[{"ticker": "SBER", "side": "buy", "qty": 10, "price": 30000}, {"ticker": "SBER", "side": "buy", "qty": 30, "price": 26000}]
Ожидается
{"positions": [["SBER", 40, 27000]], "realized": 0}

Пример 2: продажа не меняет среднюю

Аргументы теста
[{"ticker": "SBER", "side": "buy", "qty": 10, "price": 30000}, {"ticker": "SBER", "side": "buy", "qty": 30, "price": 26000}, {"ticker": "SBER", "side": "sell", "qty": 20, "price": 31000}]
Ожидается
{"positions": [["SBER", 20, 27000]], "realized": 80000}
Как проверяем Объявите portfolio — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 8: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function portfolio(trades) // → { positions: [ticker, held, avg][], realized }
объектыMapарифметика в копейках

Источник: на задачах Т‑Банка: портфель в Т‑Инвестициях. Условие пересказано своими словами.