class_docstr: Manager for trading calendar
      - BaseStrategy and BaseExecutor will use it
docstr: get the range index which involve start_time~end_time  (both sides are closed)
  
  Parameters
  ----------
  start_time : pd.Timestamp
  end_time : pd.Timestamp
  
  Returns
  -------
  Tuple[int, int]:
      the index of the range.  **the left and right are closed**
docstr_tok: ["get","the","range","index","which","involve","start_time~end_time","(","both","sides","are","closed",")","Parameters","--","--","--","--","--","start_time",":","pd.Timestamp","end_time",":","pd.Timestamp","Returns","--","--","--","-","Tuple","[","int",",","int","]",":","the","index","of","the","range",".","*","*","the","left","and","right","are","closed","*","*"]
code: def get_range_idx(
      self, start_time: pd.Timestamp, end_time: pd.Timestamp
  ) -> Tuple[int, int]:
      """
      get the range index which involve start_time~end_time  (both sides are closed)
  
      Parameters
      ----------
      start_time : pd.Timestamp
      end_time : pd.Timestamp
  
      Returns
      -------
      Tuple[int, int]:
          the index of the range.  **the left and right are closed**
      """
      left = int(
          np.searchsorted(self._calendar, start_time, side="right") - 1
      )
      right = int(
          np.searchsorted(self._calendar, end_time, side="right") - 1
      )
      left -= self.start_index
      right -= self.start_index
  
      def clip(idx: int) -> int:
          return min(max(0, idx), self.trade_len - 1)
  
      return clip(left), clip(right)
  
imports: from __future__ import annotations
  from abc import abstractmethod
  from typing import Any, Set, Tuple, TYPE_CHECKING, Union
  import numpy
  from qlib.utils.time import epsilon_change
  import warnings
  import pandas
  from ..data.data import Cal
label_desc: Use image node_id 11 for calling the TradeCalendarManager obj's underlying member method code with example usage: obj.get_range_idx(start_time, end_time) and returns: clip,  clip, min