REF: Move check_order_triggers to method of order.

The function takes order as a first parameter, which lends itself to
being an instance method.
This commit is contained in:
Eddie Hebert
2015-12-15 10:30:11 -05:00
parent b863733953
commit fc9d13ca0c
2 changed files with 65 additions and 62 deletions
+65 -2
View File
@@ -18,7 +18,6 @@ import uuid
from six import text_type, iteritems
from zipline.finance.slippage import check_order_triggers
import zipline.protocol as zp
from zipline.utils.serialization_utils import VERSION_LABEL
from zipline.utils.enum import enum
@@ -31,6 +30,11 @@ ORDER_STATUS = enum(
'HELD',
)
SELL = 1 << 0
BUY = 1 << 1
STOP = 1 << 2
LIMIT = 1 << 3
class Order(object):
def __init__(self, dt, sid, amount, stop=None, limit=None, filled=0,
@@ -81,7 +85,7 @@ class Order(object):
trade event's price.
"""
stop_reached, limit_reached, sl_stop_reached = \
check_order_triggers(self, event)
self.check_order_triggers(event)
if (stop_reached, limit_reached) \
!= (self.stop_reached, self.limit_reached):
self.dt = event.dt
@@ -91,6 +95,65 @@ class Order(object):
# Change the STOP LIMIT order into a LIMIT order
self.stop = None
def check_order_triggers(self, event):
"""
Given an order and a trade event, return a tuple of
(stop_reached, limit_reached).
For market orders, will return (False, False).
For stop orders, limit_reached will always be False.
For limit orders, stop_reached will always be False.
For stop limit orders a Boolean is returned to flag
that the stop has been reached.
Orders that have been triggered already (price targets reached),
the order's current values are returned.
"""
if self.triggered:
return (self.stop_reached, self.limit_reached, False)
stop_reached = False
limit_reached = False
sl_stop_reached = False
order_type = 0
if self.amount > 0:
order_type |= BUY
else:
order_type |= SELL
if self.stop is not None:
order_type |= STOP
if self.limit is not None:
order_type |= LIMIT
if order_type == BUY | STOP | LIMIT:
if event.price >= self.stop:
sl_stop_reached = True
if event.price <= self.limit:
limit_reached = True
elif order_type == SELL | STOP | LIMIT:
if event.price <= self.stop:
sl_stop_reached = True
if event.price >= self.limit:
limit_reached = True
elif order_type == BUY | STOP:
if event.price >= self.stop:
stop_reached = True
elif order_type == SELL | STOP:
if event.price <= self.stop:
stop_reached = True
elif order_type == BUY | LIMIT:
if event.price <= self.limit:
limit_reached = True
elif order_type == SELL | LIMIT:
# This is a SELL LIMIT order
if event.price >= self.limit:
limit_reached = True
return (stop_reached, limit_reached, sl_stop_reached)
def handle_split(self, split_event):
ratio = split_event.ratio
-60
View File
@@ -34,66 +34,6 @@ STOP = 1 << 2
LIMIT = 1 << 3
def check_order_triggers(order, event):
"""
Given an order and a trade event, return a tuple of
(stop_reached, limit_reached).
For market orders, will return (False, False).
For stop orders, limit_reached will always be False.
For limit orders, stop_reached will always be False.
For stop limit orders a Boolean is returned to flag
that the stop has been reached.
Orders that have been triggered already (price targets reached),
the order's current values are returned.
"""
if order.triggered:
return (order.stop_reached, order.limit_reached, False)
stop_reached = False
limit_reached = False
sl_stop_reached = False
order_type = 0
if order.amount > 0:
order_type |= BUY
else:
order_type |= SELL
if order.stop is not None:
order_type |= STOP
if order.limit is not None:
order_type |= LIMIT
if order_type == BUY | STOP | LIMIT:
if event.price >= order.stop:
sl_stop_reached = True
if event.price <= order.limit:
limit_reached = True
elif order_type == SELL | STOP | LIMIT:
if event.price <= order.stop:
sl_stop_reached = True
if event.price >= order.limit:
limit_reached = True
elif order_type == BUY | STOP:
if event.price >= order.stop:
stop_reached = True
elif order_type == SELL | STOP:
if event.price <= order.stop:
stop_reached = True
elif order_type == BUY | LIMIT:
if event.price <= order.limit:
limit_reached = True
elif order_type == SELL | LIMIT:
# This is a SELL LIMIT order
if event.price >= order.limit:
limit_reached = True
return (stop_reached, limit_reached, sl_stop_reached)
def transact_stub(slippage, commission, event, open_orders):
"""
This is intended to be wrapped in a partial, so that the