def get_stock_delay_briefs(self, symbols, lang=None): """ query delay quote :param symbols: stock symbol list, like ['AAPL', 'GOOG'] :param lang: language: tigeropen.common.consts.Language: zh_CN,zh_TW,en_US :return: pandas.DataFrame. the columns are as follows: symbol: pre_close: time: last quote change time volume: open: high: low: close: halted: stock status(0: normal 3: suspended 4: delist 7: ipo 8: changed) """ params = MultipleQuoteParams() params.symbols = symbols params.lang = get_enum_value(lang) if lang else get_enum_value( self._lang) request = OpenApiRequest(QUOTE_DELAY, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = DelayBriefsResponse() response.parse_response_content(response_content) if response.is_success(): return response.briefs else: raise ApiException(response.code, response.message) return None
def get_contracts(self, symbol, sec_type=SecurityType.STK, currency=Currency.USD, exchange=None): params = ContractParams() params.account = self._account params.symbol = symbol if sec_type: params.sec_type = sec_type.value if currency: params.currency = currency.value params.exchange = exchange request = OpenApiRequest(CONTRACT, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = ContractsResponse() response.parse_response_content(response_content) if response.is_success(): return response.contracts else: raise ApiException(response.code, response.message) return None
def place_order(self, order): params = PlaceModifyOrderParams() params.account = order.account params.contract = order.contract params.action = order.action params.order_type = order.order_type params.order_id = order.order_id params.quantity = order.quantity params.limit_price = order.limit_price params.aux_price = order.aux_price params.trail_stop_price = order.trail_stop_price params.trailing_percent = order.trailing_percent params.percent_offset = order.percent_offset params.time_in_force = order.time_in_force params.outside_rth = order.outside_rth request = OpenApiRequest(PLACE_ORDER, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OrderIdResponse() response.parse_response_content(response_content) if response.is_success(): return response.order_id == order.order_id else: raise ApiException(response.code, response.message) return False
def get_corporate_split(self, symbols, market, begin_date, end_date): """ 获取公司拆合股数据 :param symbols: 证券代码列表 :param market: 查询的市场. 可选的值为 common.consts.Market 枚举类型, 如 Market.US :param begin_date: 起始时间. 若是时间戳需要精确到毫秒, 为13位整数; 或是日期时间格式的字符串, 如 "2019-01-01" 或 "2019-01-01 12:00:00" :param end_date: 截止时间. 格式同 begin_date :return: pandas.DataFrame, 各 column 的含义如下: symbol: 证券代码 action_type: 固定为 "SPLIT" from_factor: 公司行动前的因子 to_factor: 公司行动后的因子 ratio: 拆合股比例 excute_date: 除权除息日 market: 所属市场 exchange: 所属交易所 """ params = CorporateActionParams() params.action_type = CorporateActionType.SPLIT.value params.symbols = symbols params.market = market.value params.begin_date = begin_date params.end_date = end_date request = OpenApiRequest(CORPORATE_ACTION, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = CorporateSplitResponse() response.parse_response_content(response_content) if response.is_success(): return response.corporate_split else: raise ApiException(response.code, response.message)
def get_financial_report(self, symbols, market, fields, period_type): """ 获取财报数据 :param symbols: :param market: 查询的市场. 可选的值为 common.consts.Market 枚举类型, 如 Market.US :param fields: 查询的字段列表. 可选的项为 common.consts 下的 Income, Balance, CashFlow, BalanceSheetRatio, Growth, Leverage, Profitability 枚举类型. 如 Income.total_revenue :param period_type: 查询的周期类型. 可选的值为 common.consts.FinancialReportPeriodType 枚举类型 :return: pandas.DataFrame, 各 column 的含义如下: symbol: 证券代码 currency: 财报使用的币种 field: 查询的字段名称 value: 字段对应的值 period_end_date: 这条记录对应财报的所属自然季度日期 filing_date: 财报的发布日期 """ params = FinancialReportParams() params.symbols = symbols params.market = market.value params.fields = [ field.value if isinstance(field, enum.Enum) else field for field in fields ] params.period_type = period_type.value request = OpenApiRequest(FINANCIAL_REPORT, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FinancialReportResponse() response.parse_response_content(response_content) if response.is_success(): return response.financial_report else: raise ApiException(response.code, response.message)
def get_current_future_contract(self, future_type, lang=None): """ 查询指定品种的当前合约 :param future_type: 期货合约对应的交易品种, 如 CL :param lang: :return: pandas.DataFrame, 各 column 的含义如下: contract_code: 合约代码 type: 期货合约对应的交易品种, 如 CL name: 期货合约的名称 contract_month: 合约交割月份 currency: 交易的货币 first_notice_date: 第一通知日,合约在第一通知日后无法开多仓。已有的多仓会在第一通知日之前(通常为前三个交易日)被强制平仓。 last_bidding_close_time: 竞价截止时间 last_trading_date: 最后交易日 trade: 是否可交易 continuous: 是否为连续合约 """ params = FutureTypeParams() params.type = future_type params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(FUTURE_CURRENT_CONTRACT, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureContractResponse() response.parse_response_content(response_content) if response.is_success(): return response.contracts else: raise ApiException(response.code, response.message) return None
def get_future_trade_ticks(self, identifiers, begin_index=0, end_index=30, limit=1000): """ 获取期货逐笔成交 :param identifiers: 期货代码列表 :param begin_index: 开始索引 :param end_index: 结束索引 :param limit: 数量限制 :return: pandas.DataFrame, 各 column 含义如下 index: 索引值 time: 成交时间,精确到毫秒的时间戳 price: 成交价格 volume: 成交量 """ params = FutureQuoteParams() params.contract_codes = identifiers params.begin_index = begin_index params.end_index = end_index params.limit = limit request = OpenApiRequest(FUTURE_TICK, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureTradeTickResponse() response.parse_response_content(response_content) if response.is_success(): return response.trade_ticks else: raise ApiException(response.code, response.message)
def get_bars(self, symbols, period=BarPeriod.DAY, begin_time=-1, end_time=-1, right=QuoteRight.BR, limit=251, lang=None): """ 获取K线数据 :param symbols: 股票代码 :param period: day: 日K,week: 周K,month:月K ,year:年K,1min:1分钟,5min:5分钟,15min:15分钟,30min:30分钟,60min:60分钟 :param begin_time: 开始时间 :param end_time: 结束时间 :param right: 复权选项 ,br: 前复权,nr: 不复权 :param limit: 数量限制 :param lang: 语言支持: zh_CN,zh_TW,en_US :return: """ params = MultipleQuoteParams() params.symbols = symbols if period: params.period = period.value params.begin_time = begin_time params.end_time = end_time params.right = right.value params.limit = limit params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(KLINE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = QuoteBarResponse() response.parse_response_content(response_content) if response.is_success(): return response.bars else: raise ApiException(response.code, response.message)
def get_option_chain(self, symbol, expiry): """ 获取美股期权链 :param symbol: 股票代码 :param expiry: 过期日(类似2019-01-04或者1546578000000) :return: """ params = MultipleContractParams() param = SingleContractParams() param.symbol = symbol if isinstance(expiry, six.string_types) and re.match('[0-9]{4}\-[0-9]{2}\-[0-9]{2}', expiry): param.expiry = int(delorean.parse(expiry, timezone=eastern, dayfirst=False).datetime.timestamp() * 1000) else: param.expiry = expiry params.contracts = [param] request = OpenApiRequest(OPTION_CHAIN, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OptionChainsResponse() response.parse_response_content(response_content) if response.is_success(): return response.chain else: raise ApiException(response.code, response.message) return None
def get_contract(self, symbol, sec_type=SecurityType.STK, currency=None, exchange=None, expiry=None, strike=None, right=None): params = ContractParams() params.account = self._account params.symbol = symbol if sec_type: params.sec_type = sec_type.value if currency: params.currency = currency.value if expiry: params.expiry = expiry if strike: params.strike = strike if right: params.right = right params.exchange = exchange request = OpenApiRequest(CONTRACT, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = ContractsResponse() response.parse_response_content(response_content) if response.is_success(): return response.contracts[0] if len(response.contracts) == 1 else None else: raise ApiException(response.code, response.message) return None
def get_open_orders(self, account=None, sec_type=None, market=Market.ALL, symbol=None, start_time=None, end_time=None): """ 获取待成交订单列表 :param account: :param sec_type: :param market: :param symbol: :param start_time: :param end_time: :return: """ params = OrdersParams() params.account = account if account else self._account if sec_type: params.sec_type = sec_type.value params.market = market.value params.symbol = symbol params.start_date = start_time params.end_date = end_time request = OpenApiRequest(ACTIVE_ORDERS, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OrdersResponse() response.parse_response_content(response_content) if response.is_success(): return response.orders else: raise ApiException(response.code, response.message) return None
def get_market_status(self, market=Market.ALL, lang=None): """ 获取市场状态 :param market: US 美股,HK 港股, CN A股,ALL 所有 :param lang: 语言支持: zh_CN,zh_TW,en_US :return: MarketStatus 对象构成的列表. MarketStatus 对象有如下属性: market: 字符串,市场名称 status: 字符串,当前市场所处的状态 open_time: 带 tzinfo 的 datetime 对象,表示最近的开盘、交易时间 """ params = MarketParams() params.market = get_enum_value(market) params.lang = get_enum_value(lang) if lang else get_enum_value( self._lang) request = OpenApiRequest(MARKET_STATE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = MarketStatusResponse() response.parse_response_content(response_content) if response.is_success(): return response.markets else: raise ApiException(response.code, response.message) return None
def get_future_contracts(self, exchange, lang=None): """ 获取交易所下的可交易合约 :param exchange: :param lang: :return: pandas.DataFrame, 各 column 含义如下: contract_code: 合约代码 type: 期货合约对应的交易品种, 如 CL name: 期货合约的名称 contract_month: 合约交割月份 currency: 交易的货币 first_notice_date: 第一通知日,合约在第一通知日后无法开多仓。已有的多仓会在第一通知日之前(通常为前三个交易日)被强制平仓。 last_bidding_close_time: 竞价截止时间 last_trading_date: 最后交易日 trade: 是否可交易 continuous: 是否为连续合约 """ params = FutureExchangeParams() params.exchange_code = exchange params.lang = get_enum_value(lang) if lang else get_enum_value( self._lang) request = OpenApiRequest(FUTURE_CONTRACT_BY_EXCHANGE_CODE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureContractResponse() response.parse_response_content(response_content) if response.is_success(): return response.contracts else: raise ApiException(response.code, response.message) return None
def get_future_exchanges(self, sec_type=SecurityType.FUT, lang=None): """ 获取期货交易所列表 :param sec_type: FUT: 期货; FOP: 期货期权 :param lang: :return: pandas.DataFrame , 各 column 的含义如下: code: 交易所代码 name: 交易所名称 zone: 交易所所在时区 """ params = MarketParams() params.sec_type = get_enum_value(sec_type) params.lang = get_enum_value(lang) if lang else get_enum_value( self._lang) request = OpenApiRequest(FUTURE_EXCHANGE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureExchangeResponse() response.parse_response_content(response_content) if response.is_success(): return response.exchanges else: raise ApiException(response.code, response.message) return None
def get_briefs(self, symbols, include_hour_trading=False, include_ask_bid=False, right=QuoteRight.BR, lang=None): """ 获取股票摘要 :param symbols: 股票代号列表 :param include_hour_trading: 是否包含盘前盘后 :param include_ask_bid: 是否包含买卖盘 :param right: 复权选项 ,br: 前复权,nr: 不复权 :param lang: 语言支持: zh_CN,zh_TW,en_US :return: """ params = MultipleQuoteParams() params.symbols = symbols params.include_hour_trading = include_hour_trading params.include_ask_bid = include_ask_bid params.right = right.value params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(BRIEF, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = QuoteBriefResponse() response.parse_response_content(response_content) if response.is_success(): return response.briefs else: raise ApiException(response.code, response.message) return None
def get_option_bars(self, identifiers, begin_time=-1, end_time=4070880000000): """ 获取K线(DAY)数据 :param identifiers: 期权代码 :param begin_time: 开始时间 :param end_time: 结束时间 :return: """ params = MultipleContractParams() contracts = [] for identifier in identifiers: symbol, expiry, put_call, strike = extract_option_info(identifier) if symbol is None or expiry is None or put_call is None or strike is None: continue param = SingleOptionQuoteParams() param.symbol = symbol param.expiry = int(delorean.parse(expiry, timezone=eastern, dayfirst=False).datetime.timestamp() * 1000) param.put_call = put_call param.strike = strike param.period = BarPeriod.DAY.value param.begin_time = begin_time param.end_time = end_time contracts.append(param) params.contracts = contracts request = OpenApiRequest(OPTION_KLINE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OptionQuoteBarResponse() response.parse_response_content(response_content) if response.is_success(): return response.bars else: raise ApiException(response.code, response.message)
def get_short_interest(self, symbols, lang=None): """ 获取美股的做空数据 :param symbols: 股票代号列表 :param lang: 语言支持: zh_CN,zh_TW,en_US :return: pandas.DataFrame 对象,各 column 含义如下: symbol: 证券代码 settlement_date: 收集信息的时间 short_interest: 未平仓做空股数 avg_daily_volume: 过去一年的日均成交量 days_to_cover: 回补天数。使用最近一次获取的未平仓做空股数/日均成交量得到 percent_of_float: 未平仓股数占流通股本的比重 """ params = MultipleQuoteParams() params.symbols = symbols params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(QUOTE_SHORTABLE_STOCKS, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = ShortInterestResponse() response.parse_response_content(response_content) if response.is_success(): return response.short_interests else: raise ApiException(response.code, response.message) return None
def get_option_trade_ticks(self, identifiers): """ 获取期权逐笔成交 :param identifiers: 期权代码 :return: """ params = MultipleContractParams() contracts = [] for identifier in identifiers: symbol, expiry, put_call, strike = extract_option_info(identifier) if symbol is None or expiry is None or put_call is None or strike is None: continue param = SingleContractParams() param.symbol = symbol param.expiry = int(delorean.parse(expiry, timezone=eastern, dayfirst=False).datetime.timestamp() * 1000) param.put_call = put_call param.strike = strike contracts.append(param) params.contracts = contracts request = OpenApiRequest(OPTION_TRADE_TICK, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OptionTradeTickResponse() response.parse_response_content(response_content) if response.is_success(): return response.trade_ticks else: raise ApiException(response.code, response.message) return None
def get_future_trading_times(self, identifier, trading_date=None): """ 查询指定期货合约的交易时间 :param identifier: 合约代码 :param trading_date: 指定交易日的时间. 若是时间戳需要精确到毫秒, 为13位整数; 或是日期时间格式的字符串, 如 "2019-01-01" 或 "2019-01-01 12:00:00" :return: pandas.DataFrame, 各column含义如下: start: 交易开始时间 end: 交易结束时间 trading: 是否为连续交易 bidding: 是否为竞价交易 zone: 时区 """ params = FutureTradingTimeParams() params.contract_code = identifier params.trading_date = trading_date request = OpenApiRequest(FUTURE_TRADING_DATE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureTradingTimesResponse() response.parse_response_content(response_content) if response.is_success(): return response.trading_times else: raise ApiException(response.code, response.message) return None
def get_future_bars(self, identifiers, period=BarPeriod.DAY, begin_time=-1, end_time=-1, limit=1000): """ 获取期货K线数据 :param identifiers: 期货代码 :param period: day: 日K,week: 周K,month:月K ,year:年K,1min:1分钟,5min:5分钟,15min:15分钟,30min:30分钟,60min:60分钟 :param begin_time: 开始时间 :param end_time: 结束时间 :param limit: 数量限制 :return: """ params = FutureQuoteParams() params.contract_codes = identifiers if period: params.period = period.value params.begin_time = begin_time params.end_time = end_time params.limit = limit request = OpenApiRequest(FUTURE_KLINE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureQuoteBarResponse() response.parse_response_content(response_content) if response.is_success(): return response.bars else: raise ApiException(response.code, response.message)
def get_future_brief(self, identifiers): """ 获取期货最新行情 :param identifiers: 期货代码列表 :return: pandas.DataFrame,各 column 含义如下 identifier: 期货代码 ask_price: 卖价 ask_size: 卖量 bid_price: 买价 bid_size: 买量 pre_close: 前收价 latest_price: 最新价 latest_size: 最新成交量 latest_time: 最新价成交时间 volume: 当日累计成交手数 open_interest: 未平仓合约数量 open: 开盘价 high: 最高价 low: 最低价 limit_up: 涨停价 limit_down: 跌停价 """ params = FutureQuoteParams() params.contract_codes = identifiers request = OpenApiRequest(FUTURE_REAL_TIME_QUOTE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FutureBriefsResponse() response.parse_response_content(response_content) if response.is_success(): return response.briefs else: raise ApiException(response.code, response.message)
def get_corporate_dividend(self, symbols, market, begin_date, end_date): """ 获取公司派息数据 :param symbols: :param market: :param begin_date: :param end_date: :return: """ params = CorporateActionParams() params.action_type = CorporateActionType.DIVIDEND.value params.symbols = symbols params.market = market.value params.begin_date = begin_date params.end_date = end_date request = OpenApiRequest(CORPORATE_ACTION, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = CorporateDividendResponse() response.parse_response_content(response_content) if response.is_success(): return response.corporate_dividend else: raise ApiException(response.code, response.message)
def get_financial_daily(self, symbols, market, fields, begin_date, end_date): """ 获取日级的财务数据 :param symbols: 证券代码列表 :param market: 查询的市场. 可选的值为 common.consts.Market 枚举类型, 如 Market.US :param fields: 查询的字段列表, 可选的项为 common.consts.Valuation 枚举类型, 如 Valuation.shares_outstanding :param begin_date: 开始时间. 如: '2019-01-01' :param end_date: 结束时间. 格式同 begin_date :return: pandas.DataFrame, 各 column 的含义如下: symbol: 证券代码 field: 查询的字段名称 date: 查询的日期 value: 字段对应的值 """ params = FinancialDailyParams() params.symbols = symbols params.market = market.value params.fields = [ field.value if isinstance(field, enum.Enum) else field for field in fields ] params.begin_date = begin_date params.end_date = end_date request = OpenApiRequest(FINANCIAL_DAILY, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FinancialDailyResponse() response.parse_response_content(response_content) if response.is_success(): return response.financial_daily else: raise ApiException(response.code, response.message)
def get_financial_daily(self, symbols, market, fields, begin_date, end_date): """ 获取日级的财务数据 :param symbols: :param market: :param fields: :param begin_date: :param end_date: :return: """ params = FinancialDailyParams() params.symbols = symbols params.market = market.value params.fields = [field.value if isinstance(field, enum.Enum) else field for field in fields] params.begin_date = begin_date params.end_date = end_date request = OpenApiRequest(FINANCIAL_DAILY, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = FinancialDailyResponse() response.parse_response_content(response_content) if response.is_success(): return response.financial_daily else: raise ApiException(response.code, response.message)
def get_orders(self, sec_type=SecurityType.ALL, market=Market.ALL, symbol=None, start_time=None, end_time=None, limit=100, is_brief=False): params = OrdersParams() params.account = self._account params.sec_type = sec_type.value params.market = market.value params.symbol = symbol params.start_data = start_time params.end_date = end_time params.limit = limit params.is_brief = is_brief request = OpenApiRequest(ORDERS, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OrdersResponse() response.parse_response_content(response_content) if response.is_success(): return response.orders else: raise ApiException(response.code, response.message) return None
def get_timeline(self, symbol, include_hour_trading=False, begin_time=-1, period=TimelinePeriod.DAY, lang=None): """ 获取分时数据 :param symbol: 股票代码 :param include_hour_trading: 是否包含盘前盘后分时 :param begin_time: 开始时间 :param period: 分时 :day,5日分时: 5day :param lang: 语言支持: zh_CN,zh_TW,en_US :return: """ params = SingleQuoteParams() params.symbol = symbol params.include_hour_trading = include_hour_trading params.begin_time = begin_time params.period = period.value params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(TIMELINE, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = QuoteTimelineResponse() response.parse_response_content(response_content) if response.is_success(): if include_hour_trading: return response.pre_market, response.regular, response.after_hours else: return response.regular else: raise ApiException(response.code, response.message) print(response_content)
def get_positions(self, sec_type=SecurityType.STK, currency=Currency.ALL, market=Market.ALL, symbol=None, sub_accounts=None): params = PositionParams() params.account = self._account if sec_type: params.sec_type = sec_type.value params.sub_accounts = sub_accounts if currency: params.currency = currency.value if market: params.market = market.value params.symbol = symbol request = OpenApiRequest(POSITIONS, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = PositionsResponse() response.parse_response_content(response_content) if response.is_success(): return response.positions else: raise ApiException(response.code, response.message) return None
def get_trade_ticks(self, symbol, begin_index=0, end_index=30, limit=30, lang=None): """ 获取逐笔成交 :param symbol: 股票代码 :param begin_index: 开始索引 :param end_index: 结束索引 :param limit: 数量限制 :param lang: 语言支持: zh_CN,zh_TW,en_US :return: """ params = SingleQuoteParams() params.symbol = symbol params.begin_index = begin_index params.end_index = end_index params.limit = limit params.lang = lang.value if lang else self._lang.value request = OpenApiRequest(TRADE_TICK, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = TradeTickResponse() response.parse_response_content(response_content) if response.is_success(): return response.trade_ticks else: raise ApiException(response.code, response.message) return None
def modify_order(self, order, quantity=None, limit_price=None, aux_price=None, trail_stop_price=None, trailing_percent=None, percent_offset=None, time_in_force=None, outside_rth=None): params = PlaceModifyOrderParams() params.account = order.account params.order_id = order.order_id params.contract = order.contract params.action = order.action params.order_type = order.order_type params.quantity = quantity if quantity is not None else order.quantity params.limit_price = limit_price if limit_price is not None else order.limit_price params.aux_price = aux_price if aux_price is not None else order.aux_price params.trail_stop_price = trail_stop_price if trail_stop_price is not None else order.trail_stop_price params.trailing_percent = trailing_percent if trailing_percent is not None else order.trailing_percent params.percent_offset = percent_offset if percent_offset is not None else order.percent_offset params.time_in_force = time_in_force if time_in_force is not None else order.time_in_force params.outside_rth = outside_rth if outside_rth is not None else order.outside_rth request = OpenApiRequest(MODIFY_ORDER, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = OrderIdResponse() response.parse_response_content(response_content) if response.is_success(): return response.order_id == order.order_id else: raise ApiException(response.code, response.message) return False
def get_contracts(self, symbol, sec_type=SecurityType.STK, currency=None, exchange=None): """ 批量获取合约 :param symbol: :param sec_type: :param currency: :param exchange: :return: 合约对象列表, 每个列表项的对象信息同 get_contract 返回 """ params = ContractParams() params.account = self._account params.symbols = symbol if isinstance(symbol, list) else [symbol] if sec_type: params.sec_type = sec_type.value if currency: params.currency = currency.value params.exchange = exchange request = OpenApiRequest(CONTRACTS, biz_model=params) response_content = self.__fetch_data(request) if response_content: response = ContractsResponse() response.parse_response_content(response_content) if response.is_success(): return response.contracts else: raise ApiException(response.code, response.message) return None