def get_option_instrument_data(symbol,expirationDate,strike,optionType,info=None): """Returns the option instrument data for the stock option. :param symbol: The ticker of the stock. :type symbol: str :param expirationDate: Represents the expiration date in the format YYYY-MM-DD. :type expirationDate: str :param strike: Represents the price of the option. :type strike: str :param optionType: Can be either 'call' or 'put'. :type optionType: str :param info: Will filter the results to get a specific value. :type info: Optional[str] :returns: Returns a dictionary of key/value pairs for the stock. \ If info parameter is provided, the value of the key that matches info is extracted. """ try: symbol = symbol.upper().strip() optionType = optionType.lower().strip() except AttributeError as message: print(message) return [None] optionID= helper.id_for_option(symbol,expirationDate,strike,optionType) url = urls.option_instruments(optionID) data = helper.request_get(url) return(helper.filter(data,info))
def get_option_market_data(inputSymbols, expirationDate, strikePrice, optionType, info=None): """Returns the option market data for the stock option, including the greeks, open interest, change of profit, and adjusted mark price. :param inputSymbols: The ticker of the stock. :type inputSymbols: str :param expirationDate: Represents the expiration date in the format YYYY-MM-DD. :type expirationDate: str :param strikePrice: Represents the price of the option. :type strikePrice: str :param optionType: Can be either 'call' or 'put'. :type optionType: str :param info: Will filter the results to get a specific value. :type info: Optional[str] :returns: Returns a dictionary of key/value pairs for the stock. \ If info parameter is provided, the value of the key that matches info is extracted. """ try: symbols = helper.inputs_to_set(inputSymbols) if optionType: optionType = optionType.lower().strip() except AttributeError as message: print(message, file=helper.get_output()) return [None] data = [] for symbol in symbols: optionID = helper.id_for_option(symbol, expirationDate, strikePrice, optionType) marketData = get_option_market_data_by_id(optionID) data.append(marketData) return(helper.filter(data, info))
def get_option_market_data(symbol, expiration_date, strike, option_type, info=None): """Returns the option market data for the stock option, including the greeks, open interest, change of profit, and adjusted mark price. :param symbol: The ticker of the stock. :type symbol: str :param expiration_date: Represents the expiration date in the format YYYY-MM-DD. :type expiration_date: str :param strike: Represents the price of the option. :type strike: str :param option_type: Can be either 'call' or 'put'. :type option_type: str :param info: Will data_filter the results to get a specific value. :type info: Optional[str] :returns: Returns a dictionary of key/value pairs for the stock. \ If info parameter is provided, the value of the key that matches info is extracted. """ try: symbol = symbol.upper().strip() option_type = option_type.lower().strip() except AttributeError as message: print(message) return [None] option_id = helper.id_for_option(symbol, expiration_date, strike, option_type) url = urls.marketdata_options(option_id) data = helper.request_get(url) return helper.data_filter(data, info)
def order_option_spread(direction, price, symbol, quantity, spread, timeInForce='gfd'): """Submits a limit order for an option spread. i.e. place a debit / credit spread :param direction: credit or debit spread :type direction: str :param price: The limit price to trigger a trade of the option. :type price: float :param symbol: The stock ticker of the stock to trade. :type symbol: str :param quantity: The number of options to trade. :type quantity: int :param spread: A dictionary of spread options with the following keys: \n - expirationDate: The expiration date of the option in 'YYYY-MM-DD' format.\n - strike: The strike price of the option.\n - optionType: This should be 'call' or 'put' :type spread: dict :param timeInForce: Changes how long the order will be in effect for. 'gtc' = good until cancelled. \ 'gfd' = good for the day. 'ioc' = immediate or cancel. 'opg' execute at opening. :type timeInForce: Optional[str] :returns: Dictionary that contains information regarding the selling of options, \ such as the order id, the state of order (queued,confired,filled, failed, canceled, etc.), \ the price, and the quantity. """ try: symbol = symbol.upper().strip() except AttributeError as message: print(message) return None legs = [] for each in spread: optionID = helper.id_for_option(symbol, each['expirationDate'], each['strike'], each['optionType']) legs.append({'position_effect': each['effect'], 'side' : each['action'], 'ratio_quantity': 1, 'option': urls.option_instruments(optionID)}) payload = { 'account': profiles.load_account_profile(info='url'), 'direction': direction, 'time_in_force': timeInForce, 'legs': legs, 'type': 'limit', 'trigger': 'immediate', 'price': price, 'quantity': quantity, 'override_day_trade_checks': False, 'override_dtbp_checks': False, 'ref_id': str(uuid4()), } url = urls.option_orders() data = helper.request_post(url,payload, json=True) return(data)
def order_sell_option_limit(positionEffect, price, symbol, quantity, expirationDate, strike, optionType='both', timeInForce='gfd'): """Submits a limit order for an option. i.e. place a short call or a short put. :param positionEffect: Either 'open' for a sell to open effect or 'close' for a sell to close effect. :type positionEffect: str :param price: The limit price to trigger a sell of the option. :type price: float :param symbol: The stock ticker of the stock to trade. :type symbol: str :param quantity: The number of options to sell. :type quantity: int :param expirationDate: The expiration date of the option in 'YYYY-MM-DD' format. :type expirationDate: str :param strike: The strike price of the option. :type strike: float :param optionType: This should be 'call' or 'put' :type optionType: str :param timeInForce: Changes how long the order will be in effect for. 'gtc' = good until cancelled. \ 'gfd' = good for the day. 'ioc' = immediate or cancel. 'opg' execute at opening. :type timeInForce: Optional[str] :returns: Dictionary that contains information regarding the selling of options, \ such as the order id, the state of order (queued,confired,filled, failed, canceled, etc.), \ the price, and the quantity. """ try: symbol = symbol.upper().strip() except AttributeError as message: print(message) return None optionID = helper.id_for_option(symbol, expirationDate, strike, optionType) if (positionEffect == 'close'): direction = 'debit' else: direction = 'credit' payload = { 'account': profiles.load_account_profile(info='url'), 'direction': direction, 'time_in_force': timeInForce, 'legs': [ {'position_effect': positionEffect, 'side' : 'sell', 'ratio_quantity': 1, 'option': urls.option_instruments(optionID) }, ], 'type': 'limit', 'trigger': 'immediate', 'price': price, 'quantity': quantity, 'override_day_trade_checks': False, 'override_dtbp_checks': False, 'ref_id': str(uuid4()), } url = urls.option_orders() data = helper.request_post(url, payload, json=True) return(data)
def get_option_historicals(symbol, expirationDate, strike, optionType, span='week', state='expired', tradable='untradable'): """Returns the data that is used to make the graphs. :param symbol: The ticker of the stock. :type symbol: str :param expirationDate: Represents the expiration date in the format YYYY-MM-DD. :type expirationDate: str :param strike: Represents the price of the option. :type strike: str :param optionType: Can be either 'call' or 'put'. :type optionType: str :param span: Sets the range of the data to be either 'day', 'week', 'year', or '5year'. Default is 'week'. :type span: Optional[str] :returns: Returns a list that contains a list for each symbol. \ Each list contains a dictionary where each dictionary is for a different time. """ try: symbol = symbol.upper().strip() optionType = optionType.lower().strip() except AttributeError as message: print(message) return [None] span_check = ['day', 'week', 'year', '5year'] if span not in span_check: print('ERROR: Span must be "day","week","year",or "5year"') return ([None]) if span == 'day': interval = '5minute' elif span == 'week': interval = '10minute' elif span == 'year': interval = 'day' else: interval = 'week' optionID = helper.id_for_option(symbol, expirationDate, strike, optionType, state, tradable) url = urls.option_historicals(optionID) payload = {'span': span, 'interval': interval} data = helper.request_get(url, 'regular', payload) return (data)
def get_option_historicals(symbol, expirationDate, strikePrice, optionType, interval='hour', span='week', bounds='regular', info=None): """Returns the data that is used to make the graphs. :param symbol: The ticker of the stock. :type symbol: str :param expirationDate: Represents the expiration date in the format YYYY-MM-DD. :type expirationDate: str :param strikePrice: Represents the price of the option. :type strikePrice: str :param optionType: Can be either 'call' or 'put'. :type optionType: str :param interval: Interval to retrieve data for. Values are '5minute', '10minute', 'hour', 'day', 'week'. Default is 'hour'. :type interval: Optional[str] :param span: Sets the range of the data to be either 'day', 'week', 'year', or '5year'. Default is 'week'. :type span: Optional[str] :param bounds: Represents if graph will include extended trading hours or just regular trading hours. Values are 'regular', 'trading', and 'extended'. \ regular hours are 6 hours long, trading hours are 9 hours long, and extended hours are 16 hours long. Default is 'regular' :type bounds: Optional[str] :param info: Will filter the results to have a list of the values that correspond to key that matches info. :type info: Optional[str] :returns: Returns a list that contains a list for each symbol. \ Each list contains a dictionary where each dictionary is for a different time. """ try: symbol = symbol.upper().strip() optionType = optionType.lower().strip() except AttributeError as message: print(message, file=helper.get_output()) return [None] interval_check = ['5minute', '10minute', 'hour', 'day', 'week'] span_check = ['day', 'week', 'year', '5year'] bounds_check = ['extended', 'regular', 'trading'] if interval not in interval_check: print( 'ERROR: Interval must be "5minute","10minute","hour","day",or "week"', file=helper.get_output()) return([None]) if span not in span_check: print('ERROR: Span must be "day", "week", "year", or "5year"', file=helper.get_output()) return([None]) if bounds not in bounds_check: print('ERROR: Bounds must be "extended","regular",or "trading"', file=helper.get_output()) return([None]) optionID = helper.id_for_option(symbol, expirationDate, strikePrice, optionType) url = urls.option_historicals(optionID) payload = {'span': span, 'interval': interval, 'bounds': bounds} data = helper.request_get(url, 'regular', payload) if (data == None or data == [None]): return data histData = [] for subitem in data['data_points']: subitem['symbol'] = symbol histData.append(subitem) return(helper.filter(histData, info))