Skip to content

Instantly share code, notes, and snippets.

@illoyd
Created October 2, 2016 07:44
Show Gist options
  • Save illoyd/67d13b347c25baa72fcf7a6f65040c1e to your computer and use it in GitHub Desktop.
Save illoyd/67d13b347c25baa72fcf7a6f65040c1e to your computer and use it in GitHub Desktop.
An Order Manager for Quantopian. Slightly smarter management of open orders.
class OrderManager(object):
""" A helper for placing and tracking orders in Quantopian. """
def __init__(self):
self.orders = []
self.context = None
self.data = None
def update(self, context, data):
self.context = context
self.data = data
for order in self.orders:
order.update(context, data)
def open(self, sid, shares=None, target_shares=None, value=None, target_value=None, percent=None, limit=None, stop=None):
# Determine the style of order
style = self._order_style(limit=limit, stop=stop)
# Determine how to open the position
if shares is not None:
return order(sid, shares, style=style)
elif target_shares is not None:
return order_target(sid, target_shares, style=style)
elif value is not None:
return order_value(sid, value, style=style)
elif target_value is not None:
return order_target_value(sid, target_value, style=style)
elif percent is not None:
return order_target_percent(sid, percent, style=style)
else:
raise ValueError('Could not intuit the appropriate order style based on passed parameters.')
buy = open
def sell(self, sid, shares=None, target_shares=None, value=None, target_value=None, percent=None, limit=None, stop=None):
if shares is not None: shares = -shares
if target_shares is not None: target_shares = -target_shares
if value is not None: value = -value
if target_value is not None: target_value = -target_value
if percent is not None: percent = -percent
return self.open(sid, shares, target_shares, value, target_value, percent, limit, stop)
def close(self, sid, limit=None, stop=None):
return self.open(sid, target_value=0, limit=limit, stop=stop)
def cleanup(self, context, data):
self.context = None
self.data = None
def open_orders(self, sid=None):
return get_open_orders(sid)
@staticmethod
def _order_style(limit=None, stop=None):
if limit and stop:
return StopLimitOrder(limit, stop)
elif limit:
return LimitOrder(limit)
elif stop:
return StopOrder(stop)
else:
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment