コード例 #1
0
ファイル: backtesting.py プロジェクト: raviv1995/freqtrade
 def _enter_trade(self, pair: str, row: List, max_open_trades: int,
                  open_trade_count: int) -> Optional[LocalTrade]:
     try:
         stake_amount = self.wallets.get_trade_stake_amount(
             pair, max_open_trades - open_trade_count, None)
     except DependencyException:
         return None
     min_stake_amount = self.exchange.get_min_pair_stake_amount(
         pair, row[OPEN_IDX], -0.05)
     if stake_amount and (not min_stake_amount
                          or stake_amount > min_stake_amount):
         # Enter trade
         trade = LocalTrade(
             pair=pair,
             open_rate=row[OPEN_IDX],
             open_date=row[DATE_IDX],
             stake_amount=stake_amount,
             amount=round(stake_amount / row[OPEN_IDX], 8),
             fee_open=self.fee,
             fee_close=self.fee,
             is_open=True,
             exchange='backtesting',
         )
         return trade
     return None
コード例 #2
0
ファイル: backtesting.py プロジェクト: starfoxbeta/freqtrade
    def _enter_trade(self, pair: str, row: List) -> Optional[LocalTrade]:
        try:
            stake_amount = self.wallets.get_trade_stake_amount(pair, None)
        except DependencyException:
            return None
        min_stake_amount = self.exchange.get_min_pair_stake_amount(pair, row[OPEN_IDX], -0.05)

        order_type = self.strategy.order_types['buy']
        time_in_force = self.strategy.order_time_in_force['sell']
        # Confirm trade entry:
        if not strategy_safe_wrapper(self.strategy.confirm_trade_entry, default_retval=True)(
                pair=pair, order_type=order_type, amount=stake_amount, rate=row[OPEN_IDX],
                time_in_force=time_in_force):
            return None

        if stake_amount and (not min_stake_amount or stake_amount > min_stake_amount):
            # Enter trade
            trade = LocalTrade(
                pair=pair,
                open_rate=row[OPEN_IDX],
                open_date=row[DATE_IDX],
                stake_amount=stake_amount,
                amount=round(stake_amount / row[OPEN_IDX], 8),
                fee_open=self.fee,
                fee_close=self.fee,
                is_open=True,
                exchange='backtesting',
            )
            return trade
        return None
コード例 #3
0
ファイル: backtesting.py プロジェクト: donjonson/freqtrade
    def _enter_trade(self, pair: str, row: List) -> Optional[LocalTrade]:
        try:
            stake_amount = self.wallets.get_trade_stake_amount(pair, None)
        except DependencyException:
            return None

        min_stake_amount = self.exchange.get_min_pair_stake_amount(
            pair, row[OPEN_IDX], -0.05) or 0
        max_stake_amount = self.wallets.get_available_stake_amount()

        stake_amount = strategy_safe_wrapper(
            self.strategy.custom_stake_amount, default_retval=stake_amount)(
                pair=pair,
                current_time=row[DATE_IDX].to_pydatetime(),
                current_rate=row[OPEN_IDX],
                proposed_stake=stake_amount,
                min_stake=min_stake_amount,
                max_stake=max_stake_amount)
        stake_amount = self.wallets._validate_stake_amount(
            pair, stake_amount, min_stake_amount)

        if not stake_amount:
            return None

        order_type = self.strategy.order_types['buy']
        time_in_force = self.strategy.order_time_in_force['sell']
        # Confirm trade entry:
        if not strategy_safe_wrapper(
                self.strategy.confirm_trade_entry, default_retval=True)(
                    pair=pair,
                    order_type=order_type,
                    amount=stake_amount,
                    rate=row[OPEN_IDX],
                    time_in_force=time_in_force,
                    current_time=row[DATE_IDX].to_pydatetime()):
            return None

        if stake_amount and (not min_stake_amount
                             or stake_amount > min_stake_amount):
            # Enter trade
            has_buy_tag = len(row) >= BUY_TAG_IDX + 1
            trade = LocalTrade(
                pair=pair,
                open_rate=row[OPEN_IDX],
                open_date=row[DATE_IDX].to_pydatetime(),
                stake_amount=stake_amount,
                amount=round(stake_amount / row[OPEN_IDX], 8),
                fee_open=self.fee,
                fee_close=self.fee,
                is_open=True,
                buy_tag=row[BUY_TAG_IDX] if has_buy_tag else None,
                exchange='backtesting',
            )
            return trade
        return None
コード例 #4
0
    def _enter_trade(
            self,
            pair: str,
            row: Tuple,
            stake_amount: Optional[float] = None,
            trade: Optional[LocalTrade] = None) -> Optional[LocalTrade]:

        # let's call the custom entry price, using the open price as default price
        propose_rate = strategy_safe_wrapper(
            self.strategy.custom_entry_price, default_retval=row[OPEN_IDX])(
                pair=pair,
                current_time=row[DATE_IDX].to_pydatetime(),
                proposed_rate=row[OPEN_IDX])  # default value is the open rate

        # Move rate to within the candle's low/high rate
        propose_rate = min(max(propose_rate, row[LOW_IDX]), row[HIGH_IDX])

        min_stake_amount = self.exchange.get_min_pair_stake_amount(
            pair, propose_rate, -0.05) or 0
        max_stake_amount = self.wallets.get_available_stake_amount()

        pos_adjust = trade is not None
        if not pos_adjust:
            try:
                stake_amount = self.wallets.get_trade_stake_amount(pair, None)
            except DependencyException:
                return trade

            stake_amount = strategy_safe_wrapper(
                self.strategy.custom_stake_amount,
                default_retval=stake_amount)(
                    pair=pair,
                    current_time=row[DATE_IDX].to_pydatetime(),
                    current_rate=propose_rate,
                    proposed_stake=stake_amount,
                    min_stake=min_stake_amount,
                    max_stake=max_stake_amount)

        stake_amount = self.wallets.validate_stake_amount(
            pair, stake_amount, min_stake_amount)

        if not stake_amount:
            # In case of pos adjust, still return the original trade
            # If not pos adjust, trade is None
            return trade

        order_type = self.strategy.order_types['buy']
        time_in_force = self.strategy.order_time_in_force['sell']
        # Confirm trade entry:
        if not pos_adjust:
            if not strategy_safe_wrapper(
                    self.strategy.confirm_trade_entry, default_retval=True)(
                        pair=pair,
                        order_type=order_type,
                        amount=stake_amount,
                        rate=propose_rate,
                        time_in_force=time_in_force,
                        current_time=row[DATE_IDX].to_pydatetime()):
                return None

        if stake_amount and (not min_stake_amount
                             or stake_amount > min_stake_amount):
            amount = round(stake_amount / propose_rate, 8)
            if trade is None:
                # Enter trade
                has_buy_tag = len(row) >= BUY_TAG_IDX + 1
                trade = LocalTrade(
                    pair=pair,
                    open_rate=propose_rate,
                    open_date=row[DATE_IDX].to_pydatetime(),
                    stake_amount=stake_amount,
                    amount=amount,
                    fee_open=self.fee,
                    fee_close=self.fee,
                    is_open=True,
                    buy_tag=row[BUY_TAG_IDX] if has_buy_tag else None,
                    exchange='backtesting',
                    orders=[])

            order = Order(ft_is_open=False,
                          ft_pair=trade.pair,
                          symbol=trade.pair,
                          ft_order_side="buy",
                          side="buy",
                          order_type="market",
                          status="closed",
                          price=propose_rate,
                          average=propose_rate,
                          amount=amount,
                          filled=amount,
                          cost=stake_amount + trade.fee_open)
            trade.orders.append(order)
            if pos_adjust:
                trade.recalc_trade_from_orders()

        return trade
コード例 #5
0
    def _enter_trade(
            self,
            pair: str,
            row: Tuple,
            stake_amount: Optional[float] = None,
            trade: Optional[LocalTrade] = None) -> Optional[LocalTrade]:

        current_time = row[DATE_IDX].to_pydatetime()
        entry_tag = row[BUY_TAG_IDX] if len(row) >= BUY_TAG_IDX + 1 else None
        # let's call the custom entry price, using the open price as default price
        order_type = self.strategy.order_types['buy']
        propose_rate = row[OPEN_IDX]
        if order_type == 'limit':
            propose_rate = strategy_safe_wrapper(
                self.strategy.custom_entry_price,
                default_retval=row[OPEN_IDX])(
                    pair=pair,
                    current_time=current_time,
                    proposed_rate=propose_rate,
                    entry_tag=entry_tag)  # default value is the open rate
            # We can't place orders higher than current high (otherwise it'd be a stop limit buy)
            # which freqtrade does not support in live.
            propose_rate = min(propose_rate, row[HIGH_IDX])

        min_stake_amount = self.exchange.get_min_pair_stake_amount(
            pair, propose_rate, -0.05) or 0
        max_stake_amount = self.wallets.get_available_stake_amount()

        pos_adjust = trade is not None
        if not pos_adjust:
            try:
                stake_amount = self.wallets.get_trade_stake_amount(
                    pair, None, update=False)
            except DependencyException:
                return None

            stake_amount = strategy_safe_wrapper(
                self.strategy.custom_stake_amount,
                default_retval=stake_amount)(pair=pair,
                                             current_time=current_time,
                                             current_rate=propose_rate,
                                             proposed_stake=stake_amount,
                                             min_stake=min_stake_amount,
                                             max_stake=max_stake_amount,
                                             entry_tag=entry_tag)

        stake_amount = self.wallets.validate_stake_amount(
            pair, stake_amount, min_stake_amount)

        if not stake_amount:
            # In case of pos adjust, still return the original trade
            # If not pos adjust, trade is None
            return trade

        time_in_force = self.strategy.order_time_in_force['buy']
        # Confirm trade entry:
        if not pos_adjust:
            if not strategy_safe_wrapper(self.strategy.confirm_trade_entry,
                                         default_retval=True)(
                                             pair=pair,
                                             order_type=order_type,
                                             amount=stake_amount,
                                             rate=propose_rate,
                                             time_in_force=time_in_force,
                                             current_time=current_time,
                                             entry_tag=entry_tag):
                return None

        if stake_amount and (not min_stake_amount
                             or stake_amount > min_stake_amount):
            self.order_id_counter += 1
            amount = round(stake_amount / propose_rate, 8)
            if trade is None:
                # Enter trade
                self.trade_id_counter += 1
                trade = LocalTrade(id=self.trade_id_counter,
                                   open_order_id=self.order_id_counter,
                                   pair=pair,
                                   open_rate=propose_rate,
                                   open_rate_requested=propose_rate,
                                   open_date=current_time,
                                   stake_amount=stake_amount,
                                   amount=amount,
                                   amount_requested=amount,
                                   fee_open=self.fee,
                                   fee_close=self.fee,
                                   is_open=True,
                                   buy_tag=entry_tag,
                                   exchange='backtesting',
                                   orders=[])

            trade.adjust_stop_loss(trade.open_rate,
                                   self.strategy.stoploss,
                                   initial=True)

            order = Order(
                id=self.order_id_counter,
                ft_trade_id=trade.id,
                ft_is_open=True,
                ft_pair=trade.pair,
                order_id=str(self.order_id_counter),
                symbol=trade.pair,
                ft_order_side="buy",
                side="buy",
                order_type=order_type,
                status="open",
                order_date=current_time,
                order_filled_date=current_time,
                order_update_date=current_time,
                price=propose_rate,
                average=propose_rate,
                amount=amount,
                filled=0,
                remaining=amount,
                cost=stake_amount + trade.fee_open,
            )
            if pos_adjust and self._get_order_filled(order.price, row):
                order.close_bt_order(current_time)
            else:
                trade.open_order_id = str(self.order_id_counter)
            trade.orders.append(order)
            trade.recalc_trade_from_orders()

        return trade
コード例 #6
0
    def _enter_trade(self, pair: str, row: List) -> Optional[LocalTrade]:
        try:
            stake_amount = self.wallets.get_trade_stake_amount(pair, None)
        except DependencyException:
            return None
        # let's call the custom entry price, using the open price as default price
        propose_rate = strategy_safe_wrapper(
            self.strategy.custom_entry_price, default_retval=row[OPEN_IDX])(
                pair=pair,
                current_time=row[DATE_IDX].to_pydatetime(),
                proposed_rate=row[OPEN_IDX])  # default value is the open rate

        # Move rate to within the candle's low/high rate
        propose_rate = min(max(propose_rate, row[LOW_IDX]), row[HIGH_IDX])

        min_stake_amount = self.exchange.get_min_pair_stake_amount(
            pair, propose_rate, -0.05) or 0
        max_stake_amount = self.wallets.get_available_stake_amount()

        stake_amount = strategy_safe_wrapper(
            self.strategy.custom_stake_amount, default_retval=stake_amount)(
                pair=pair,
                current_time=row[DATE_IDX].to_pydatetime(),
                current_rate=propose_rate,
                proposed_stake=stake_amount,
                min_stake=min_stake_amount,
                max_stake=max_stake_amount)
        stake_amount = self.wallets.validate_stake_amount(
            pair, stake_amount, min_stake_amount)

        if not stake_amount:
            return None

        order_type = self.strategy.order_types['buy']
        time_in_force = self.strategy.order_time_in_force['sell']
        # Confirm trade entry:
        if not strategy_safe_wrapper(
                self.strategy.confirm_trade_entry, default_retval=True)(
                    pair=pair,
                    order_type=order_type,
                    amount=stake_amount,
                    rate=propose_rate,
                    time_in_force=time_in_force,
                    current_time=row[DATE_IDX].to_pydatetime()):
            return None

        if stake_amount and (not min_stake_amount
                             or stake_amount > min_stake_amount):
            # Enter trade
            has_buy_tag = len(row) >= BUY_TAG_IDX + 1
            trade = LocalTrade(
                pair=pair,
                open_rate=propose_rate,
                open_date=row[DATE_IDX].to_pydatetime(),
                stake_amount=stake_amount,
                amount=round(stake_amount / propose_rate, 8),
                fee_open=self.fee,
                fee_close=self.fee,
                is_open=True,
                buy_tag=row[BUY_TAG_IDX] if has_buy_tag else None,
                exchange='backtesting',
            )
            return trade
        return None