全品种通用智能调仓函数

    如果不指定 price, 则相当于下 MarketOrder

    如果 order_book_id 是股票，等同于调用 order_shares

    如果 order_book_id 是期货，则进行智能下单:

        *   quantity 表示调仓量
        *   如果 quantity 为正数，则先平 Sell 方向仓位，再开 Buy 方向仓位
        *   如果 quantity 为负数，则先平 Buy 反向仓位，再开 Sell 方向仓位

    :param order_book_id: 下单标的物
    :type order_book_id: :class:`~Instrument` object | `str`

    :param int quantity: 调仓量

    :param float price: 下单价格

    :param style: 下单类型, 默认是市价单。目前支持的订单类型有 :class:`~LimitOrder` 和 :class:`~MarketOrder`
    :type style: `OrderStyle` object

    :return: list[:class:`~Order`]

    :example:

    ..  code-block:: python3
        :linenos:

        # 当前仓位为0
        # RB1710 多方向调仓2手：调整后变为 BUY 2手
        order('RB1710'， 2)

        # RB1710 空方向调仓3手：先平多方向2手 在开空方向1手，调整后变为 SELL 1手
        order('RB1710', -3)

def order(order_book_id, quantity, price=None, style=None):
    """
    全品种通用智能调仓函数

    如果不指定 price, 则相当于下 MarketOrder

    如果 order_book_id 是股票，等同于调用 order_shares

    如果 order_book_id 是期货，则进行智能下单:

        *   quantity 表示调仓量
        *   如果 quantity 为正数，则先平 Sell 方向仓位，再开 Buy 方向仓位
        *   如果 quantity 为负数，则先平 Buy 反向仓位，再开 Sell 方向仓位

    :param order_book_id: 下单标的物
    :type order_book_id: :class:`~Instrument` object | `str`

    :param int quantity: 调仓量

    :param float price: 下单价格

    :param style: 下单类型, 默认是市价单。目前支持的订单类型有 :class:`~LimitOrder` 和 :class:`~MarketOrder`
    :type style: `OrderStyle` object

    :return: list[:class:`~Order`]

    :example:

    ..  code-block:: python3
        :linenos:

        # 当前仓位为0
        # RB1710 多方向调仓2手：调整后变为 BUY 2手
        order('RB1710'， 2)

        # RB1710 空方向调仓3手：先平多方向2手 在开空方向1手，调整后变为 SELL 1手
        order('RB1710', -3)

    """
    style = cal_style(price, style)
    orders = Environment.get_instance().portfolio.order(order_book_id, quantity, style)

    if isinstance(orders, Order):
        return [orders]
    return orders