Add classmethod to get OHLC on sold for an account.
This commit is contained in:
parent
6c9600e47c
commit
66a635669a
@ -16,7 +16,7 @@
|
|||||||
"""
|
"""
|
||||||
import arrow
|
import arrow
|
||||||
|
|
||||||
from sqlalchemy import func, case, desc
|
from sqlalchemy import func, case, desc, false
|
||||||
|
|
||||||
from accountant import db
|
from accountant import db
|
||||||
|
|
||||||
@ -136,3 +136,61 @@ class Operation(db.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_ohlc_per_day_for_range(cls, session, account, begin=None, end=None):
|
||||||
|
if isinstance(account, int) or isinstance(account, str):
|
||||||
|
account_id = account
|
||||||
|
else:
|
||||||
|
account_id = account.id
|
||||||
|
|
||||||
|
sold = func.sum(cls.value).over(
|
||||||
|
order_by=[cls.operation_date, desc(cls.value), cls.label]
|
||||||
|
)
|
||||||
|
|
||||||
|
previous = sold - cls.value
|
||||||
|
|
||||||
|
subquery = session.query(
|
||||||
|
cls.operation_date,
|
||||||
|
sold.label("sold"),
|
||||||
|
previous.label("previous")
|
||||||
|
).filter(
|
||||||
|
cls.account_id == account_id,
|
||||||
|
cls.canceled == false()
|
||||||
|
).subquery()
|
||||||
|
|
||||||
|
query = session.query(
|
||||||
|
subquery.c.operation_date,
|
||||||
|
func.first_value(subquery.c.previous).over(
|
||||||
|
partition_by=subquery.c.operation_date
|
||||||
|
).label("open"),
|
||||||
|
func.max(
|
||||||
|
func.greatest(
|
||||||
|
subquery.c.previous, subquery.c.sold
|
||||||
|
)
|
||||||
|
).over(
|
||||||
|
partition_by=subquery.c.operation_date
|
||||||
|
).label('high'),
|
||||||
|
func.min(
|
||||||
|
func.least(
|
||||||
|
subquery.c.previous, subquery.c.sold
|
||||||
|
)
|
||||||
|
).over(
|
||||||
|
partition_by=subquery.c.operation_date
|
||||||
|
).label('low'),
|
||||||
|
func.last_value(subquery.c.sold).over(
|
||||||
|
partition_by=subquery.c.operation_date
|
||||||
|
).label('close')
|
||||||
|
).distinct()
|
||||||
|
|
||||||
|
if begin:
|
||||||
|
query = query.filter(subquery.c.operation_date >= str(begin))
|
||||||
|
|
||||||
|
if end:
|
||||||
|
query = query.filter(subquery.c.operation_date <= str(end))
|
||||||
|
|
||||||
|
query = query.order_by(
|
||||||
|
subquery.c.operation_date
|
||||||
|
)
|
||||||
|
|
||||||
|
return query
|
||||||
|
Loading…
Reference in New Issue
Block a user