Created
October 2, 2016 07:44
-
-
Save illoyd/67d13b347c25baa72fcf7a6f65040c1e to your computer and use it in GitHub Desktop.
An Order Manager for Quantopian. Slightly smarter management of open orders.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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