code: def is_stock_tradable(
      self,
      stock_id: str,
      start_time: pd.Timestamp,
      end_time: pd.Timestamp,
      direction: int | None = None,
  ) -> bool:
      # check if stock can be traded
      return not (
          self.check_stock_suspended(stock_id, start_time, end_time)
          or self.check_stock_limit(
              stock_id, start_time, end_time, direction
          )
      )
  
imports: from __future__ import annotations
  from collections import defaultdict
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Type, Union, cast
  from ..utils.index_data import IndexData
  import random
  import numpy
  import pandas
  from qlib.backtest.position import BasePosition
  from ..config import C
  from ..constant import REG_CN, REG_TW
  from ..data.data import D
  from ..log import get_module_logger
  from .decision import Order, OrderDir, OrderHelper
  from .high_performance_ds import BaseQuote, NumpyQuote
label_desc: Use image node_id 8 for calling the Exchange obj's underlying member method code with example usage: obj.is_stock_tradable(stock_id, start_time, end_time, direction) and returns: unknown