|
|
@@ -0,0 +1,42 @@
|
|
|
+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
|
|
|
+ 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
|
|
|
+ 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()
|