class_docstr: A class for using a binary operation for criteria.
  
  Parameters
  ----------
  left : `Callable[[Order, Exchange], bool]`
      The left criteria argument.
  right : `Callable[[Order, Exchange], bool]`
      The right criteria argument.
  op : `Callable[[bool, bool], bool]`
      The binary boolean operation.
  op_str : str
      The string representing the op.
class_docstr_tok: ["A","class","for","using","a","binary","operation","for","criteria",".","Parameters","--","--","--","--","--","left",":","`","Callable","[","[","Order",",","Exchange","]",",","bool","]","`","The","left","criteria","argument",".","right",":","`","Callable","[","[","Order",",","Exchange","]",",","bool","]","`","The","right","criteria","argument",".","op",":","`","Callable","[","[","bool",",","bool","]",",","bool","]","`","The","binary","boolean","operation",".","op_str",":","str","The","string","representing","the","op","."]
code: def __str__(self) -> str:
      is_left_op = isinstance(self.left, CriteriaBinOp)
      is_right_op = isinstance(self.right, CriteriaBinOp)
  
      if is_left_op and is_right_op:
          return "({}) {} ({})".format(
              self.left, self.op_str, self.right
          )
      elif is_left_op and not is_right_op:
          return "({}) {} {}".format(self.left, self.op_str, self.right)
      elif not is_left_op and is_right_op:
          return "{} {} ({})".format(self.left, self.op_str, self.right)
  
      return "{} {} {}".format(self.left, self.op_str, self.right)
  
imports: import operator
  from abc import abstractmethod, ABCMeta
  from typing import Callable, Union, TypeVar
  from enum import Enum
  from tensortrade.oms.orders import TradeSide, Order
  from tensortrade.oms.exchanges import Exchange
label_desc: Use image node_id 3 for calling the CriteriaBinOp obj's underlying member method code with example usage: obj.__str__() and returns: str, str, str, str