[+] partially add storing of tickers

This commit is contained in:
Siarhei Siniak 2025-07-09 11:12:56 +03:00
parent c8370f96ff
commit 731b9d384a
4 changed files with 50 additions and 2 deletions

@ -22,6 +22,7 @@ venv_compile:
venv: venv:
uv \ uv \
venv \ venv \
-p 3.13 \
$(UV_ARGS) \ $(UV_ARGS) \
--seed \ --seed \
$(ENV_PATH) $(ENV_PATH)

@ -1,12 +1,19 @@
import asyncio import asyncio
import datetime
import logging
# import os # import os
from ..tickers_retrieval.emcont import Emcont from ..tickers_retrieval.emcont import Emcont
from ..tickers.models import Ticker from ..tickers.models import Ticker
from ..tickers.settings import Settings as ModelsSettings from ..tickers.settings import Settings as ModelsSettings
from ..tickers.logic import ticker_store_multiple
import sqlalchemy.ext.asyncio import sqlalchemy.ext.asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import Any from typing import Any
logger = logging.getLogger(__name__)
async def run() -> None: async def run() -> None:
engine = sqlalchemy.ext.asyncio.create_async_engine( engine = sqlalchemy.ext.asyncio.create_async_engine(
ModelsSettings.singleton().db_url ModelsSettings.singleton().db_url
@ -15,8 +22,27 @@ async def run() -> None:
engine engine
) )
async def store_cb(rates: Any, timestamp: Any, session: Any) -> None: async def store_cb(
print(rates, timestamp.isoformat()) rates: list[Emcont.rates_get_t.data_t.rate_t],
timestamp: datetime.datetime,
session: 'async_sessionmaker[AsyncSession]',
) -> None:
await ticker_store_multiple(
session,
[
Ticker(
id=-1,
timestamp=timestamp,
value=rate.value,
)
for rate in rates
]
)
logger.info(dict(
rates=rates,
timestamp=timestamp.isoformat()
))
await Emcont.worker( await Emcont.worker(
only_symbols={'EURUSD', 'USDJPY', 'GBPUSD', 'AUDUSD', 'USDCAD'}, only_symbols={'EURUSD', 'USDJPY', 'GBPUSD', 'AUDUSD', 'USDCAD'},
@ -25,4 +51,5 @@ async def run() -> None:
) )
if __name__ == '__main__': if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
asyncio.run(run()) asyncio.run(run())

@ -0,0 +1,14 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
from .models import Ticker
async def ticker_store_multiple(
session: 'async_sessionmaker[AsyncSession]',
tickers: list[Ticker],
) -> None:
async with session() as active_session:
async with active_session.begin():
active_session.add_all(
tickers,
)

@ -38,12 +38,18 @@ class Emcont:
alias='Ask', alias='Ask',
) )
] ]
@pydantic.computed_field
def value(self) -> decimal.Decimal:
return (self.ask + self.bid) / 2
product_type: Annotated[ product_type: Annotated[
str, str,
pydantic.Field( pydantic.Field(
alias='ProductType', alias='ProductType',
) )
] ]
rates: Annotated[ rates: Annotated[
list[rate_t], list[rate_t],
pydantic.Field( pydantic.Field(