From 599ff1ad8a393d739db89e04e8a226f7fee8c901 Mon Sep 17 00:00:00 2001 From: Richard Frank Date: Fri, 20 Sep 2013 16:28:09 -0400 Subject: [PATCH] MAINT: Ensure the sign of the result is positive --- tests/test_blotter.py | 6 ++++++ zipline/finance/blotter.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_blotter.py b/tests/test_blotter.py index c722f5cc..b47a282a 100644 --- a/tests/test_blotter.py +++ b/tests/test_blotter.py @@ -1,3 +1,5 @@ +import math + from nose_parameterized import parameterized from unittest import TestCase @@ -16,6 +18,8 @@ class BlotterTestCase(TestCase): def test_round_for_minimum_price_variation_buy(self, price, expected): result = round_for_minimum_price_variation(price, is_buy=True) self.assertEqual(result, expected) + self.assertEqual(math.copysign(1.0, result), + math.copysign(1.0, expected)) @parameterized.expand([(0.00, 0.00), (0.01, 0.01), @@ -27,3 +31,5 @@ class BlotterTestCase(TestCase): def test_round_for_minimum_price_variation_sell(self, price, expected): result = round_for_minimum_price_variation(price, is_buy=False) self.assertEqual(result, expected) + self.assertEqual(math.copysign(1.0, result), + math.copysign(1.0, expected)) diff --git a/zipline/finance/blotter.py b/zipline/finance/blotter.py index e592c60b..3af95fd5 100644 --- a/zipline/finance/blotter.py +++ b/zipline/finance/blotter.py @@ -47,7 +47,10 @@ ORDER_STATUS = Enum( # buy: [.0095, .0195) -> round to .01, sell: (.0005, .0105] -> round to .01 def round_for_minimum_price_variation(x, is_buy, diff=(0.0095 - .005)): # relies on rounding half away from zero, unlike numpy's bankers' rounding - return round(x - (diff if is_buy else -diff), 2) + rounded = round(x - (diff if is_buy else -diff), 2) + if zp_math.tolerant_equals(rounded, 0.0): + return 0.0 + return rounded class Blotter(object):