def testLongPosStopLoss_GappingBars(self): brk = backtesting.Broker(15, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 5) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(cb.eventCount == 2) # Create stop loss order. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 9, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 10, 12)) # Stop loss not hit. self.assertFalse(order.isFilled()) self.assertTrue(len(brk.getActiveOrders()) == 1) self.assertTrue(brk.getCash() == 5) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(cb.eventCount == 1) brk.onBars(self.buildBars(5, 8, 4, 7)) # Stop loss hit. self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 5) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 5+5) # Fill the stop loss order at open price. self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 2)
def testFailToBuy(self): brk = backtesting.Broker(5, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) order = brk.createLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 5, 1) # Fail to buy (couldn't get specific price). cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isAccepted()) self.assertTrue(order.getExecutionInfo() == None) self.assertTrue(len(brk.getActiveOrders()) == 1) self.assertTrue(brk.getCash() == 5) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 1) # Fail to buy (couldn't get specific price). Canceled due to session close. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) brk.onBars(self.buildBars(11, 15, 8, 12, True)) self.assertTrue(order.isCanceled()) self.assertTrue(order.getExecutionInfo() == None) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 5) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 1)
def testBuy_GTC(self): brk = backtesting.Broker(10, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) order = brk.createLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 4, 2) order.setGoodTillCanceled(True) # Fail to buy (couldn't get specific price). cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) brk.placeOrder(order) # Set sessionClose to true test that the order doesn't get canceled. brk.onBars(self.buildBars(10, 15, 8, 12, True)) self.assertTrue(order.isAccepted()) self.assertTrue(order.getExecutionInfo() == None) self.assertTrue(len(brk.getActiveOrders()) == 1) self.assertTrue(brk.getCash() == 10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 1) # Buy cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) brk.onBars(self.buildBars(2, 15, 1, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 2) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 6) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 2) self.assertTrue(cb.eventCount == 1)
def testBuyAndSellInTwoSteps(self): brk = backtesting.Broker(20.4, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 2) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(round(brk.getCash(), 1) == 0.4) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 2) # Sell order = brk.createMarketOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(round(brk.getCash(), 1) == 10.4) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) # Sell again order = brk.createMarketOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(11, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 11) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(round(brk.getCash(), 1) == 21.4) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0)
def testBuyAndSell_GappingBars(self): brk = backtesting.Broker(20, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy. Bar is below the target price. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 20, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 10)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(cb.eventCount == 2) # Sell. Bar is above the target price. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createLimitOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 30, 1) brk.placeOrder(order) brk.onBars(self.buildBars(35, 40, 32, 35)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 35) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 45) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 2)
def testHitStopAndLimit(self): brk = backtesting.Broker(15, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy. Stop >= 10. Buy <= 12. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, stopPrice=10, limitPrice=12, quantity=1) brk.placeOrder(order) # Stop price hit. Limit price hit. Fill at stop price. brk.onBars(self.buildBars(9, 15, 8, 14)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) # Sell. Stop <= 8. Sell >= 6. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopLimitOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, stopPrice=8, limitPrice=6, quantity=1) brk.placeOrder(order) # Stop price hit. Limit price hit. Fill at stop price. brk.onBars(self.buildBars(9, 10, 5, 8)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 8)
def testCancel(self): brk = backtesting.Broker(100, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.cancelOrder(order) brk.onBars(self.buildBars(10, 10, 10, 10)) self.assertTrue(order.isCanceled())
def testSellShort_2(self): brk = backtesting.Broker(1000, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Short sell 1 order = brk.createMarketOrder(broker.Order.Action.SELL_SHORT, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(100, 100, 100, 100)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getCash() == 1100) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -1) self.assertTrue(brk.getEquityWithBars(self.buildBars(100, 100, 100, 100)) == 1000) self.assertTrue(brk.getEquityWithBars(self.buildBars(0, 0, 0, 0)) == 1000 + 100) self.assertTrue(brk.getEquityWithBars(self.buildBars(70, 70, 70, 70)) == 1000 + 30) self.assertTrue(brk.getEquityWithBars(self.buildBars(200, 200, 200, 200)) == 1000 - 100) # Buy 2 and earn 50 order = brk.createMarketOrder(broker.Order.Action.BUY_TO_COVER, BaseTestCase.TestInstrument, 2) brk.placeOrder(order) brk.onBars(self.buildBars(50, 50, 50, 50)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(brk.getCash() == 1000) # +50 from short sell operation, -50 from buy operation. self.assertTrue(brk.getEquityWithBars(self.buildBars(50, 50, 50, 50)) == 1000 + 50) self.assertTrue(brk.getEquityWithBars(self.buildBars(70, 70, 70, 70)) == 1000 + 50 + 20) # Sell 1 and earn 50 order = brk.createMarketOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(100, 100, 100, 100)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(brk.getEquityWithBars(self.buildBars(70, 70, 70, 70)) == 1000 + 50 + 50)
def testSellShort_3(self): brk = backtesting.Broker(100, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy 1 order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(100, 100, 100, 100)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(brk.getCash() == 0) # Sell 2 order = brk.createMarketOrder(broker.Order.Action.SELL_SHORT, BaseTestCase.TestInstrument, 2) brk.placeOrder(order) brk.onBars(self.buildBars(100, 100, 100, 100)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -1) self.assertTrue(brk.getCash() == 200) # Buy 1 order = brk.createMarketOrder(broker.Order.Action.BUY_TO_COVER, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(100, 100, 100, 100)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(brk.getCash() == 100)
def testSellShort_1(self): brk = backtesting.Broker(1000, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Short sell order = brk.createMarketOrder(broker.Order.Action.SELL_SHORT, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(200, 200, 200, 200)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 1200) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -1) self.assertTrue(brk.getEquityWithBars(self.buildBars(100, 100, 100, 100)) == 1000 + 100) self.assertTrue(brk.getEquityWithBars(self.buildBars(0, 0, 0, 0)) == 1000 + 200) self.assertTrue(brk.getEquityWithBars(self.buildBars(30, 30, 30, 30)) == 1000 + 170) # Buy at the same price. order = brk.createMarketOrder(broker.Order.Action.BUY_TO_COVER, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(200, 200, 200, 200)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 1000) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0)
def testBuyAndSell(self): brk = backtesting.Broker(11, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 1) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(cb.eventCount == 2) # Sell cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createMarketOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 11) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 2)
def testShortPosStopLoss_GappingBars(self): brk = backtesting.Broker(15, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Sell short cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createMarketOrder(broker.Order.Action.SELL_SHORT, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10) self.assertTrue(order.getExecutionInfo().getCommission() == 0) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 15+10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -1) self.assertTrue(cb.eventCount == 2) # Create stop loss order. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopOrder(broker.Order.Action.BUY_TO_COVER, BaseTestCase.TestInstrument, 11, 1) brk.placeOrder(order) brk.onBars(self.buildBars(8, 10, 7, 9)) # Stop loss not hit. self.assertFalse(order.isFilled()) self.assertTrue(len(brk.getActiveOrders()) == 1) self.assertTrue(brk.getCash() == 15+10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -1) self.assertTrue(cb.eventCount == 1) brk.onBars(self.buildBars(15, 20, 13, 14)) # Stop loss hit. self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 15) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 15-5) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 0) self.assertTrue(cb.eventCount == 2)
def testReSubmit(self): brk = backtesting.Broker(15, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy. Stop >= 10. Buy <= 12. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, stopPrice=1, limitPrice=1, quantity=1) brk.placeOrder(order) order.setLimitPrice(12) brk.placeOrder(order) order.setStopPrice(10) brk.placeOrder(order) # Stop price not hit. Limit price not hit. brk.onBars(self.buildBars(8, 9, 7, 8)) self.assertFalse(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Stop price hit. Limit price not hit. brk.onBars(self.buildBars(13, 15, 13, 14)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Limit price hit (bars include the price). Fill at open price. brk.onBars(self.buildBars(11, 15, 10, 14)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 11)
def testBuyWithCommission(self): brk = backtesting.Broker(1020, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE), commission=backtesting.FixedPerTrade(10)) # Buy order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 100) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 10) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 100)
def testReSubmit(self): brk = backtesting.Broker(1000, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1, False) brk.placeOrder(order) order.setFillOnClose(True) brk.placeOrder(order) # Re-submit the order after changing it. brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 12)
def testPortfolioValue(self): brk = backtesting.Broker(11, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy order = brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1) brk.placeOrder(order) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertTrue(order.isFilled()) self.assertTrue(len(brk.getActiveOrders()) == 0) self.assertTrue(brk.getCash() == 1) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 1) self.assertTrue(brk.getEquityWithBars(self.buildBars(11, 11, 11, 11)) == 11 + 1) self.assertTrue(brk.getEquityWithBars(self.buildBars(1, 1, 1, 1)) == 1 + 1)
def testInvertedPrices_FillOpen_GappingBars(self): brk = backtesting.Broker(15, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) # Buy. Stop >= 12. Buy <= 10. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopLimitOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, stopPrice=12, limitPrice=10, quantity=1) brk.placeOrder(order) # Stop price not hit. Limit price not hit. brk.onBars(self.buildBars(8, 9, 7, 8)) self.assertFalse(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Stop price hit. Limit price not hit. brk.onBars(self.buildBars(11, 12, 10.5, 11)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Limit price hit. Fill at open price. brk.onBars(self.buildBars(7, 9, 6, 8)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 7) # Sell. Stop <= 6. Sell >= 8. cb = Callback() brk.getOrderUpdatedEvent().subscribe(cb.onOrderUpdated) order = brk.createStopLimitOrder(broker.Order.Action.SELL, BaseTestCase.TestInstrument, stopPrice=6, limitPrice=8, quantity=1) brk.placeOrder(order) # Stop price not hit. Limit price not hit. brk.onBars(self.buildBars(9, 10, 9, 10)) self.assertFalse(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Stop price hit. Limit price not hit. brk.onBars(self.buildBars(7, 7, 6, 7)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isAccepted()) # Limit price hit. Fill at open price. brk.onBars(self.buildBars(10, 10, 9, 9)) self.assertTrue(order.isLimitOrderActive()) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getPrice() == 10)
def testRegressionGetActiveOrders(self): activeOrders = [] def onOrderUpdated(broker, order): activeOrders.append(len(broker.getActiveOrders())) brk = backtesting.Broker(1000, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE)) brk.getOrderUpdatedEvent().subscribe(onOrderUpdated) brk.placeOrder(brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1)) brk.placeOrder(brk.createMarketOrder(broker.Order.Action.BUY, BaseTestCase.TestInstrument, 1)) brk.onBars(self.buildBars(10, 15, 8, 12)) self.assertEqual(brk.getCash(), 1000 - 10*2) self.assertEqual(len(activeOrders), 4) self.assertEqual(activeOrders[0], 2) # First order gets accepted, both orders are active. self.assertEqual(activeOrders[1], 1) # First order gets filled, one order is active. self.assertEqual(activeOrders[2], 1) # Second order gets accepted, one order is active. self.assertEqual(activeOrders[3], 0) # Second order gets filled, zero orders are active.
def testSellShortWithCommission(self): sharePrice = 100 commission = 10 brk = backtesting.Broker(1010, barFeed=barfeed.BarFeed(barfeed.Frequency.MINUTE), commission=backtesting.FixedPerTrade(commission)) # Sell 10 shares order = brk.createMarketOrder(broker.Order.Action.SELL_SHORT, BaseTestCase.TestInstrument, 10) brk.placeOrder(order) brk.onBars(self.buildBars(sharePrice, sharePrice, sharePrice, sharePrice)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 10) self.assertTrue(brk.getCash() == 2000) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == -10) # Buy the 10 shares sold short plus 9 extra order = brk.createMarketOrder(broker.Order.Action.BUY_TO_COVER, BaseTestCase.TestInstrument, 19) brk.placeOrder(order) brk.onBars(self.buildBars(sharePrice, sharePrice, sharePrice, sharePrice)) self.assertTrue(order.isFilled()) self.assertTrue(order.getExecutionInfo().getCommission() == 10) self.assertTrue(brk.getShares(BaseTestCase.TestInstrument) == 9) self.assertTrue(brk.getCash() == sharePrice - commission)