from __future__ import annotations import dataclasses import typing import cache def main() -> None: raw_prices: list[RawPrice] = cache.get('https://refined-prun.github.io/refined-prices/all.json') markets: list[Market] = [] for price in raw_prices: if (traded := price['AverageTraded7D']) is None or traded < 100: continue if price['Bid'] is None or price['Ask'] is None: continue if (high := price['HighYesterday']) is None or (low := price['LowYesterday']) is None: continue if (high - low) / high < 0.1: continue spread = (price['Ask'] - price['Bid']) / price['Ask'] if spread < 0.15: continue markets.append(Market(price['FullTicker'], bid=price['Bid'], ask=price['Ask'], spread=spread, traded=traded)) markets.sort(key=lambda m: (m.ask - m.bid) * m.traded, reverse=True) print(f'{"mat":^8} {"bid":^5} {"ask":^5} spread {"traded":^7} ') for market in markets: print(f'{market.full_ticker:>8} {market.bid:5} {market.ask:5} {market.spread*100: 5.0f}% {market.traded:7}') class RawPrice(typing.TypedDict): FullTicker: str Bid: float | None Ask: float | None HighYesterday: float | None LowYesterday: float | None AverageTraded7D: float | None # averaged daily traded volume over last 7 days @dataclasses.dataclass(eq=False, slots=True) class Market: full_ticker: str bid: float ask: float spread: float traded: float if __name__ == '__main__': main()