def METHOD_NAME(self, action: int):
    """
    Logic for a single step (incrementing one candle in time)
    by the agent
    :param: action: int = the action type that the agent plans
        to take for the current step.
    :returns:
        observation = current state of environment
        step_reward = the reward from `calculate_reward()`
        _done = if the agent "died" or if the candles finished
        info = dict passed back to openai gym lib
    """
    self._done = False
    self._current_tick += 1
    if self._current_tick == self._end_tick:
        self._done = True
    self._update_unrealized_total_profit()
    step_reward = self.calculate_reward(action)
    self.total_reward += step_reward
    self.tensorboard_log(self.actions._member_names_[action], category="actions")
    trade_type = None
    if self.is_tradesignal(action):
        if action == Actions.Neutral.value:
            self._position = Positions.Neutral
            trade_type = "neutral"
            self._last_trade_tick = None
        elif action == Actions.Long_enter.value:
            self._position = Positions.Long
            trade_type = "enter_long"
            self._last_trade_tick = self._current_tick
        elif action == Actions.Short_enter.value:
            self._position = Positions.Short
            trade_type = "enter_short"
            self._last_trade_tick = self._current_tick
        elif action == Actions.Exit.value:
            self._update_total_profit()
            self._position = Positions.Neutral
            trade_type = "exit"
            self._last_trade_tick = None
        else:
            print("case not defined")
        if trade_type is not None:
            self.trade_history.append(
                {'price': self.current_price(), 'index': self._current_tick,
                 'type': trade_type, 'profit': self.get_unrealized_profit()})
    if (self._total_profit < self.max_drawdown or
            self._total_unrealized_profit < self.max_drawdown):
        self._done = True
    self._position_history.append(self._position)
    info = dict(
        tick=self._current_tick,
        action=action,
        total_reward=self.total_reward,
        total_profit=self._total_profit,
        position=self._position.value,
        trade_duration=self.get_trade_duration(),
        current_profit_pct=self.get_unrealized_profit()
    )
    observation = self._get_observation()
    # user can play with time if they want
    truncated = False
    self._update_history(info)
    return observation, step_reward, self._done, truncated, info