Conditions | 2 |
Total Lines | 64 |
Lines | 0 |
Ratio | 0 % |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | # |
||
112 | def test_order_rejection(self): |
||
113 | blotter = Blotter(self.sim_params.data_frequency) |
||
114 | |||
115 | # Reject a nonexistent order -> no order appears in new_order, |
||
116 | # no exceptions raised out |
||
117 | blotter.reject(56) |
||
118 | self.assertEqual(blotter.new_orders, []) |
||
119 | |||
120 | # Basic tests of open order behavior |
||
121 | open_order_id = blotter.order(24, 100, MarketOrder()) |
||
122 | second_order_id = blotter.order(24, 50, MarketOrder()) |
||
123 | self.assertEqual(len(blotter.open_orders[24]), 2) |
||
124 | open_order = blotter.open_orders[24][0] |
||
125 | self.assertEqual(open_order.status, ORDER_STATUS.OPEN) |
||
126 | self.assertEqual(open_order.id, open_order_id) |
||
127 | self.assertIn(open_order, blotter.new_orders) |
||
128 | |||
129 | # Reject that order immediately (same bar, i.e. still in new_orders) |
||
130 | blotter.reject(open_order_id) |
||
131 | self.assertEqual(len(blotter.new_orders), 2) |
||
132 | self.assertEqual(len(blotter.open_orders[24]), 1) |
||
133 | still_open_order = blotter.new_orders[0] |
||
134 | self.assertEqual(still_open_order.id, second_order_id) |
||
135 | self.assertEqual(still_open_order.status, ORDER_STATUS.OPEN) |
||
136 | rejected_order = blotter.new_orders[1] |
||
137 | self.assertEqual(rejected_order.status, ORDER_STATUS.REJECTED) |
||
138 | self.assertEqual(rejected_order.reason, '') |
||
139 | |||
140 | # Do it again, but reject it at a later time (after tradesimulation |
||
141 | # pulls it from new_orders) |
||
142 | blotter = Blotter(self.sim_params.data_frequency) |
||
143 | |||
144 | new_open_id = blotter.order(24, 10, MarketOrder()) |
||
145 | new_open_order = blotter.open_orders[24][0] |
||
146 | self.assertEqual(new_open_id, new_open_order.id) |
||
147 | # Pretend that the trade simulation did this. |
||
148 | blotter.new_orders = [] |
||
149 | |||
150 | rejection_reason = "Not enough cash on hand." |
||
151 | blotter.reject(new_open_id, reason=rejection_reason) |
||
152 | rejected_order = blotter.new_orders[0] |
||
153 | self.assertEqual(rejected_order.id, new_open_id) |
||
154 | self.assertEqual(rejected_order.status, ORDER_STATUS.REJECTED) |
||
155 | self.assertEqual(rejected_order.reason, rejection_reason) |
||
156 | |||
157 | # You can't reject a filled order. |
||
158 | # Reset for paranoia |
||
159 | blotter = Blotter(self.sim_params.data_frequency) |
||
160 | blotter.slippage_func = FixedSlippage() |
||
161 | filled_id = blotter.order(24, 100, MarketOrder()) |
||
162 | filled_order = None |
||
163 | blotter.current_dt = self.sim_params.trading_days[-1] |
||
164 | txns, _ = blotter.get_transactions(self.data_portal) |
||
165 | for txn in txns: |
||
166 | filled_order = blotter.orders[txn.order_id] |
||
167 | |||
168 | self.assertEqual(filled_order.id, filled_id) |
||
169 | self.assertIn(filled_order, blotter.new_orders) |
||
170 | self.assertEqual(filled_order.status, ORDER_STATUS.FILLED) |
||
171 | self.assertNotIn(filled_order, blotter.open_orders[24]) |
||
172 | |||
173 | blotter.reject(filled_id) |
||
174 | updated_order = blotter.orders[filled_id] |
||
175 | self.assertEqual(updated_order.status, ORDER_STATUS.FILLED) |
||
176 | |||
236 |