sell.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from __future__ import annotations
  2. import dataclasses
  3. import typing
  4. import cache
  5. from config import config
  6. import market
  7. if typing.TYPE_CHECKING:
  8. import supply
  9. def main() -> None:
  10. raw_prices: typing.Mapping[str, market.RawPrice] = {p['MaterialTicker']: p
  11. for p in cache.get('https://refined-prun.github.io/refined-prices/all.json') if p['ExchangeCode'] == 'IC1'}
  12. planets: typing.Sequence[supply.FIOBurn] = cache.get('https://rest.fnar.net/fioweb/burn/user/' + config.username,
  13. headers={'Authorization': config.fio_api_key})
  14. producing = frozenset(mat['MaterialTicker'] for planet in planets for mat in planet['OrderProduction']
  15. if mat['MaterialTicker'] not in (c['MaterialTicker'] for c in planet['OrderConsumption']))
  16. materials = []
  17. for mat in producing:
  18. price = raw_prices[mat]
  19. if price['Bid'] is None or price['Ask'] is None:
  20. print(mat, 'has no bid/ask')
  21. continue
  22. spread = (price['Ask'] - price['Bid']) / price['Ask']
  23. bids_filled, asks_filled = market.estimate_filled_orders(mat + '.IC1', (price['Bid'] + price['Ask']) / 2)
  24. ask_fill_ratio = asks_filled / (bids_filled + asks_filled)
  25. materials.append(Material(mat, spread=spread, bids_filled=bids_filled, asks_filled=asks_filled, score=spread * ask_fill_ratio))
  26. materials.sort()
  27. print(f'{"mat":^4} spread bids filled asks filled')
  28. for m in materials:
  29. print(f'{m.ticker:4} {m.spread*100:5.1f}% {m.bids_filled:12.0f} {m.asks_filled:12.0f}')
  30. @dataclasses.dataclass(eq=False, slots=True)
  31. class Material:
  32. ticker: str
  33. spread: float
  34. bids_filled: float
  35. asks_filled: float
  36. score: float
  37. def __lt__(self, o) -> bool:
  38. return self.score < o.score
  39. if __name__ == '__main__':
  40. main()