| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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()
|