mirror of
https://github.com/wassname/catalyst.git
synced 2026-09-13 12:20:20 +08:00
BUG: Fix limit orders
Only fill limit order if impacted fill price is better than the limit price. If a limit order is partially filled, only fill the remaining shares if the impacted fill price is better than the limit price.
This commit is contained in:
@@ -103,12 +103,13 @@ class SlippageTestCase(TestCase):
|
||||
]
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[2],
|
||||
events[3],
|
||||
open_orders
|
||||
))
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# long, does trade
|
||||
# long, does not trade - impacted price worse than limit price
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc),
|
||||
@@ -123,6 +124,24 @@ class SlippageTestCase(TestCase):
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# long, does trade
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc),
|
||||
'amount': 100,
|
||||
'filled': 0,
|
||||
'sid': 133,
|
||||
'limit': 3.6})
|
||||
]
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[3],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 1)
|
||||
txn = orders_txns[0][1]
|
||||
|
||||
@@ -160,7 +179,7 @@ class SlippageTestCase(TestCase):
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# short, does trade
|
||||
# short, does not trade - impacted price worse than limit price
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
@@ -176,6 +195,24 @@ class SlippageTestCase(TestCase):
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# short, does trade
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc),
|
||||
'amount': -100,
|
||||
'filled': 0,
|
||||
'sid': 133,
|
||||
'limit': 3.4})
|
||||
]
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[1],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 1)
|
||||
_, txn = orders_txns[0]
|
||||
|
||||
@@ -372,7 +409,7 @@ class SlippageTestCase(TestCase):
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# long, does trade
|
||||
# long, does not trade - impacted price worse than limit price
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
@@ -396,6 +433,32 @@ class SlippageTestCase(TestCase):
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# long, does trade
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc),
|
||||
'amount': 100,
|
||||
'filled': 0,
|
||||
'sid': 133,
|
||||
'stop': 4.0,
|
||||
'limit': 3.6})
|
||||
]
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[2],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[3],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 1)
|
||||
_, txn = orders_txns[0]
|
||||
|
||||
@@ -436,7 +499,7 @@ class SlippageTestCase(TestCase):
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# short, does trade
|
||||
# short, does not trade - impacted price worse than limit price
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
@@ -460,6 +523,32 @@ class SlippageTestCase(TestCase):
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
# short, does trade
|
||||
|
||||
open_orders = [
|
||||
Order(**{
|
||||
'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc),
|
||||
'amount': -100,
|
||||
'filled': 0,
|
||||
'sid': 133,
|
||||
'stop': 3.0,
|
||||
'limit': 3.4})
|
||||
]
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[0],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 0)
|
||||
|
||||
orders_txns = list(slippage_model.simulate(
|
||||
events[1],
|
||||
open_orders
|
||||
))
|
||||
|
||||
self.assertEquals(len(orders_txns), 1)
|
||||
_, txn = orders_txns[0]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user