Есть задача написать дневник на основе входящих сделок в формате JSON. При get запросе получаем массив такого типа
[
{
"symbol": "ORANGE",
"id": 479640841,
"side": "SELL",
"price": "10",
"qty": "2",
"time": 1633371930706
},
{
"symbol": "ORANGE",
"id": 479640941,
"side": "SELL",
"price": "10",
"qty": "1",
"time": 1633371930899
},
{
"symbol": "ORANGE",
"id": 479640952,
"side": "BUY",
"price": "20",
"qty": "3",
"time": 1633371940488
},
{
"symbol": "APPLE",
"id": 193964871,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956055821
},
{
"symbol": "APPLE",
"id": 193964907,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956058086
},
{
"symbol": "APPLE",
"id": 193964908,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956058086
},
{
"symbol": "APPLE",
"id": 193965481,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956074364
},
{
"symbol": "APPLE",
"id": 193967061,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956209504
},
{
"symbol": "APPLE",
"id": 193967211,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956222593
},
{
"symbol": "APPLE",
"id": 193968864,
"side": "BUY",
"price": "15",
"qty": "10",
"time": 1633956403438
},
{
"symbol": "APPLE",
"id": 193969405,
"side": "SELL",
"price": "20",
"qty": "70",
"time": 1633956450685
}
]
Надо написать конструктор, который будет считывать массив объектов и выдавать готовые ордера в другом массиве такого типа
let orders = [
{
symbol: "ORANGE", // конструктор находит в массиве первую сделку ORANGE, записывает в свойство ее id, а потом ищет последующие сделки с ORANGE, пока open (количество апельсинов в позиции) не будет равно 0, будет прибавлять (если SELL) или убавлять (BUY) свойство open
id: 479640841, // id первой сделки по ORANGE
side: "SHORT", // если первой сделкой идет SELL, тогда это позиция в SHORT. Последкющие SELL прибавляют open, а BUY убавляют.
open: 0, // пока размер позиции не равен нулю, считать, что позиция еще не закрыта (2+1-3=0)
profit: -30, // высчитывается профит сделки ("(2*10 + 1*10) - 3*20")
//3*20 это последняя сделка BUY, qty:3 - количество апельсинов. price: 20 - по какой цене выкуплено (BUY)
volume: 3, // количество проданных в залог апельсинов (суммируются все сделки с SELL)
openTime: 1633371930706, // время первой сделки по ORANGE (SELL 2, "id": 479640841)
closedTime: 1633371940488, // время последней сделки по ORANGE (BUY 3, "id": 479640952)
},
{
symbol: "APPLE", // конструктор находит в массиве первую сделку APPLE, записывает в свойство ее id, а потом ищет последующие сделки с APPLE, пока open (количество яблок в позиции) не будет равно 0, будет прибавлять (если BUY) или убавлять (SELL) свойство open
id: 193964871, // id первой сделки по APPLE
side: "LONG", // если первой сделкой идет BUY, тогда это позиция в LONG
open: 0, // пока размер позиции не равен нулю, считать, что позиция еще не закрыта (10+10+10+10+10+10+10-70=0)
profit: 390, // высчитывается профит сделки ("70*20 - (10*15 + 10*15 + 10*15 + 10*15 + 10*15 + 10*15 + 10*15)")
//70*20 это последняя сделка SELL, qty:70 - количество яблок. price: 20 - по какой цене продано (если SELL, или куплено, если BUY)
volume: 70, // количество купленных яблок (суммируются все сделки с BUY)
openTime: 1633956055821, // время первой сделки по APPLE (BUY 10, "id": 193964871)
closedTime: 1633956450685, // время последней сделки по APPLE (SELL 70, "id": 193969405)
},
];
Можно, конечно, сделать все бесконечными if else и циклами, но хотелось бы найти более лаконичное решение.