[+] 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:
uv \
venv \
-p 3.13 \
$(UV_ARGS) \
--seed \
$(ENV_PATH)

@ -1,12 +1,19 @@
import asyncio
import datetime
import logging
# import os
from ..tickers_retrieval.emcont import Emcont
from ..tickers.models import Ticker
from ..tickers.settings import Settings as ModelsSettings
from ..tickers.logic import ticker_store_multiple
import sqlalchemy.ext.asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import Any
logger = logging.getLogger(__name__)
async def run() -> None:
engine = sqlalchemy.ext.asyncio.create_async_engine(
ModelsSettings.singleton().db_url
@ -15,8 +22,27 @@ async def run() -> None:
engine
)
async def store_cb(rates: Any, timestamp: Any, session: Any) -> None:
print(rates, timestamp.isoformat())
async def store_cb(
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(
only_symbols={'EURUSD', 'USDJPY', 'GBPUSD', 'AUDUSD', 'USDCAD'},
@ -25,4 +51,5 @@ async def run() -> None:
)
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
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',
)
]
@pydantic.computed_field
def value(self) -> decimal.Decimal:
return (self.ask + self.bid) / 2
product_type: Annotated[
str,
pydantic.Field(
alias='ProductType',
)
]
rates: Annotated[
list[rate_t],
pydantic.Field(