Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.06.2022, 03:27
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

Обработка массива JSON
Есть задача написать дневник на основе входящих сделок в формате 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 и циклами, но хотелось бы найти более лаконичное решение.

Последний раз редактировалось Redline, 24.06.2022 в 20:07. Причина: неправильно вставил json
Ответить с цитированием
  #2 (permalink)  
Старый 24.06.2022, 03:44
Новичок на форуме
Отправить личное сообщение для JSonelove Посмотреть профиль Найти все сообщения от JSonelove
 
Регистрация: 24.06.2022
Сообщений: 1

Пишешь функцию, в ней цикл for (let str of array) и прописываешь все нужные switch case в ней
Ответить с цитированием
  #3 (permalink)  
Старый 24.06.2022, 09:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Redline
volume: "3", // количество проданных в залог апельсинов (суммируются все сделки с SELL)
откуда 3?

volume: "70" откуда 70?

Последний раз редактировалось рони, 24.06.2022 в 09:32.
Ответить с цитированием
  #4 (permalink)  
Старый 24.06.2022, 19:16
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

Сообщение от рони
откуда 3?

volume: "70" откуда 70?

Volume 3 это сумма "id": 479640841 "id": 479640941 (2+1). Так как первым в массиве orange идёт sell - это сделка типа short и суммируется набор позиции со свойством SELL
Volume 70 это сумма первых семи объектов APPLE (10+10+10+10+10+10+10), так как первый объект по apple со свойством BUY это набор позиции в long и суммируются объекты со свойством BUY

Последний раз редактировалось Redline, 24.06.2022 в 19:40.
Ответить с цитированием
  #5 (permalink)  
Старый 24.06.2022, 19:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Redline,
не осилил)))
[{SELL : 2} , {BUY : 1}, {BUY : 3}] суммируется набор позиции со свойством SELL ? с чем суммировать SELL, если SELL в наборе всего 1 раз
Ответить с цитированием
  #6 (permalink)  
Старый 24.06.2022, 19:50
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

Если прям на пальцах, допустим ты покупаешь яблоки на рынке, чтобы перепродать дороже. цель - набрать 70 яблок.
Ходишь по магазину, покупаешь по 10, по 20 штук где дешевле и набираешь 70.
Чтобы завершить сделку, теперь тебе надо продать эти 70 яблок. Все эти действия это и есть массив JSON

Так вот когда у тебя яблок не осталось можно считать сделку завершенной и подвести итоги. Сколько яблок было, какую прибыль получил и тд
Ответить с цитированием
  #7 (permalink)  
Старый 24.06.2022, 19:51
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

Ошибка в массиве, сейчас исправлю
Ответить с цитированием
  #8 (permalink)  
Старый 24.06.2022, 19:58
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

[{SELL : 2} , {SELL : 1}, {BUY : 3}]

В данном примере это Orange сделка типа short. То есть ты берешь 3 (2+1) апельсина в долг и сразу продаешь в надежде, что цена упадет, выкупишь дешевле, а разницу возьмешь себе.

Возможно необязательная инфа. Так, для понимания что в массиве происходит
Ответить с цитированием
  #9 (permalink)  
Старый 24.06.2022, 19:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Redline
Ошибка в массиве, сейчас исправлю
APPLE тоже 80 на 70 -- либо элемент лишний -- либо 80 а не 70
Ответить с цитированием
  #10 (permalink)  
Старый 24.06.2022, 20:01
Аватар для Redline
Интересующийся
Отправить личное сообщение для Redline Посмотреть профиль Найти все сообщения от Redline
 
Регистрация: 27.12.2021
Сообщений: 15

Да, верно. Массив подгонялся для понимания. По факту там крипта)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JSON массив, разбор и обработка. aj-nik Общие вопросы Javascript 2 10.10.2014 18:51
Как достать данные из JSON массива? Dimaz jQuery 15 27.11.2012 21:58
Обработка массива в json delargo Общие вопросы Javascript 2 26.02.2012 14:40
Обработка JSON menangen AJAX и COMET 0 14.05.2011 16:54
jQuery. Обработка ошибок и JSON. mma_mma jQuery 3 19.07.2010 12:10