async def test_split_create_new_order():
    config, exchange, trader, symbol = await _get_tools()
    portfolio = trader.get_portfolio()
    order_creator = DailyTradingModeCreator(None)
    last_btc_price = 6943.01

    market_status = exchange.get_market_status(symbol)
    trader.portfolio.portfolio["BTC"] = {
        Portfolio.TOTAL: 2000000001,
        Portfolio.AVAILABLE: 2000000001
    }
    # split orders because order too big and coin price too high
    orders = await order_creator.create_new_order(0.6, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.SHORT)
    assert len(orders) == 11
    adapted_order = orders[0]
    identical_orders = orders[1:]

    assert isinstance(adapted_order, SellLimitOrder)
    assert adapted_order.currency == "BTC"
    assert adapted_order.symbol == "BTC/USDT"
    assert adapted_order.origin_price == 6998.55407999
    assert adapted_order.created_last_price == last_btc_price
    assert adapted_order.order_type == TraderOrderType.SELL_LIMIT
    assert adapted_order.side == TradeOrderSide.SELL
    assert adapted_order.status == OrderStatus.OPEN
    assert adapted_order.exchange == exchange
    assert adapted_order.trader == trader
    assert adapted_order.fee is None
    assert adapted_order.market_total_fees == 0
    assert adapted_order.filled_price == 0
    assert adapted_order.origin_quantity == 51133425.486746
    assert adapted_order.filled_quantity == adapted_order.origin_quantity
    assert adapted_order.is_simulated is True
    assert adapted_order.linked_to is None

    check_order_limits(adapted_order, market_status)

    assert len(adapted_order.linked_orders) == 1
    check_linked_order(adapted_order, adapted_order.linked_orders[0],
                       TraderOrderType.STOP_LOSS, 6595.8595, market_status)

    for order in identical_orders:
        assert isinstance(order, SellLimitOrder)
        assert order.currency == adapted_order.currency
        assert order.symbol == adapted_order.symbol
        assert order.origin_price == adapted_order.origin_price
        assert order.created_last_price == adapted_order.created_last_price
        assert order.order_type == adapted_order.order_type
        assert order.side == adapted_order.side
        assert order.status == adapted_order.status
        assert order.exchange == adapted_order.exchange
        assert order.trader == adapted_order.trader
        assert order.fee == adapted_order.fee
        assert order.market_total_fees == adapted_order.market_total_fees
        assert order.filled_price == adapted_order.filled_price
        assert order.origin_quantity == 142886657.52532542
        assert order.origin_quantity > adapted_order.origin_quantity
        assert order.filled_quantity > adapted_order.filled_quantity
        assert order.is_simulated == adapted_order.is_simulated
        assert order.linked_to == adapted_order.linked_to
        assert len(order.linked_orders) == 1

        check_order_limits(order, market_status)
        check_linked_order(order, order.linked_orders[0],
                           TraderOrderType.STOP_LOSS, 6595.8595, market_status)

    trader.portfolio.portfolio["USDT"] = {
        Portfolio.TOTAL: 20000000000,
        Portfolio.AVAILABLE: 20000000000
    }

    # set btc last price to 6998.55407999 * 0.000001 = 0.00699855408
    exchange.get_exchange().set_recent_trades_multiplier_factor(0.000001)
    # split orders because order too big and too many coins
    orders = await order_creator.create_new_order(-0.6, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.LONG)
    assert len(orders) == 3
    adapted_order = orders[0]
    identical_orders = orders[1:]

    assert isinstance(adapted_order, BuyLimitOrder)
    assert adapted_order.currency == "BTC"
    assert adapted_order.symbol == "BTC/USDT"
    assert adapted_order.origin_price == 0.00688746
    assert adapted_order.created_last_price == 0.0069430099999999995
    assert adapted_order.order_type == TraderOrderType.BUY_LIMIT
    assert adapted_order.side == TradeOrderSide.BUY
    assert adapted_order.status == OrderStatus.OPEN
    assert adapted_order.exchange == exchange
    assert adapted_order.trader == trader
    assert adapted_order.fee is None
    assert adapted_order.market_total_fees == 0
    assert adapted_order.filled_price == 0
    assert adapted_order.origin_quantity == 131640311622.76904
    assert adapted_order.filled_quantity == adapted_order.origin_quantity
    assert adapted_order.is_simulated is True
    assert adapted_order.linked_to is None

    check_order_limits(adapted_order, market_status)

    # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

    for order in identical_orders:
        assert isinstance(order, BuyLimitOrder)
        assert order.currency == adapted_order.currency
        assert order.symbol == adapted_order.symbol
        assert order.origin_price == adapted_order.origin_price
        assert order.created_last_price == adapted_order.created_last_price
        assert order.order_type == adapted_order.order_type
        assert order.side == adapted_order.side
        assert order.status == adapted_order.status
        assert order.exchange == adapted_order.exchange
        assert order.trader == adapted_order.trader
        assert order.fee == adapted_order.fee
        assert order.market_total_fees == adapted_order.market_total_fees
        assert order.filled_price == adapted_order.filled_price
        assert order.origin_quantity == 1000000000000.0
        assert order.origin_quantity > adapted_order.origin_quantity
        assert order.filled_quantity > adapted_order.filled_quantity
        assert order.is_simulated == adapted_order.is_simulated
        assert order.linked_to == adapted_order.linked_to

        check_order_limits(order, market_status)
async def test_valid_create_new_order():
    config, exchange, trader, symbol = await _get_tools()
    portfolio = trader.get_portfolio()
    order_creator = DailyTradingModeCreator(None)

    market_status = exchange.get_market_status(symbol)

    # portfolio: "BTC": 10 "USD": 1000
    last_btc_price = 6943.01

    # order from neutral state
    assert await order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(0, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(-0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None

    # valid sell limit order (price adapted)
    orders = await order_creator.create_new_order(0.65, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.SHORT)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, SellLimitOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == 6995.95045125
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.SELL_LIMIT
    assert order.side == TradeOrderSide.SELL
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 7.6
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    assert len(order.linked_orders) == 1
    check_linked_order(order, order.linked_orders[0],
                       TraderOrderType.STOP_LOSS, 6595.8595, market_status)

    # valid buy limit order with (price and quantity adapted)
    orders = await order_creator.create_new_order(-0.65, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.LONG)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, BuyLimitOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == 6890.06954875
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.BUY_LIMIT
    assert order.side == TradeOrderSide.BUY
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 0.21892522
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

    # valid buy market order with (price and quantity adapted)
    orders = await order_creator.create_new_order(-1, symbol, exchange, trader,
                                                  portfolio,
                                                  EvaluatorStates.VERY_LONG)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, BuyMarketOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == last_btc_price
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.BUY_MARKET
    assert order.side == TradeOrderSide.BUY
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 0.03540179
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    # valid buy market order with (price and quantity adapted)
    orders = await order_creator.create_new_order(1, symbol, exchange, trader,
                                                  portfolio,
                                                  EvaluatorStates.VERY_SHORT)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, SellMarketOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == last_btc_price
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.SELL_MARKET
    assert order.side == TradeOrderSide.SELL
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 2.4
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)
async def test_split_create_new_orders():
    try:
        exchange_manager, trader, symbol, consumer, last_btc_price = await _get_tools(
        )

        # change reference market to get more orders
        exchange_manager.exchange_personal_data.portfolio_manager.reference_market = "USDT"
        exchange_manager.exchange_personal_data.portfolio_manager.reference_market = "USDT"
        market_status = exchange_manager.exchange.get_market_status(
            symbol, with_fixer=False)
        exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio = {
            "BTC": {
                commons_constants.PORTFOLIO_TOTAL: 2000000001,
                commons_constants.PORTFOLIO_AVAILABLE: 2000000001
            }
        }
        exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.last_prices_by_trading_pair[
            symbol] = last_btc_price
        exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.portfolio_current_value = \
            last_btc_price * 2000000001 + 1000

        # split orders because order too big and coin price too high
        orders = await consumer.create_new_orders(
            symbol, 0.6, trading_enums.EvaluatorStates.SHORT.value)
        assert len(orders) == 11
        adapted_order = orders[0]
        identical_orders = orders[1:]

        assert isinstance(adapted_order, trading_personal_data.SellLimitOrder)
        assert adapted_order.currency == "BTC"
        assert adapted_order.symbol == "BTC/USDT"
        assert adapted_order.origin_price == 7065.26855999
        assert adapted_order.created_last_price == last_btc_price
        assert adapted_order.order_type == trading_enums.TraderOrderType.SELL_LIMIT
        assert adapted_order.side == trading_enums.TradeOrderSide.SELL
        assert adapted_order.status == trading_enums.OrderStatus.OPEN
        assert adapted_order.exchange_manager == exchange_manager
        assert adapted_order.trader == trader
        assert adapted_order.fee is None
        assert adapted_order.filled_price == 0
        assert adapted_order.origin_quantity == 64625635.97358092
        assert adapted_order.filled_quantity == adapted_order.origin_quantity
        assert adapted_order.simulated is True
        assert adapted_order.linked_to is None

        trading_mode_test_toolkit.check_order_limits(adapted_order,
                                                     market_status)

        assert len(adapted_order.linked_orders) == 1
        trading_mode_test_toolkit.check_linked_order(
            adapted_order, adapted_order.linked_orders[0],
            trading_enums.TraderOrderType.STOP_LOSS, 6658.73524999,
            market_status)

        for order in identical_orders:
            assert isinstance(order, trading_personal_data.SellLimitOrder)
            assert order.currency == adapted_order.currency
            assert order.symbol == adapted_order.symbol
            assert order.origin_price == adapted_order.origin_price
            assert order.created_last_price == adapted_order.created_last_price
            assert order.order_type == adapted_order.order_type
            assert order.side == adapted_order.side
            assert order.status == adapted_order.status
            assert order.exchange_manager == adapted_order.exchange_manager
            assert order.trader == adapted_order.trader
            assert order.fee == adapted_order.fee
            assert order.filled_price == adapted_order.filled_price
            assert order.origin_quantity == 141537436.47664192
            assert order.origin_quantity > adapted_order.origin_quantity
            assert order.filled_quantity > adapted_order.filled_quantity
            assert order.simulated == adapted_order.simulated
            assert order.linked_to == adapted_order.linked_to
            assert len(order.linked_orders) == 1

            trading_mode_test_toolkit.check_order_limits(order, market_status)
            trading_mode_test_toolkit.check_linked_order(
                order, order.linked_orders[0],
                trading_enums.TraderOrderType.STOP_LOSS, 6658.73524999,
                market_status)

        exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio = {
            "USDT": {
                commons_constants.PORTFOLIO_TOTAL: 40000000000,
                commons_constants.PORTFOLIO_AVAILABLE: 40000000000
            }
        }

        # set btc last price to 6998.55407999 * 0.000001 = 0.00699855408
        trading_api.force_set_mark_price(exchange_manager, symbol,
                                         last_btc_price * 0.000001)
        # split orders because order too big and too many coins
        orders = await consumer.create_new_orders(
            symbol, -0.6, trading_enums.EvaluatorStates.LONG.value)
        assert len(orders) == 3
        adapted_order = orders[0]
        identical_orders = orders[1:]

        assert isinstance(adapted_order, trading_personal_data.BuyLimitOrder)
        assert adapted_order.currency == "BTC"
        assert adapted_order.symbol == "BTC/USDT"
        assert adapted_order.origin_price == 0.00695312
        assert adapted_order.created_last_price == 0.007009194999999998
        assert adapted_order.order_type == trading_enums.TraderOrderType.BUY_LIMIT
        assert adapted_order.side == trading_enums.TradeOrderSide.BUY
        assert adapted_order.status == trading_enums.OrderStatus.OPEN
        assert adapted_order.exchange_manager == exchange_manager
        assert adapted_order.trader == trader
        assert adapted_order.fee is None
        assert adapted_order.filled_price == 0
        assert adapted_order.origin_quantity == 396851564266.65326
        assert adapted_order.filled_quantity == adapted_order.origin_quantity
        assert adapted_order.simulated is True
        assert adapted_order.linked_to is None

        trading_mode_test_toolkit.check_order_limits(adapted_order,
                                                     market_status)

        # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

        for order in identical_orders:
            assert isinstance(order, trading_personal_data.BuyLimitOrder)
            assert order.currency == adapted_order.currency
            assert order.symbol == adapted_order.symbol
            assert order.origin_price == adapted_order.origin_price
            assert order.created_last_price == adapted_order.created_last_price
            assert order.order_type == adapted_order.order_type
            assert order.side == adapted_order.side
            assert order.status == adapted_order.status
            assert order.exchange_manager == adapted_order.exchange_manager
            assert order.trader == adapted_order.trader
            assert order.fee == adapted_order.fee
            assert order.filled_price == adapted_order.filled_price
            assert order.origin_quantity == 1000000000000.0
            assert order.origin_quantity > adapted_order.origin_quantity
            assert order.filled_quantity > adapted_order.filled_quantity
            assert order.simulated == adapted_order.simulated
            assert order.linked_to == adapted_order.linked_to

            trading_mode_test_toolkit.check_order_limits(order, market_status)

            # assert len(order.linked_orders) == 1 # check linked orders when it will be developed
    finally:
        await _stop(exchange_manager)
async def test_valid_create_new_orders_ref_market_as_quote():
    try:
        exchange_manager, trader, symbol, consumer, last_btc_price = await _get_tools(
        )

        exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.last_prices_by_trading_pair[
            symbol] = last_btc_price
        exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.portfolio_current_value = \
            10 + 1000 / last_btc_price

        # portfolio: "BTC": 10 "USD": 1000
        # order from neutral state
        assert await consumer.create_new_orders(
            symbol, -1, trading_enums.EvaluatorStates.NEUTRAL.value) == []
        assert await consumer.create_new_orders(
            symbol, 0.5, trading_enums.EvaluatorStates.NEUTRAL.value) == []
        assert await consumer.create_new_orders(
            symbol, 0, trading_enums.EvaluatorStates.NEUTRAL.value) == []
        assert await consumer.create_new_orders(
            symbol, -0.5, trading_enums.EvaluatorStates.NEUTRAL.value) == []
        assert await consumer.create_new_orders(
            symbol, -1, trading_enums.EvaluatorStates.NEUTRAL.value) == []

        # valid sell limit order (price adapted)
        orders = await consumer.create_new_orders(
            symbol, 0.65, trading_enums.EvaluatorStates.SHORT.value)
        assert len(orders) == 1
        order = orders[0]
        assert isinstance(order, trading_personal_data.SellLimitOrder)
        assert order.currency == "BTC"
        assert order.symbol == "BTC/USDT"
        assert order.origin_price == 7062.64011187
        assert order.created_last_price == last_btc_price
        assert order.order_type == trading_enums.TraderOrderType.SELL_LIMIT
        assert order.side == trading_enums.TradeOrderSide.SELL
        assert order.status == trading_enums.OrderStatus.OPEN
        assert order.exchange_manager == exchange_manager
        assert order.trader == trader
        assert order.fee is None
        assert order.filled_price == 0
        assert order.origin_quantity == 4.4
        assert order.filled_quantity == order.origin_quantity
        assert order.simulated is True
        assert order.linked_to is None

        market_status = exchange_manager.exchange.get_market_status(
            symbol, with_fixer=False)
        trading_mode_test_toolkit.check_order_limits(order, market_status)

        assert len(order.linked_orders) == 1
        trading_mode_test_toolkit.check_linked_order(
            order, order.linked_orders[0],
            trading_enums.TraderOrderType.STOP_LOSS, 6658.73524999,
            market_status)

        # valid buy limit order with (price and quantity adapted)
        orders = await consumer.create_new_orders(
            symbol, -0.65, trading_enums.EvaluatorStates.LONG.value)
        assert len(orders) == 1
        order = orders[0]
        assert isinstance(order, trading_personal_data.BuyLimitOrder)
        assert order.currency == "BTC"
        assert order.symbol == "BTC/USDT"
        assert order.origin_price == 6955.74988812
        assert order.created_last_price == last_btc_price
        assert order.order_type == trading_enums.TraderOrderType.BUY_LIMIT
        assert order.side == trading_enums.TradeOrderSide.BUY
        assert order.status == trading_enums.OrderStatus.OPEN
        assert order.exchange_manager == exchange_manager
        assert order.trader == trader
        assert order.fee is None
        assert order.filled_price == 0
        assert order.origin_quantity == 0.21685799
        assert order.filled_quantity == order.origin_quantity
        assert order.simulated is True
        assert order.linked_to is None

        trading_mode_test_toolkit.check_order_limits(order, market_status)

        # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

        truncated_last_price = trading_personal_data.trunc_with_n_decimal_digits(
            last_btc_price, 8)

        # valid buy market order with (price and quantity adapted)
        orders = await consumer.create_new_orders(
            symbol, -1, trading_enums.EvaluatorStates.VERY_LONG.value)
        assert len(orders) == 1
        order = orders[0]
        assert isinstance(order, trading_personal_data.BuyMarketOrder)
        assert order.currency == "BTC"
        assert order.symbol == "BTC/USDT"
        assert order.origin_price == truncated_last_price
        assert order.created_last_price == truncated_last_price
        assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
        assert order.side == trading_enums.TradeOrderSide.BUY
        assert order.status == trading_enums.OrderStatus.FILLED
        assert order.filled_price == 7009.19499999
        assert order.origin_quantity == 0.07013502
        assert order.filled_quantity == order.origin_quantity
        assert order.simulated is True
        assert order.linked_to is None

        trading_mode_test_toolkit.check_order_limits(order, market_status)

        # valid buy market order with (price and quantity adapted)
        orders = await consumer.create_new_orders(
            symbol, 1, trading_enums.EvaluatorStates.VERY_SHORT.value)
        assert len(orders) == 1
        order = orders[0]
        assert isinstance(order, trading_personal_data.SellMarketOrder)
        assert order.currency == "BTC"
        assert order.symbol == "BTC/USDT"
        assert order.origin_price == truncated_last_price
        assert order.created_last_price == truncated_last_price
        assert order.order_type == trading_enums.TraderOrderType.SELL_MARKET
        assert order.side == trading_enums.TradeOrderSide.SELL
        assert order.status == trading_enums.OrderStatus.FILLED
        assert order.fee
        assert order.filled_price == 7009.19499999
        assert order.origin_quantity == 4.08244671
        assert order.filled_quantity == order.origin_quantity
        assert order.simulated is True
        assert order.linked_to is None

        trading_mode_test_toolkit.check_order_limits(order, market_status)
    finally:
        await _stop(exchange_manager)
async def test_split_create_new_order():
    config, exchange, trader, symbol = await _get_tools()
    portfolio = trader.get_portfolio()

    # change reference market to get more orders
    trader.get_trades_manager().reference_market = "USDT"

    order_creator = DailyTradingModeCreator(None)
    last_btc_price = 7009.194999999998

    market_status = exchange.get_market_status(symbol)
    trader.portfolio.portfolio["BTC"] = {
        Portfolio.TOTAL: 2000000001,
        Portfolio.AVAILABLE: 2000000001
    }
    # split orders because order too big and coin price too high
    orders = await order_creator.create_new_order(0.6, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.SHORT)
    assert len(orders) == 11
    adapted_order = orders[0]
    identical_orders = orders[1:]

    assert isinstance(adapted_order, SellLimitOrder)
    assert adapted_order.currency == "BTC"
    assert adapted_order.symbol == "BTC/USDT"
    assert adapted_order.origin_price == 7065.26855999
    assert adapted_order.created_last_price == last_btc_price
    assert adapted_order.order_type == TraderOrderType.SELL_LIMIT
    assert adapted_order.side == TradeOrderSide.SELL
    assert adapted_order.status == OrderStatus.OPEN
    assert adapted_order.exchange == exchange
    assert adapted_order.trader == trader
    assert adapted_order.fee is None
    assert adapted_order.market_total_fees == 0
    assert adapted_order.filled_price == 0
    assert adapted_order.origin_quantity == 64625635.97358092
    assert adapted_order.filled_quantity == adapted_order.origin_quantity
    assert adapted_order.is_simulated is True
    assert adapted_order.linked_to is None

    check_order_limits(adapted_order, market_status)

    assert len(adapted_order.linked_orders) == 1
    check_linked_order(adapted_order, adapted_order.linked_orders[0],
                       TraderOrderType.STOP_LOSS, 6658.73524999, market_status)

    for order in identical_orders:
        assert isinstance(order, SellLimitOrder)
        assert order.currency == adapted_order.currency
        assert order.symbol == adapted_order.symbol
        assert order.origin_price == adapted_order.origin_price
        assert order.created_last_price == adapted_order.created_last_price
        assert order.order_type == adapted_order.order_type
        assert order.side == adapted_order.side
        assert order.status == adapted_order.status
        assert order.exchange == adapted_order.exchange
        assert order.trader == adapted_order.trader
        assert order.fee == adapted_order.fee
        assert order.market_total_fees == adapted_order.market_total_fees
        assert order.filled_price == adapted_order.filled_price
        assert order.origin_quantity == 141537436.47664192
        assert order.origin_quantity > adapted_order.origin_quantity
        assert order.filled_quantity > adapted_order.filled_quantity
        assert order.is_simulated == adapted_order.is_simulated
        assert order.linked_to == adapted_order.linked_to
        assert len(order.linked_orders) == 1

        check_order_limits(order, market_status)
        check_linked_order(order, order.linked_orders[0],
                           TraderOrderType.STOP_LOSS, 6658.73524999,
                           market_status)

    trader.portfolio.portfolio["USDT"] = {
        Portfolio.TOTAL: 40000000000,
        Portfolio.AVAILABLE: 40000000000
    }

    # set btc last price to 6998.55407999 * 0.000001 = 0.00699855408
    exchange.get_exchange().set_recent_trades_multiplier_factor(0.000001)
    # split orders because order too big and too many coins
    orders = await order_creator.create_new_order(-0.6, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.LONG)
    assert len(orders) == 3
    adapted_order = orders[0]
    identical_orders = orders[1:]

    assert isinstance(adapted_order, BuyLimitOrder)
    assert adapted_order.currency == "BTC"
    assert adapted_order.symbol == "BTC/USDT"
    assert adapted_order.origin_price == 0.00695312
    assert adapted_order.created_last_price == 0.0070091949999999984
    assert adapted_order.order_type == TraderOrderType.BUY_LIMIT
    assert adapted_order.side == TradeOrderSide.BUY
    assert adapted_order.status == OrderStatus.OPEN
    assert adapted_order.exchange == exchange
    assert adapted_order.trader == trader
    assert adapted_order.fee is None
    assert adapted_order.market_total_fees == 0
    assert adapted_order.filled_price == 0
    assert adapted_order.origin_quantity == 396851564266.65326
    assert adapted_order.filled_quantity == adapted_order.origin_quantity
    assert adapted_order.is_simulated is True
    assert adapted_order.linked_to is None

    check_order_limits(adapted_order, market_status)

    # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

    for order in identical_orders:
        assert isinstance(order, BuyLimitOrder)
        assert order.currency == adapted_order.currency
        assert order.symbol == adapted_order.symbol
        assert order.origin_price == adapted_order.origin_price
        assert order.created_last_price == adapted_order.created_last_price
        assert order.order_type == adapted_order.order_type
        assert order.side == adapted_order.side
        assert order.status == adapted_order.status
        assert order.exchange == adapted_order.exchange
        assert order.trader == adapted_order.trader
        assert order.fee == adapted_order.fee
        assert order.market_total_fees == adapted_order.market_total_fees
        assert order.filled_price == adapted_order.filled_price
        assert order.origin_quantity == 1000000000000.0
        assert order.origin_quantity > adapted_order.origin_quantity
        assert order.filled_quantity > adapted_order.filled_quantity
        assert order.is_simulated == adapted_order.is_simulated
        assert order.linked_to == adapted_order.linked_to

        check_order_limits(order, market_status)
async def test_valid_create_new_order_ref_market_as_quote():
    config, exchange, trader, symbol = await _get_tools()
    portfolio = trader.get_portfolio()
    order_creator = DailyTradingModeCreator(None)

    market_status = exchange.get_market_status(symbol)

    # portfolio: "BTC": 10 "USD": 1000
    last_btc_price = 7009.194999999998

    # order from neutral state
    assert await order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(0, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(-0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None
    assert await order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) \
        is None

    # valid sell limit order (price adapted)
    orders = await order_creator.create_new_order(0.65, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.SHORT)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, SellLimitOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == 7062.64011187
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.SELL_LIMIT
    assert order.side == TradeOrderSide.SELL
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 4.4
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    assert len(order.linked_orders) == 1
    check_linked_order(order, order.linked_orders[0],
                       TraderOrderType.STOP_LOSS, 6658.73524999, market_status)

    # valid buy limit order with (price and quantity adapted)
    orders = await order_creator.create_new_order(-0.65, symbol, exchange,
                                                  trader, portfolio,
                                                  EvaluatorStates.LONG)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, BuyLimitOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == 6955.74988812
    assert order.created_last_price == last_btc_price
    assert order.order_type == TraderOrderType.BUY_LIMIT
    assert order.side == TradeOrderSide.BUY
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 0.21685799
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    # assert len(order.linked_orders) == 1  # check linked orders when it will be developed

    truncated_last_price = order_creator._trunc_with_n_decimal_digits(
        last_btc_price, 8)

    # valid buy market order with (price and quantity adapted)
    orders = await order_creator.create_new_order(-1, symbol, exchange, trader,
                                                  portfolio,
                                                  EvaluatorStates.VERY_LONG)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, BuyMarketOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == truncated_last_price
    assert order.created_last_price == truncated_last_price
    assert order.order_type == TraderOrderType.BUY_MARKET
    assert order.side == TradeOrderSide.BUY
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 0.07013502
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)

    # valid buy market order with (price and quantity adapted)
    orders = await order_creator.create_new_order(1, symbol, exchange, trader,
                                                  portfolio,
                                                  EvaluatorStates.VERY_SHORT)
    assert len(orders) == 1
    order = orders[0]
    assert isinstance(order, SellMarketOrder)
    assert order.currency == "BTC"
    assert order.symbol == "BTC/USDT"
    assert order.origin_price == truncated_last_price
    assert order.created_last_price == truncated_last_price
    assert order.order_type == TraderOrderType.SELL_MARKET
    assert order.side == TradeOrderSide.SELL
    assert order.status == OrderStatus.OPEN
    assert order.exchange == exchange
    assert order.trader == trader
    assert order.fee is None
    assert order.market_total_fees == 0
    assert order.filled_price == 0
    assert order.origin_quantity == 4.032
    assert order.filled_quantity == order.origin_quantity
    assert order.is_simulated is True
    assert order.linked_to is None

    check_order_limits(order, market_status)