# -*- coding: utf-8 -*- import os from six.moves.urllib.parse import urljoin import requests class Stockfighter(object): base_url = 'https://api.stockfighter.io/ob/api/' def __init__(self, venue, account, api_key=None): self.venue = venue self.account = account if api_key is not None: self.api_key = api_key else: self.api_key = os.environ['API_KEY'] self.session = requests.Session() self.session.headers.update({ 'X-Starfighter-Authorization': self.api_key }) def heartbeat(self): """Check The API Is Up. https://starfighter.readme.io/docs/heartbeat """ url = urljoin(self.base_url, 'heartbeat') return self.session.get(url).json()['ok'] def venue_healthcheck(self): """Check A Venue Is Up. https://starfighter.readme.io/docs/venue-healthcheck """ url = urljoin(self.base_url, 'venues/TESTEX/heartbeat') return self.session.get(url).json()['ok'] def venue_stocks(self): """List the stocks available for trading on the venue. https://starfighter.readme.io/docs/list-stocks-on-venue """ url = urljoin(self.base_url, 'venues/{0}/stocks'.format(self.venue)) return self.session.get(url).json() def orderbook_for_stock(self, stock): """Get the orderbook for a particular stock. https://starfighter.readme.io/docs/get-orderbook-for-stock """ url_fragment = 'venues/{venue}/stocks/{stock}'.format( venue=self.venue, stock=stock, ) url = urljoin(self.base_url, url_fragment) return self.session.get(url).json() def place_new_order(self, stock, price, qty, direction, order_type): """Place an order for a stock. https://starfighter.readme.io/docs/place-new-order """ url_fragment = 'venues/{venue}/stocks/{stock}/orders'.format( venue=self.venue, stock=stock, ) data = { "stock": stock, "price": price, "venue": self.venue, "account": self.account, "qty": qty, "direction": direction, "orderType": order_type, } url = urljoin(self.base_url, url_fragment) resp = self.session.post(url, json=data) return resp.json() def quote_for_stock(self, stock): """Get a quick look at the most recent trade information for a stock. https://starfighter.readme.io/docs/a-quote-for-a-stock """ url_fragment = 'venues/{venue}/stocks/{stock}/quote'.format( venue=self.venue, stock=stock, ) url = urljoin(self.base_url, url_fragment) return self.session.get(url).json() def status_for_order(self, order_id, stock): """Status For An Existing Order https://starfighter.readme.io/docs/status-for-an-existing-order """ url_fragment = 'venues/{venue}/stocks/{stock}/orders/{order_id}'.format( venue=self.venue, stock=stock, order_id=order_id, ) url = urljoin(self.base_url, url_fragment) return self.session.get(url).json() def cancel_order(self, order_id, stock): """Cancel An Order https://starfighter.readme.io/docs/cancel-an-order """ url_fragment = 'venues/{venue}/stocks/{stock}/orders/{order_id}'.format( venue=self.venue, stock=stock, order_id=order_id, ) url = urljoin(self.base_url, url_fragment) return self.session.delete(url).json() def status_for_all_orders(self): """Status for all orders https://starfighter.readme.io/docs/status-for-all-orders """ url_fragment = 'venues/{venue}/accounts/{account}/orders'.format( venue=self.venue, account=self.account, ) url = urljoin(self.base_url, url_fragment) return self.session.get(url).json() def status_for_all_orders_in_a_stock(self, stock): """Status for all orders in a stock https://starfighter.readme.io/docs/status-for-all-orders-in-a-stock """ url_fragment = 'venues/{venue}/accounts/{account}/stocks/{stock}/orders'.format( stock=stock, venue=self.venue, account=self.account, ) url = urljoin(self.base_url, url_fragment) return self.session.get(url).json()