Ejemplo n.º 1
0
    def _get_sell_trade_entry(self, trade: LocalTrade, sell_row: Tuple) -> Optional[LocalTrade]:

        sell = self.strategy.should_sell(trade, sell_row[OPEN_IDX],  # type: ignore
                                         sell_row[DATE_IDX], sell_row[BUY_IDX], sell_row[SELL_IDX],
                                         low=sell_row[LOW_IDX], high=sell_row[HIGH_IDX])

        if sell.sell_flag:
            trade.close_date = sell_row[DATE_IDX]
            trade.sell_reason = sell.sell_type.value
            trade_dur = int((trade.close_date_utc - trade.open_date_utc).total_seconds() // 60)
            closerate = self._get_close_rate(sell_row, trade, sell, trade_dur)

            # Confirm trade exit:
            time_in_force = self.strategy.order_time_in_force['sell']
            if not strategy_safe_wrapper(self.strategy.confirm_trade_exit, default_retval=True)(
                    pair=trade.pair, trade=trade, order_type='limit', amount=trade.amount,
                    rate=closerate,
                    time_in_force=time_in_force,
                    sell_reason=sell.sell_type.value):
                return None

            trade.close(closerate, show_msg=False)
            return trade

        return None
Ejemplo n.º 2
0
    def _get_sell_trade_entry(self, trade: LocalTrade, sell_row: Tuple) -> Optional[LocalTrade]:

        sell = self.strategy.should_sell(trade, sell_row[OPEN_IDX],  # type: ignore
                                         sell_row[DATE_IDX], sell_row[BUY_IDX], sell_row[SELL_IDX],
                                         low=sell_row[LOW_IDX], high=sell_row[HIGH_IDX])
        if sell.sell_flag:

            trade.close_date = sell_row[DATE_IDX]
            trade.sell_reason = sell.sell_type.value
            trade_dur = int((trade.close_date_utc - trade.open_date_utc).total_seconds() // 60)
            closerate = self._get_close_rate(sell_row, trade, sell, trade_dur)
            trade.close(closerate, show_msg=False)
            return trade

        return None
Ejemplo n.º 3
0
    def _get_sell_trade_entry_for_candle(
            self, trade: LocalTrade, sell_row: Tuple) -> Optional[LocalTrade]:
        sell_candle_time = sell_row[DATE_IDX].to_pydatetime()
        sell = self.strategy.should_sell(
            trade,
            sell_row[OPEN_IDX],  # type: ignore
            sell_candle_time,
            sell_row[BUY_IDX],
            sell_row[SELL_IDX],
            low=sell_row[LOW_IDX],
            high=sell_row[HIGH_IDX])

        if sell.sell_flag:
            trade.close_date = sell_candle_time

            trade_dur = int(
                (trade.close_date_utc - trade.open_date_utc).total_seconds() //
                60)
            closerate = self._get_close_rate(sell_row, trade, sell, trade_dur)

            # Confirm trade exit:
            time_in_force = self.strategy.order_time_in_force['sell']
            if not strategy_safe_wrapper(self.strategy.confirm_trade_exit,
                                         default_retval=True)(
                                             pair=trade.pair,
                                             trade=trade,
                                             order_type='limit',
                                             amount=trade.amount,
                                             rate=closerate,
                                             time_in_force=time_in_force,
                                             sell_reason=sell.sell_reason,
                                             current_time=sell_candle_time):
                return None

            trade.sell_reason = sell.sell_reason

            # Checks and adds an exit tag, after checking that the length of the
            # sell_row has the length for an exit tag column
            if (len(sell_row) > EXIT_TAG_IDX
                    and sell_row[EXIT_TAG_IDX] is not None
                    and len(sell_row[EXIT_TAG_IDX]) > 0):
                trade.sell_reason = sell_row[EXIT_TAG_IDX]

            trade.close(closerate, show_msg=False)
            return trade

        return None
Ejemplo n.º 4
0
    def _get_sell_trade_entry_for_candle(
            self, trade: LocalTrade, sell_row: Tuple) -> Optional[LocalTrade]:

        # Check if we need to adjust our current positions
        if self.strategy.position_adjustment_enable:
            trade = self._get_adjust_trade_entry_for_candle(trade, sell_row)

        sell_candle_time = sell_row[DATE_IDX].to_pydatetime()
        sell = self.strategy.should_sell(
            trade,
            sell_row[OPEN_IDX],  # type: ignore
            sell_candle_time,
            sell_row[BUY_IDX],
            sell_row[SELL_IDX],
            low=sell_row[LOW_IDX],
            high=sell_row[HIGH_IDX])

        if sell.sell_flag:
            trade.close_date = sell_candle_time

            trade_dur = int(
                (trade.close_date_utc - trade.open_date_utc).total_seconds() //
                60)
            closerate = self._get_close_rate(sell_row, trade, sell, trade_dur)
            # call the custom exit price,with default value as previous closerate
            current_profit = trade.calc_profit_ratio(closerate)
            if sell.sell_type in (SellType.SELL_SIGNAL, SellType.CUSTOM_SELL):
                # Custom exit pricing only for sell-signals
                closerate = strategy_safe_wrapper(
                    self.strategy.custom_exit_price,
                    default_retval=closerate)(pair=trade.pair,
                                              trade=trade,
                                              current_time=sell_row[DATE_IDX],
                                              proposed_rate=closerate,
                                              current_profit=current_profit)
            # Use the maximum between close_rate and low as we cannot sell outside of a candle.
            closerate = min(max(closerate, sell_row[LOW_IDX]),
                            sell_row[HIGH_IDX])

            # Confirm trade exit:
            time_in_force = self.strategy.order_time_in_force['sell']
            if not strategy_safe_wrapper(self.strategy.confirm_trade_exit,
                                         default_retval=True)(
                                             pair=trade.pair,
                                             trade=trade,
                                             order_type='limit',
                                             amount=trade.amount,
                                             rate=closerate,
                                             time_in_force=time_in_force,
                                             sell_reason=sell.sell_reason,
                                             current_time=sell_candle_time):
                return None

            trade.sell_reason = sell.sell_reason

            # Checks and adds an exit tag, after checking that the length of the
            # sell_row has the length for an exit tag column
            if (len(sell_row) > EXIT_TAG_IDX
                    and sell_row[EXIT_TAG_IDX] is not None
                    and len(sell_row[EXIT_TAG_IDX]) > 0):
                trade.sell_reason = sell_row[EXIT_TAG_IDX]

            trade.close(closerate, show_msg=False)
            return trade

        return None