Ejemplo n.º 1
0
    def update(self, order: Dict) -> None:
        """
        Updates this entity with amount and actual open/close rates.
        :param order: order retrieved by exchange.fetch_order()
        :return: None
        """
        order_type = order['type']
        # Ignore open and cancelled orders
        if order['status'] == 'open' or safe_value_fallback(order, 'average', 'price') is None:
            return

        logger.info('Updating trade (id=%s) ...', self.id)

        if order_type in ('market', 'limit') and order['side'] == 'buy':
            # Update open rate and actual amount
            self.open_rate = float(safe_value_fallback(order, 'average', 'price'))
            self.amount = float(safe_value_fallback(order, 'filled', 'amount'))
            self.recalc_open_trade_value()
            if self.is_open:
                logger.info(f'{order_type.upper()}_BUY has been fulfilled for {self}.')
            self.open_order_id = None
        elif order_type in ('market', 'limit') and order['side'] == 'sell':
            if self.is_open:
                logger.info(f'{order_type.upper()}_SELL has been fulfilled for {self}.')
            self.close(safe_value_fallback(order, 'average', 'price'))
        elif order_type in ('stop_loss_limit', 'stop-loss', 'stop-loss-limit', 'stop'):
            self.stoploss_order_id = None
            self.close_rate_requested = self.stop_loss
            if self.is_open:
                logger.info(f'{order_type.upper()} is hit for {self}.')
            self.close(safe_value_fallback(order, 'average', 'price'))
        else:
            raise ValueError(f'Unknown order type: {order_type}')
        cleanup_db()
Ejemplo n.º 2
0
def test_safe_value_fallback():
    dict1 = {'keya': None, 'keyb': 2, 'keyc': 5, 'keyd': None}
    assert safe_value_fallback(dict1, 'keya', 'keyb') == 2
    assert safe_value_fallback(dict1, 'keyb', 'keya') == 2

    assert safe_value_fallback(dict1, 'keyb', 'keyc') == 2
    assert safe_value_fallback(dict1, 'keya', 'keyc') == 5

    assert safe_value_fallback(dict1, 'keyc', 'keyb') == 5

    assert safe_value_fallback(dict1, 'keya', 'keyd') is None

    assert safe_value_fallback(dict1, 'keyNo', 'keyNo') is None
    assert safe_value_fallback(dict1, 'keyNo', 'keyNo', 55) == 55
Ejemplo n.º 3
0
def test_safe_value_fallback():
    dict1 = {'keya': None, 'keyb': 2, 'keyc': 5, 'keyd': None}
    dict2 = {'keya': 20, 'keyb': None, 'keyc': 6, 'keyd': None}
    assert safe_value_fallback(dict1, dict2, 'keya', 'keya') == 20
    assert safe_value_fallback(dict2, dict1, 'keya', 'keya') == 20

    assert safe_value_fallback(dict1, dict2, 'keyb', 'keyb') == 2
    assert safe_value_fallback(dict2, dict1, 'keyb', 'keyb') == 2

    assert safe_value_fallback(dict1, dict2, 'keyc', 'keyc') == 5
    assert safe_value_fallback(dict2, dict1, 'keyc', 'keyc') == 6

    assert safe_value_fallback(dict1, dict2, 'keyd', 'keyd') is None
    assert safe_value_fallback(dict2, dict1, 'keyd', 'keyd') is None
    assert safe_value_fallback(dict2, dict1, 'keyd', 'keyd', 1234) == 1234

    assert safe_value_fallback(dict1, dict2, 'keyNo', 'keyNo') is None
    assert safe_value_fallback(dict2, dict1, 'keyNo', 'keyNo') is None
    assert safe_value_fallback(dict2, dict1, 'keyNo', 'keyNo', 1234) == 1234