Example #1
0
class Test(unittest.TestCase):


    def setUp(self):
        datafile = '%s/data/AC___CCB-10d.csv' % os.path.dirname(__file__)
        self._feed = Feed(Instrument('AC',datafile))
        

    def tearDown(self):
        pass

    ###########################################################################
    ## Test a basic long market entry order
    
    def on_bars_1(self,bars):
        if not self._placed_markorder:
            o = self._broker.createMarketOrder(Order.Action.BUY, 'AC', 100, False)
            self._broker.placeOrder(o)
            self._placed_markorder = True
        else:
            # we expect by the next Bar that we own the 100 units of AC
            self.assertEqual(self._broker.getPositions()['AC'], 100) 
            
    def on_order_update_1(self, broker, order):
        # 2.215 is open price on day 2 - we expect to execute there
        self.assertEqual(order.getExecutionInfo().getPrice(),2.215)
        
    def testMarketOrder(self):
        self._placed_markorder = False
        mf = MultiFeed()
        mf.register_feed(self._feed)
        self._broker = BacktestingBroker(10000, mf)
        mf.subscribe(self.on_bars_1)
        self._broker.getOrderUpdatedEvent().subscribe(self.on_order_update_1)
        mf.start()

    ###########################################################################
    ## Test a long limit entry order

    def on_bars_2(self,bars):
        if not self._placed_lo:
            self._lo = self._broker.createLimitOrder(Order.Action.BUY, 'AC', 2.210, 100)
            self._lo.setGoodTillCanceled(True)
            self._broker.placeOrder(self._lo)
            self._placed_lo = True
        else:
            if self._lo.getState() == Order.State.FILLED:
                # when the order is filled we should have 100 units of AC
                self.assertEqual(self._broker.getPositions()['AC'], 100) 
            
    def on_order_update_2(self, broker, order):
        # our limit should trigger on 1/25 because the low goes to 2.205
        self.assertEqual(order.getExecutionInfo().getPrice(),2.210)
        self.assertEqual(order.getExecutionInfo().getDateTime(),datetime.datetime(2012,1,25,0,0))
        
    def testLimitOrder(self):
        self._placed_lo = False
        mf = MultiFeed()
        mf.register_feed(self._feed)
        self._broker = BacktestingBroker(10000, mf)
        mf.subscribe(self.on_bars_2)
        self._broker.getOrderUpdatedEvent().subscribe(self.on_order_update_2)
        mf.start()

    ###########################################################################
    ## Test a short market entry order

    def on_bars_3(self,bars):
        if not self._placed_smo:
            o = self._broker.createMarketOrder(Order.Action.SELL_SHORT, 'AC', 100, False)
            self._broker.placeOrder(o)
            self._placed_smo = True
        else:
            # we expect by the next Bar that we own the 100 units of AC
            self.assertEqual(self._broker.getPositions()['AC'], -100) 
            
    def on_order_update_3(self, broker, order):
        # 2.215 is open price on day 2 - we expect to execute there
        self.assertEqual(order.getExecutionInfo().getPrice(),2.215)
        
    def testMarketOrderShort(self):
        self._placed_smo = False
        mf = MultiFeed()
        mf.register_feed(self._feed)
        self._broker = BacktestingBroker(10000, mf)
        mf.subscribe(self.on_bars_3)
        self._broker.getOrderUpdatedEvent().subscribe(self.on_order_update_3)
        mf.start()

    ###########################################################################
    ## Test a stop-loss exit from a market entry long

    def on_bars_4(self,bars):
        if not self._placed_markorder:
            o = self._broker.createMarketOrder(Order.Action.BUY, 'AC', 100, False)
            self._broker.placeOrder(o)
            self._placed_markorder = True
            # now we also need to place our stop-loss
            o1 = self._broker.createStopOrder(Order.Action.SELL, 'AC', 2.2075, 100)
            o1.setGoodTillCanceled(True)
            self._broker.placeOrder(o1)
            
    def on_order_update_4(self, broker, order):
        # 2.215 is open price on day 2 - we expect to execute there
        if order.getType() == Order.Type.MARKET:
            self.assertEqual(order.getExecutionInfo().getPrice(),2.215)
            self.assertEqual(self._broker.getPositions()['AC'], 100) 
        elif order.getType() == Order.Type.STOP:
            self.assertEqual(order.getExecutionInfo().getPrice(),2.2075)
            self.assertEqual(self._broker.getPositions()['AC'], 0) 
        else:
            self.assertTrue(False)
        
    def testMarketOrderStopLimit(self):
        self._placed_markorder = False
        mf = MultiFeed()
        mf.register_feed(self._feed)
        self._broker = BacktestingBroker(10000, mf)
        mf.subscribe(self.on_bars_4)
        self._broker.getOrderUpdatedEvent().subscribe(self.on_order_update_4)
        mf.start()

    ###########################################################################
    ## Test a stop-loss exit from a market entry short

    def on_bars_5(self,bars):
        if not self._placed_markorder:
            o = self._broker.createMarketOrder(Order.Action.SELL_SHORT, 'AC', 100, False)
            self._broker.placeOrder(o)
            self._placed_markorder = True
            # now we also need to place our stop-loss
            o1 = self._broker.createStopOrder(Order.Action.BUY_TO_COVER, 'AC', 2.265, 100)
            o1.setGoodTillCanceled(True)
            self._broker.placeOrder(o1)
            
    def on_order_update_5(self, broker, order):
        # 2.215 is open price on day 2 - we expect to execute there
        if order.getType() == Order.Type.MARKET:
            self.assertEqual(order.getExecutionInfo().getPrice(),2.215)
            self.assertEqual(self._broker.getPositions()['AC'], -100) 
        elif order.getType() == Order.Type.STOP:
            # this scenario gaps up on day stop hit so price is open price, not stop price
            self.assertEqual(order.getExecutionInfo().getPrice(),2.275)
            self.assertEqual(self._broker.getPositions()['AC'], 0) 
        else:
            self.assertTrue(False)
        
    def testMarketOrderShortStopLimit(self):
        self._placed_markorder = False
        mf = MultiFeed()
        mf.register_feed(self._feed)
        self._broker = BacktestingBroker(10000, mf)
        mf.subscribe(self.on_bars_5)
        self._broker.getOrderUpdatedEvent().subscribe(self.on_order_update_5)
        mf.start()