แกแแ แฉแแแ
-
แแแฌแแแ II: แแแแแขแแแ แแ แแฃแแแแแ
แ แแก แแแแแแแแ แแฅ?
แแแจ แแกแ, แแแแ แ แแแฌแแแ. แ แแแแ แช แแแ แ แแแแฌแแ แ, แแแกแจแ แฉแแแ แแแแแแแแแแ แจแแแแแแก:
-
แแแแแ แแแแฌแแ แแ แแแขแแ แ แแแแแแขแ alphavantage-แแกแแแแก aiohttp-แแ แฉแแแแแแแก แกแแญแแ แ แแแแ แฌแแ แขแแแแแแก แแแแฎแแแแแ.
-
แแแแแ แจแแแฅแแแแ แแแแแขแ, แ แแแแแแช แจแแแแ แแแแแก แแแแแชแแแแแก แคแแกแแแแ แฅแแฆแแแแแแแก แจแแกแแฎแแ แแ แแแแแ แแแข แแแคแแ แแแชแแแก.
แแแแ แแ, แแก แแ แแก แแก, แ แแกแแช แฉแแแ แแแแแแแแแแ แแแแแ แแ แแแฅแขแแกแแแแก แแ แคแแฃแกแขแแก แแแแแแแก แแแแแกแแแ แแกแแ, แฉแแแ แแแกแฌแแแแแ แ แแแแ แแแแฌแแ แแ แแแแแขแแแ, แ แแแแแแแช แแแฃแจแแแแแแ แแแแแแแแแก แแแคแแแแแ, แแกแแแ แ แแแแ แแแแฌแแ แแ แแ แซแแแแแแแ (click wrapper), แฉแแแแก แจแแแแฎแแแแแจแ - แฎแแแแ แฌแแกแแแแก แจแแขแงแแแแแแแแแแกแแแแก แแ แแแแแแ, แ แแแแแกแแช แแแแแขแ แแแแแขแ แแแแแก.
แกแแกแฌแแแแ
AlphaVantage แแแแแแขแ
แแแ แแแแ, แแแแแ แแแแฌแแ แแ แแแขแแ แ aiohttp แแแแแแขแ alphavantage-แแก แแแแฎแแแแแแแกแแแแก.
แกแแแแแแ แ
import urllib.parse as urlparse
from io import StringIO
from typing import Any, Dict, List, Union
import aiohttp
import pandas as pd
import stringcase
from loguru import logger
from horton.config import API_ENDPOINT
class AlphaVantageClient:
def __init__(
self,
session: aiohttp.ClientSession,
api_key: str,
api_endpoint: str = API_ENDPOINT,
):
self._query_params = {"datatype": "json", "apikey": api_key}
self._api_endpoint = api_endpoint
self._session = session
@logger.catch
def _format_fields(self, data: Dict[str, Any]) -> Dict[str, Any]:
formatted_data = {}
for field, item in data.items():
formatted_data[stringcase.snakecase(field)] = item
return formatted_data
@logger.catch
async def _construct_query(
self, function: str, to_json: bool = True, **kwargs
) -> Union[Dict[str, Any], str]:
path = "query/"
async with self._session.get(
urlparse.urljoin(self._api_endpoint, path),
params={"function": function, **kwargs, **self._query_params},
) as response:
data = (await response.json()) if to_json else (await response.text())
if to_json:
data = self._format_fields(data)
return data
@logger.catch
async def get_securities(self, state: str = "active") -> List[Dict[str, str]]:
data = await self._construct_query("LISTING_STATUS", state=state, to_json=False)
data = pd.read_csv(StringIO(data))
securities = data.to_dict("records")
for index, security in enumerate(securities):
security = self._format_fields(security)
security["_type"] = "physical"
securities[index] = security
return securities
@logger.catch
async def get_security_overview(self, symbol: str) -> Dict[str, str]:
return await self._construct_query("OVERVIEW", symbol=symbol)
@logger.catch
async def get_historical_data(self, symbol: str) -> Dict[str, Any]:
return await self._construct_query(
"TIME_SERIES_DAILY_ADJUSTED", symbol=symbol, outputsize="full"
)
@logger.catch
async def get_last_price_data(self, symbol: str) -> Dict[str, Any]:
return await self._construct_query("GLOBAL_QUOTE", symbol=symbol)
@logger.catch
async def get_indicator_data(
self, symbol: str, indicator: str, **indicator_options
) -> Dict[str, Any]:
return await self._construct_query(
indicator, symbol=symbol, **indicator_options
)
แกแแแแแแแแแแจแ, แแแกแแแ แงแแแแแคแแ แ แแแแแแแ:
-
AlphaVantage API แกแแแแแแ แแแ แขแแแแ แแ แแแแแแแ แแ แแก แจแแฅแแแแแ, แแแแขแแ แแแแแแฌแงแแแขแ แงแแแแ แแแแฎแแแแ แแ แแแแแแแ แแแแแแฎแแ แชแแแแแแแแ
construct_query
แกแแแแช แแแแแก แแฎแ แแ แแ แแก http แแแ แ. -
แงแแแแ แแแแแแ แก แแแแแขแแ
snake_case
แแแฎแแ แฎแแแฃแแแแแกแแแแก. -
แแแ แแแ, logger.catch แแแคแแ แแแแ แแแแแแ แแ แแแคแแ แแแขแแฃแแ แแแแแแคแแแแชแแแกแแแแก.
PS แแ แแแแแแแฌแงแแแ alphavantage แแแขแแแแก แแแแแแแแ แแแแ แแแแแขแแแ config.yml-แแ แแ แแแ แแแแก แชแแแแแแก แแฅแกแแแ แขแ HORTON_SERVICE_APIKEY
. แฉแแแ แแแฆแแแ แแแขแแแก
CRUD แแแแกแ
แฉแแแ แแแแฅแแแแ แคแแกแแแแ แฅแแฆแแแแแแแก แแแแแฅแชแแ แคแแกแแแแ แฅแแฆแแแแแแแก แจแแกแแฎแแ แแแขแ แแแคแแ แแแชแแแก แจแแกแแแแฎแแ.
แฉแแแ แแแ แแ, แแฅ แแ แแคแ แแก แแฎแกแแ แแ แแ แแก แกแแญแแ แ แแ แแแแแ แกแแแแแ แแแแกแ แกแแแแแแ แแแ แขแแแแ.
get_app ()
แแแแแ แแแแแแแขแแ แคแฃแแฅแชแแ แแแแแแแชแแแก แแแแแฅแขแแก แจแแกแแฅแแแแแแ
แกแแแแแแ แ
import faust
from horton.config import KAFKA_BROKERS
def get_app():
return faust.App("horton", broker=KAFKA_BROKERS)
แฏแแ แฏแแ แแแแ แแแแฅแแแแ แฃแแแ แขแแแแกแ แแแแแแแชแแแก แจแแฅแแแ, แชแแขแ แแแแแแแแแแแ แแแแแคแแ แแแแแแ, แแฃแแชแ แแแแกแแแแแก, แ แแ แแ แแแแแแแแแ, แแฅ
แแแแแแ แ แแแฌแแแ
แคแแกแแแแ แฅแแฆแแแแแแแก แกแแแก แจแแแ แแแแแแกแ แแ แจแแแแฎแแแก แแแแแขแ
app = get_app()
collect_securities_topic = app.topic("collect_securities", internal=True)
@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
pass
แแกแ แ แแ, แฏแแ แแแฆแแแ แคแแฃแกแขแแก แแแแแแแชแแแก แแแแแฅแขแก - แแก แกแแแแแแ แแแ แขแแแแ. แจแแแแแแ, แฉแแแ แแแ แแแแแ แแแชแฎแแแแแ แแแแแก แฉแแแแ แแแแแขแแกแแแแก... แแฅ แฃแแแ แแฆแแแแจแแแก, แ แ แแ แแก แแก, แ แ แแ แแก แจแแแ แแแ แแแแขแ แ แแ แ แแแแ แจแแแซแแแแ แแก แแแแกแฎแแแแแแฃแแแ แแงแแก แแแฌแงแแแแแ.
-
แแแแแแ แแแคแแแจแ, แแฃ แแแแแแ แแแชแแแแ แแฃแกแขแ แแแแแแ แขแแแ, แฏแแแแ แฌแแแแแแแฎแแ
แแแแแ แแฃแแแ. แแแแฃแแแแขแ , แแ แจแแแแซแแแแ แฌแแแแแแฎแแแแแแแแแแแฃแแ แฐแแแ แแแ แ แฃแกแฃแแแ, แกแแแแช แงแแแแแคแแ แ แแกแแแ แกแแแแแแ แแฃแกแขแแ แแ แแก แแกแแฎแฃแแ :) -
แแแ แแแแขแ แ แจแแแ , แ แแแแแแช แกแแแแแแ แแแ แแแ แแ แแก แแฆแฌแแ แแแ faust doc-แจแ, แกแแจแฃแแแแแแก แแแแซแแแแก แแแแแแแแคแแแฃแ แแ แแ แแแแ แแแ แแแแแ แแแแจแ, แ แ แแฅแแ แฃแแแ, แแก แแแจแแแแก แคแแฃแกแขแแก แแแแแแแแแ แแแแก แแแแ แแแฌแแแแแฃแ แแแ แแแแขแ แแแก, แแแแแแแแแ: แจแแแแฎแแ, แจแแแแแแแแก แแแแแขแแแ (แแแแฃแแแกแฎแแแแแ แฌแแจแแ, แแแแ แแ แจแแแแซแแแแ แแแแงแแแแแแแแแแฅแขแฃแ แ ), แแแแแงแแคแแแแก แ แแแแแแแแ แแแแแแ (แฅแฃแแ แแแแแแแแแ, แแแแแแแแแ, แแแแแแแแแแแแแแฃแ แ แแแแจแแแแแแแ แแแแแชแฎแแแแแ faust). -
แแแแแแแ, แแแแแขแก แจแแฃแซแแแ แจแแฅแแแแก แแแ แแฃแแ แแแแ แแแแแแแฃแ แ แฆแแ แแแฃแแแแแแแ, แแฃแแชแ, แแ แแแงแแแ แก แงแแแแแคแ แแก แชแแแกแแฎแแ แแแแแแ แแ แแแ. แแแ แแ แแแแกแ, แแแแแขแแก แ แแแแแแแจแ แแแแแก แแแแแแ แแ แแแ แแแแขแ แแก (แแแแแแแแแ, แแแแแงแแคแแแแก แ แแแแแแแแ แแ แจแแแแแแแแก แแแแแขแแแ) แแแแคแแแฃแ แแชแแ แจแแฃแซแแแแแแแ.
แแ, แ แแแแ แ แจแแแซแแแแ แแแแแแงแฃแ แแแแแแก แแแแแก แฎแแแแ แแแแกแแแฆแแ แแก แแแ แแจแ:
app = get_app()
@app.agent()
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
pass
แแฎแแ แแแแแ แแฆแแฌแแ แแ แ แแก แแแแแแแแแก แฉแแแแ แแแแแขแ :)
app = get_app()
collect_securities_topic = app.topic("collect_securities", internal=True)
@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
async with aiohttp.ClientSession() as session:
async for _ in stream:
logger.info("Start collect securities")
client = AlphaVantageClient(session, API_KEY)
securities = await client.get_securities()
for security in securities:
await SecurityCRUD.update_one(
{"symbol": security["symbol"], "exchange": security["exchange"]}, security, upsert=True
)
yield True
แแกแ แ แแ, แแแแแขแแก แแแกแแฌแงแแกแจแ แฉแแแ แแฎแกแแแ aiohttp แกแแกแแแก แแแแฎแแแแแแแกแแแแก แฉแแแแ แแแแแแขแแก แแแจแแแแแแ. แแแ แแแแ, แแฃแจแแแแก แแแฌแงแแแแกแแก, แ แแแแกแแช แฉแแแแ แแแแแขแ แแแจแแแแฃแแแ, แแแจแแแแ แแแแฎแกแแแแ แกแแกแแ - แแ แแ, แแฃแจแแแแก แแฃแจแแแแแก แแแแแ แแ แแแก แแแแแแแแแแแจแ (แแ แ แแแแแแแแ, แแฃ แแแ แแแแขแ แก แจแแชแแแแ
แจแแแแแแ, แฉแแแ แแแแงแแแแแ แแแแแแก (แฉแแแ แแแแแแกแแแ แจแแขแงแแแแแแแแก _
, แแแแแแแแ แฉแแแ, แแ แแแแแขแจแ, แแ แแแแแแขแแ แแกแแแก แฉแแแแ แแแแแก แจแแขแงแแแแแแแแแแก แจแแแแแ แกแ, แแฃ แแกแแแ แแ แกแแแแแแ แแแแแแแแ แ แแคแกแแขแจแ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แฉแแแแ แชแแแแ แแแแแแแแแ แแแ แฉแแแแกแแแแก. แแกแ, แฉแแแแ แชแแแแแก แจแแแแแ, แฉแแแ แแฌแแ แ แจแแขแงแแแแแแแแก แแแฆแแแแก, แแแฆแแแ แแฅแขแแฃแ แ (get_securities แแแ แฃแแแแก แแฎแแแแ แแแแฃแแแกแฎแแแแแ แแฅแขแแฃแ แก, แแฎแแแแ แแแแแแขแแก แแแแ) แคแแกแแแแ แฅแแฆแแแแแแแก แกแแแก แแ แแแแแฎแแแ แแแก แแแแแชแแแแ แแแแแจแ, แแแแแฌแแแแ แแ แแก แแฃ แแ แ แคแแกแแแแ แฅแแฆแแแแ แแแแแ แขแแแแ แแ แแ แแแแแชแแแแ แแแแแจแ แแแชแแแ, แแฃ แแ แกแแแแแก, แแแจแแ แแก (แฅแแฆแแแแ) แฃแแ แแแแ แแแแแฎแแแแแ.
แแแแแฌแงแแ แฉแแแแ แจแแแแฅแแแแแแ!
> docker-compose up -d
... ะะฐะฟััะบ ะบะพะฝัะตะนะฝะตัะพะฒ ...
> faust -A horton.agents worker --without-web -l info
PS แแแฎแแกแแแแแแแแแ
แแแจแแแแแก แแ แซแแแแแแจแ แฉแแแ แแฃแแฎแแ แแ แคแแฃแกแขแก, แกแแ แฃแแแ แแซแแแก แแแแแแแชแแแก แแแแแฅแขแ แแ แ แ แฃแแแ แแแแแแแแก แแแกแแแ (แแแฃแจแแ แแฃแจแแแ) แแแคแแ แแแชแแแก แแฃแ แแแแแก แแแแแแแแแแ แแแแแก แแแแแแ. แฉแแแ แแแฆแแแ แจแแแแแ แแแแแแแแแแก:
แกแแแแแแ แ
โฦaยตSโ v1.10.4โฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ id โ horton โ
โ transport โ [URL('kafka://localhost:9092')] โ
โ store โ memory: โ
โ log โ -stderr- (info) โ
โ pid โ 1271262 โ
โ hostname โ host-name โ
โ platform โ CPython 3.8.2 (Linux x86_64) โ
โ drivers โ โ
โ transport โ aiokafka=1.1.6 โ
โ web โ aiohttp=3.6.2 โ
โ datadir โ /path/to/project/horton-data โ
โ appdir โ /path/to/project/horton-data/v1 โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
... ะปะพะณะธ, ะปะพะณะธ, ะปะพะณะธ ...
โTopic Partition Setโโโโโโโโโโฌโโโโโโโโโโโโโ
โ topic โ partitions โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค
โ collect_securities โ {0-7} โ
โ horton-__assignor-__leader โ {0} โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโ
แฒชแแชแฎแแแแ!!!
แแแแแ แจแแแฎแแแแ แแแแแงแแคแแแแก แแแแแแแฅแขแก. แ แแแแ แช แแฎแแแแแ, แจแแแฅแแแ แแแแ แกแแฎแแแฌแแแแแแ, แ แแแแแแช แฉแแแ แแแแแกแแฎแแแแ แแแแจแ, แแแแแงแแคแแแแก แแแแฃแแแกแฎแแแแ แ แแแแแแแแ (8, แแฆแแแฃแแ
แแฎแแ แฉแแแ แจแแแแแซแแแ แแแแแแแแแ แกแฎแแ แขแแ แแแแแแแก แคแแแฏแแ แแจแ แแ แแแแแแแแแแแ แชแแ แแแแ แจแแขแงแแแแแแแ แฉแแแแก แแแแแจแ:
> faust -A horton.agents send @collect_securities
{"topic": "collect_securities", "partition": 6, "topic_partition": ["collect_securities", 6], "offset": 0, "timestamp": ..., "timestamp_type": 0}
PS แแแแแงแแแแแแ @
แฉแแแ แแแฉแแแแแแ, แ แแ แฉแแแ แแแแแแแแแ แจแแขแงแแแแแแแแก แแแแแแ แกแแฎแแแฌแแแแแแ "collect_securities".
แแ แจแแแแฎแแแแแจแ, แจแแขแงแแแแแแแ แแแแแแแแ แแ-6 แแแแงแแคแแแแแแจแ - แแแแก แจแแแแฌแแแแ แจแแแแซแแแแ kafdrop-แแ แแแแแกแแแแ localhost:9000
แฉแแแแก แแแแแแจแ แแแแแแแ แแ แแแ แขแแ แแแแแแแก แคแแแฏแแ แแจแ แแแแแกแแแแกแแก แแแแแแแฎแแแ แแแแแแแ แจแแขแงแแแแแแแแก, แ แแแแแแช แแแแแแแแแแแ loguru-แก แแแแแงแแแแแแ:
2020-09-23 00:26:37.304 | INFO | horton.agents:collect_securities:40 - Start collect securities
แฉแแแ แแกแแแ แจแแแแแซแแแ แจแแแฎแแแแ แแแแแแก (Robo3T แแ Studio3T-แแก แแแแแงแแแแแแ) แแ แแแแแแแฎแแ, แ แแ แคแแกแแแแ แฅแแฆแแแแแแ แแ แแก แแแแแชแแแแ แแแแแจแ:
แแ แแ แแแ แแแแแแ แแแ แ แแ แแแแขแแ แแแแแงแแคแแแแแแแ แแแ แแแแ แแแฎแแแก แแแ แแแแขแแ.
แแแแแแแ แแแ แแ แกแแฎแแ แฃแแ - แแแ แแแแ แแแแแขแ แแแแแแ :)
แแแแแขแ แแแแแแ, แแแฃแแแ แฏแแก แแฎแแ แแแแแขแก!
แแแแฎ, แแแขแแแแแ, แฉแแแ แแ แกแขแแขแแแ แแแแแแแแแฃแแ แแแแก แแฎแแแแ 1/3 แแแแแแ แแ, แแแแ แแ แแ แแแแ แแแฃแแแ, แ แแแแแ แแฎแแ แฃแคแ แ แแแแแแ แแฅแแแแ.
แแฎแแ แฉแแแ แแแญแแ แแแแ แแแแแขแ, แ แแแแแแช แแแ แแแแแก แแแขแ แแแคแแ แแแชแแแก แแ แแแแแกแแแก แแแก แแแแแฅแชแแฃแ แแแแฃแแแแขแจแ:
collect_security_overview_topic = app.topic("collect_security_overview", internal=True)
@app.agent(collect_security_overview_topic)
async def collect_security_overview(
stream: StreamT[?],
) -> AsyncIterable[bool]:
async with aiohttp.ClientSession() as session:
async for event in stream:
...
แแแแแแแแ แแก แแแแแขแ แแแแแฃแจแแแแแก แแแคแแ แแแชแแแก แแแแแ แแขแฃแแ แฃแกแแคแ แแฎแแแแแก แจแแกแแฎแแ, แฉแแแ แฃแแแ แแแแฃแแแแแ แแ แฃแกแแคแ แแฎแแแแแก แขแแแแ แ (แกแแแแแแ) แจแแขแงแแแแแแแแจแ. แแ แแแแแแ แคแแฃแกแขแจแ แแ แกแแแแแก
แแ แจแแแแฎแแแแแจแ, แแแแแ แฌแแแแแแ
import faust
class CollectSecurityOverview(faust.Record):
symbol: str
exchange: str
แ แแแแ แช แแฅแแแ แแแแแ แแแฎแแแแ, แคแแฃแกแขแ แแงแแแแแก แแแแแแแก แขแแแแก แแแแขแแชแแแก แจแแขแงแแแแแแแแก แกแฅแแแแก แแฆแกแแฌแแ แแ, แ แแก แแแแแช แแแแแแแแแแแก แแแแ แแฎแแ แแแญแแ แแแ แแแแแแแแฃแ แ แแแ แกแแ แแ แแก
แแแแฃแแ แฃแแแแ แแแแแขแก, แแแแแงแแแแ แขแแแแแ แแ แแแแแแแขแแ:
collect_security_overview_topic = app.topic(
"collect_security_overview", internal=True, value_type=CollectSecurityOverview
)
@app.agent(collect_security_overview_topic)
async def collect_security_overview(
stream: StreamT[CollectSecurityOverview],
) -> AsyncIterable[bool]:
async with aiohttp.ClientSession() as session:
async for event in stream:
logger.info(
"Start collect security [{symbol}] overview", symbol=event.symbol
)
client = AlphaVantageClient(session, API_KEY)
security_overview = await client.get_security_overview(event.symbol)
await SecurityCRUD.update_one({"symbol": event.symbol, "exchange": event.exchange}, security_overview)
yield True
แ แแแแ แช แฎแแแแแ, แแแแแก แแแแชแแแแแแแชแแแก แแแแแแก แแแแแแชแแแ แแฎแแ แแแ แแแแขแ แก แกแฅแแแแ - value_type. แแแ แแ แแแแกแ, แงแแแแแคแแ แ แแ แแ แแ แแแแแ แกแฅแแแแ แแแฐแงแแแแ, แแกแ แ แแ, แแ แแแ แแฎแแแแ แแแ แก แกแฎแแ แ แแแแแ แคแแฅแ แจแ.
แแกแ, แกแแแแแแ แจแแฎแแแ แแ แแก แแแ แแก แแแแแขแแแ แแแขแ แแแคแแ แแแชแแแก แจแแแ แแแแแแก แแแแแขแแแ collect_securites-แแกแแแแก:
....
for security in securities:
await SecurityCRUD.update_one({
"symbol": security["symbol"],
"exchange": security["exchange"]
},
security,
upsert = True,
)
await collect_security_overview.cast(
CollectSecurityOverview(symbol = security["symbol"], exchange = security["exchange"])
)
....
แฉแแแ แแแงแแแแแ แแแ แ แแแแแชแฎแแแแแฃแ แกแฅแแแแก แจแแขแงแแแแแแแแกแแแแก. แแ แจแแแแฎแแแแแจแ แแ แแแแแแแงแแแ .cast แแแแแแ, แ แแแแแ แแ แแแญแแ แแแแ แแแแแขแแกแแแ แจแแแแแก แแแแแแแ, แแแแ แแ แแฆแกแแแแจแแแแแ, แ แแ
-
แแกแแฎแแแแ - แแ แแแแแแแก, แ แแแแแ แจแแแแแก แแ แแแแก. แแฅแแแ แแ แจแแแแซแแแแ แจแแแแแแก แแแแแแแแ แกแฎแแ แแแแแจแ แจแแขแงแแแแแแแแก แกแแฎแแ.
-
แแแแแแแแ - แแ แแแแแแแก, แ แแแแแ แจแแแแแก แแ แแแแก. แแฅแแแ แจแแแแซแแแแ แแแฃแแแแแ แแแแแขแ แแแแแจแ, แ แแแแแแแแแช แฌแแแ แจแแแแแ.
-
แแแแฎแแ - แแแแแแแ แจแแแแแก. แแฅแแแ แจแแแแซแแแแ แแแฃแแแแแ แแแแแขแ แแแแแจแ, แ แแแแแแแแแช แฌแแแ แจแแแแแ.
แแกแ แ แแ, แแก แงแแแแแคแแ แ แแฆแแแแแแแแ แแแแแขแแแแ!
แฒกแแแชแแแแ แแฃแแแ
แแแแ, แ แแกแ แแแฌแแ แแกแแช แแแแแแ แแ แแ แแแฌแแแจแ, แแ แแก แแ แซแแแแแแแ. แ แแแแ แช แฃแแแ แแฆแแแแจแแแ, แคแแฃแกแขแแก แแ แซแแแแแแแ แแ แแก แแแฌแแแแฃแแแแแก แแแ แจแแแ. แกแแแแแแแแแแจแ, แคแแฃแกแขแ แฃแแ แแแแ แแแแญแแแก แฉแแแแก แแแ แแแแฃแ แแ แซแแแแแแก แแแแแก แแแขแแ แคแแแกแก, แ แแแแกแแช แแแฃแแแแแแก -A แแแแแแจแก
แแแก แจแแแแแ, แ แแช แแแแแชแฎแแแแ แแแแแขแแแ
@app.command()
async def start_collect_securities():
"""Collect securities and overview."""
await collect_securities.cast()
แแแ แแแแ, แแฃ แฉแแแ แแแแฃแฌแแแแแ แแ แซแแแแแแแแก แฉแแแแแแแแแแก, แฉแแแแ แแฎแแแ แแ แซแแแแแ แแฅแแแแ แแแกแจแ:
> faust -A horton.agents --help
....
Commands:
agents List agents.
clean-versions Delete old version directories.
completion Output shell completion to be evaluated by the...
livecheck Manage LiveCheck instances.
model Show model detail.
models List all available models as a tabulated list.
reset Delete local table state.
send Send message to agent/topic.
start-collect-securities Collect securities and overview.
tables List available tables.
worker Start worker instance for given app.
แฉแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แแก, แ แแแแ แช แกแฎแแแแ, แแกแ แ แแ, แแแแแ แแแแแขแแแ แแแ Faust Worker แแ แแแแแฌแงแแ แคแแกแแแแ แฅแแฆแแแแแแแก แกแ แฃแแคแแกแแแแแ แแแแแฅแชแแ:
> faust -A horton.agents start-collect-securities
แ แ แแแฎแแแแ แจแแแแแ?
แจแแแแแ แแแฌแแแจแ, แแแ แฉแแแแแ แแแแแขแแแแก แแแแแแแแแก แแแแแงแแแแแแ, แฉแแแ แแแแแแฎแแแแแ แกแแซแแ แแแแแก แแแฅแแแแแแก แแแญแ แแแแก แแแฎแฃแ แแแก แคแแกแแแจแ แแฅแกแขแ แแแแแแก แแแกแแซแแแแแ แฌแแแก แแแแแแแแแแแจแ แแ แแแแแขแแแแก แแแจแแแแ.
แแฆแแแกแแแแก แกแฃแ แแกแแ! แฒแแแแแแ แฌแแแแแฎแแแกแแแแก :)
PS แแแแ แแแฌแแแจแ แแแแแฎแแก แคแแฃแกแขแแกแ แแ แจแแ แฌแงแแแก แแแคแแแแ (
แฌแงแแ แ: www.habr.com