Esempio n. 1
0
def set_trade(trading_robot: PyRobot, trading_symbol: str,
              current_price: int,
              available_funds,
              max_percent: float = None) -> dict:
	"""
	Create order legs and set the qty based on how much of my portfolio
	  I want to trade at one time
	:param trading_robot: the robot
	:param trading_symbol: the ticker symbol for the trades
	:param max_percent: max percentage of my portfolio I want for a single trade
	:param current_price: current candle open price
	:param available_funds: current amount I can trade with
	:return: trade dictionary
	"""

	qty = round((available_funds * max_percent) / current_price) if max_percent else 1

	new_enter_trade = trading_robot.create_trade(
		trade_id='long_enter',
		enter_or_exit='enter',
		long_or_short='long',
		order_type='mkt'
	)

	# Add an Order Leg
	new_enter_trade.instrument(
		symbol=trading_symbol,
		quantity=qty,
		asset_type='EQUITY'
	)

	# Create a new Trade Object for Exiting position
	new_exit_trade = trading_robot.create_trade(
		trade_id='long_exit',
		enter_or_exit='exit',
		long_or_short='long',
		order_type='mkt'
	)

	# Add an Order Leg
	new_exit_trade.instrument(
		symbol=trading_symbol,
		quantity=qty,
		asset_type='EQUITY'
	)

	return {
		trading_symbol: {
			'buy': {
				'trade_func': trading_robot.trades['long_enter'],
				'trade_id': trading_robot.trades['long_enter'].trade_id
			},
			'sell': {
				'trade_func': trading_robot.trades['long_exit'],
				'trade_id': trading_robot.trades['long_exit'].trade_id
			},
		}
	}
Esempio n. 2
0
def sell_out_trade_to_execute(trading_symbol: str, trading_robot: PyRobot):
	# Set the cancel time to 1 day out
	gtc_date = datetime.now() - timedelta(days=1)
	# Create a new Trade Object for Exiting position
	new_exit_trade = trading_robot.create_trade(
		trade_id='sell_out_exit',
		enter_or_exit='exit',
		long_or_short='long',
		order_type='mkt'
	)
	# Make the trade good till cancel
	new_exit_trade.good_till_cancel(gtc_date)

	# todo set the quantity to be the currently held quantity
	# Add an Order Leg
	new_exit_trade.instrument(
		symbol=trading_symbol,
		quantity=1,
		asset_type='EQUITY'
	)

	return {
		trading_symbol: {
			'buy': {},
			'sell': {
				'trade_func': trading_robot.trades['sell_out_exit'],
				'trade_id': trading_robot.trades['sell_out_exit'].trade_id
			},
		}
	}
Esempio n. 3
0
pprint.pprint(current_quotes)

# Let's see if our Microsoft Position is profitable.
is_msft_porfitable = trading_robot.portfolio.is_profitable(
    symbol="MSFT", current_price=current_quotes['MSFT']['lastPrice'])
print("Is Microsoft Profitable: {answer}".format(answer=is_msft_porfitable))

# Let's get the projected Market Value.
portfolio_summary = trading_robot.portfolio.projected_market_value(
    current_prices=current_quotes)
pprint.pprint(portfolio_summary)

# Create a new Trade Object.
new_trade = trading_robot.create_trade(trade_id='long_msft',
                                       enter_or_exit='enter',
                                       long_or_short='short',
                                       order_type='lmt',
                                       price=150.00)

# Make it Good Till Cancel.
new_trade.good_till_cancel(cancel_time=datetime.now())

# Change the session
new_trade.modify_session(session='am')

# Add an Order Leg.
new_trade.instrument(symbol='MSFT', quantity=2, asset_type='EQUITY')

# Add a Stop Loss Order with the Main Order.
new_trade.add_stop_loss(stop_size=.10, percentage=False)
Esempio n. 4
0
# pprint.pprint(trading_robot.grab_current_quotes())
# pprint.pprint(trading_robot.grab_single_current_quote())
# Grab historical prices of all symbols in portfolio
historical_prices = trading_robot.grab_historical_prices()

# Convert data into a StockFrame
stock_frame = trading_robot.create_stock_frame(data=historical_prices['aggregated'])

# Print the head of the StockFrame
# pprint.pprint(stock_frame.frame)

# create a trade
new_trade = trading_robot.create_trade(
    trade_id = 'long_ethusd',
    enter_or_exit = 'enter',
    long_or_short= 'long',
    order_type= 'mkt',
    price = 4.0
)

new_trade.good_till_cancel(datetime.now() + timedelta(minutes = 10))

new_trade.instrument(
    symbol = 'ethusd',
    quantity = 2,
    asset_type = 'altcoin'
)

new_trade.add_stop_loss(
    stop_size = 0.10,
    percentage = False
class PyRobotSession(TestCase):
    """Will perform a unit test for the Azure session."""
    def setUp(self) -> None:
        """Set up the Robot."""

        # Grab configuration values.
        config = ConfigParser()
        config.read('configs/config.ini')

        CLIENT_ID = config.get('main', 'CLIENT_ID')
        REDIRECT_URI = config.get('main', 'REDIRECT_URI')
        CREDENTIALS_PATH = config.get('main', 'JSON_PATH')
        self.ACCOUNT_NUMBER = config.get('main', 'ACCOUNT_NUMBER')

        self.robot = PyRobot(client_id=CLIENT_ID,
                             redirect_uri=REDIRECT_URI,
                             credentials_path=CREDENTIALS_PATH)

    def test_create_new_market_order(self):
        """Create a new market order."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='short',
                                            order_type='mkt')

        self.assertIsInstance(new_trade, Trade)
        self.assertEqual(new_trade.order_type, 'mkt')

    def test_create_new_limit_order(self):
        """Create a new limit order."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='short',
                                            order_type='lmt')

        self.assertIsInstance(new_trade, Trade)
        self.assertEqual(new_trade.order_type, 'lmt')

    def test_create_new_stop_order(self):
        """Create a new stop order."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='short',
                                            order_type='stop')

        self.assertIsInstance(new_trade, Trade)
        self.assertEqual(new_trade.order_type, 'stop')

    def test_add_instrument(self):
        """Tests adding an instrument to an order after creating it."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='long',
                                            order_type='lmt',
                                            price=12.00)

        # Define the Order Leg it should be.
        order_leg = {
            "instruction": 'BUY',
            "quantity": 2,
            "instrument": {
                "symbol": 'MSFT',
                "assetType": 'EQUITY'
            }
        }

        # Add an instrument to the Trade.
        new_trade.instrument(symbol='MSFT', quantity=2, asset_type='EQUITY')
        self.assertDictEqual(new_trade.order['orderLegCollection'][0],
                             order_leg)

    def test_add_stop_loss_percentage(self):
        """Tests adding a stop Loss Order to an exisiting Limit Order."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='long',
                                            order_type='lmt',
                                            price=12.00)
        new_trade.instrument(symbol='MSFT', quantity=2, asset_type='EQUITY')
        new_trade.add_stop_loss(stop_size=.10, percentage=True)

        stop_loss_order = {
            "orderType":
            "STOP",
            "session":
            "NORMAL",
            "duration":
            "DAY",
            "stopPrice":
            10.8,
            "orderStrategyType":
            "SINGLE",
            "orderLegCollection": [{
                "instruction": 'SELL',
                "quantity": 2,
                "instrument": {
                    "symbol": 'MSFT',
                    "assetType": 'EQUITY'
                }
            }]
        }

        self.assertEqual(new_trade.order_type, 'lmt')
        self.assertIn('childOrderStrategies', new_trade.order)
        self.assertDictEqual(new_trade.stop_loss_order, stop_loss_order)

    def test_add_stop_loss_dollar(self):
        """Tests adding a stop Loss Order to an exisiting Limit Order."""

        # Create a new Trade Object.
        new_trade = self.robot.create_trade(enter_or_exit='enter',
                                            long_or_short='long',
                                            order_type='lmt',
                                            price=12.00)
        new_trade.instrument(symbol='MSFT', quantity=2, asset_type='EQUITY')
        new_trade.add_stop_loss(stop_size=.10, percentage=False)

        stop_loss_order = {
            "orderType":
            "STOP",
            "session":
            "NORMAL",
            "duration":
            "DAY",
            "stopPrice":
            11.90,
            "orderStrategyType":
            "SINGLE",
            "orderLegCollection": [{
                "instruction": 'SELL',
                "quantity": 2,
                "instrument": {
                    "symbol": 'MSFT',
                    "assetType": 'EQUITY'
                }
            }]
        }

        self.assertEqual(new_trade.order_type, 'lmt')
        self.assertIn('childOrderStrategies', new_trade.order)
        self.assertDictEqual(new_trade.stop_loss_order, stop_loss_order)

    # def test_price_calculation(self):
    #     """Tests calculating the new price for Stop Orders."""

    #     new_price = Trade()._calculate_new_price(price=12.00,adjustment=.1, percentage=True)

    def tearDown(self) -> None:
        """Teardown the Robot."""

        self.robot = None
class PyRobotTest(TestCase):
    """Will perform a unit test for the PyRobot Object."""
    def setUp(self) -> None:
        """Set up the Robot."""

        # Grab configuration values.
        config = ConfigParser()
        config.read('configs/config.ini')

        CLIENT_ID = config.get('main', 'CLIENT_ID')
        REDIRECT_URI = config.get('main', 'REDIRECT_URI')
        CREDENTIALS_PATH = config.get('main', 'JSON_PATH')
        self.ACCOUNT_NUMBER = config.get('main', 'ACCOUNT_NUMBER')

        self.robot = PyRobot(client_id=CLIENT_ID,
                             redirect_uri=REDIRECT_URI,
                             credentials_path=CREDENTIALS_PATH)

    def test_creates_instance_of_session(self):
        """Create an instance and make sure it's a robot."""

        self.assertIsInstance(self.robot, PyRobot)

    def test_create_portofolio(self):
        """Call `create_portfolio` and make sure it's a Portfolio."""

        new_portfolio = self.robot.create_portfolio()

        self.assertIsInstance(new_portfolio, Portfolio)

    def test_regular_market_open(self):
        """Tests whether Market is Open"""

        right_now = datetime.now().replace(tzinfo=timezone.utc).timestamp()
        regular_market_start_time = datetime.now().replace(
            hour=14, minute=30, second=00, tzinfo=timezone.utc).timestamp()
        regular_market_end_time = datetime.now().replace(
            hour=21, minute=00, second=00, tzinfo=timezone.utc).timestamp()

        if regular_market_end_time >= right_now >= regular_market_start_time:
            open = True
        else:
            open = False

        self.assertEqual(open, self.robot.regular_market_open)
        """
        Pre
        09:00
        14:30

        Regular
        14:30
        21:00

        Post
        21:00
        01:00
        """

    def test_pre_market_open(self):
        """Tests whether US Pre-Market is Open"""

        right_now = datetime.now().replace(tzinfo=timezone.utc).timestamp()
        pre_market_start_time = datetime.now().replace(
            hour=9, minute=00, second=00, tzinfo=timezone.utc).timestamp()
        pre_market_end_time = datetime.now().replace(
            hour=14, minute=30, second=00, tzinfo=timezone.utc).timestamp()

        if pre_market_end_time >= right_now >= pre_market_start_time:
            open = True
        else:
            open = False

        self.assertEqual(open, self.robot.pre_market_open)

    def test_post_market_open(self):
        """Tests whether US Post-Market is Open"""

        right_now = datetime.now().replace(tzinfo=timezone.utc).timestamp()
        post_market_start_time = datetime.now().replace(
            hour=21, minute=00, second=00, tzinfo=timezone.utc).timestamp()
        post_market_end_time = datetime.now().replace(
            hour=1, minute=00, second=00, tzinfo=timezone.utc).timestamp()

        if post_market_end_time >= right_now >= post_market_start_time:
            open = True
        else:
            open = False

        self.assertEqual(open, self.robot.post_market_open)

    def test_historical_prices(self):
        """Tests Grabbing historical prices."""

        # Grab historical prices, first define the start date and end date.
        start_date = datetime.today()
        end_date = start_date - timedelta(days=30)

        # Grab the historical prices.
        self.robot.grab_historical_prices(start=end_date,
                                          end=start_date,
                                          bar_size=1,
                                          bar_type='minute',
                                          symbols=['AAPL'])

        self.assertIn('aggregated', self.robot.historical_prices)

    def test_build_portfolio(self):
        """Test building a Portfolio object."""

        # Create a Portfolio
        porfolio_obj = self.robot.create_portfolio()

        self.assertIsInstance(porfolio_obj, Portfolio)

    def test_build_trade(self):
        """Test building a Trade object."""

        # Create a Trade
        trade_obj = self.robot.create_trade(trade_id='long_msft',
                                            enter_or_exit='enter',
                                            long_or_short='short',
                                            order_type='lmt',
                                            price=150.00)

        self.assertIsInstance(trade_obj, Trade)

    def tearDown(self) -> None:
        """Teardown the Robot."""

        self.robot = None