Агрегировать объемы по ценам

Страницы: 1
RSS
Агрегировать объемы по ценам
 
Хочу агрегировать объемы по ценам. Получаю из таблицы обезличенных сделок  нужные параметры, считаю текущий объем, вывожу в таблицу-рассчитанный объем в моей таблице соответствует строке таблицы обезличенных сделок на 1-2 секунды, т.е. выводится корректно, но как агрегировать прошедшие объемы по одной цене в определенном ценовом диапазоне- загадка. Есть у кого-то такой опыт?  
 
Александр,  это просто гистограмма, лежащая на боку. Режете диапазон цен на сколько-то кусков, по цене тика смотрите, в какой кусок он попал, и в этом куске добавляете объем тика.
 
Просто кластиеризуйте ценовой диапазон.

Для примера кластер в 10 рублей.

цена 127 - это целое(127/10)*10 = 120
цена 144 - это 140
цена 142 - это 140

и т.д. Тогда сумма объемов на одинаковых кластерах и даст нужный результат.

По сути - это та же задача, когда необходимо привести цену ордера к шагу цены инструмента.
 
Nikolay,уточните, пожалуйста, пару моментов:
1.В Вашем примере нужно изначально разбить дневной ценовой диапазон на шаги цены 120-130,130-140, 140-150 и туда загонять объемы? А если, к примеру, я торгую фьюч на нефть с шагом 0.01?
2.В итоге получаются суммарные объемы ценовых диапазонов 120-130 или 130-140?А как получить объемы по ценам 123 или 134, например?
Или я Вас не понял?  
 
Изначально разбивать не надо. Это же арифметическая операция (правда можно кеширование сделать, если память есть).

цена 127 - это целое(127/10)*10 = 120
цена 127 стала 120, т.е. период квантования = 10. Значит все числа из диапазона 120-129 становятся 120. А значит и их объем будет для числа 120.

А как получить объемы по ценам 123 или 134?
Если у Вас задача суммировать обемы сделок по каждой цене, то тогда это более простая задача - просто суммировать объемы с одной и той же ценой.

t ] {}
....

t[123] = (t[123] or 0) + deal.qty

t[134] = (t[134] or 0) + deal.qty


И получите таблицу со всеми объемами, где ключ - это цена, а значение - это объем.

Что касается нефти, то я, обычно, такие числа привожу к целому, умножая на 10 в степени разрядности дробной части. А потом уже провожу манипуляции.
 
Nikolay,спасибо, попробую реализовать нечто. )
 
Вот для примера простой скрипт https://github.com/nick-nh/qlua/tree/master/quantScript
 
Nikolay, Что-то я не понял: разве здесь целые есть? Я привожу к шагу цены похожим способом, но несколько "ракообразно": v=tonumber(string.format("%1.0f",v/step))*step;
 
Можно так, а можно просто math.modf

Только в скобках, т.к. функция возвращает два значения - целую часть и дробную часть

int_x = (math.modf(a/b))
 
math.tointeger (x) - если значение x можно преобразовать в целое, возвращает целое. Иначе, возвращает nil.
 
Еще решил написать, мало ли кто не в курсе, что работает целочисленное деление "//": "Целочисленное деление ('//') всегда преобразует свои операнды в integer и дает в результате integer. Преобразование происходит посредством округления операндов в меньшую сторону, как это делает функция math.floor".
 
Да, но округление не нужно в данной операции.
 
Цитата
Nikolay написал:
Да, но округление не нужно в данной операции.
Да это понятно, я так написал для информации, без применения к описанной задаче.
Страницы: 1
Читают тему
Наверх