'Place an order.
Parameters
asset : zipline.assets.Asset
The asset that this order is for.
amount : int
The amount of shares to order. If ``amount`` is positive, this is
the number of shares to buy or cover. If ``amount`` is negative,
this is the number of shares to sell or short.
style : zipline.finance.execution.ExecutionStyle
The execution style for the order.
order_id : str, optional
The unique identifier for this order.
Returns
order_id : str or None
The unique identifier for this order, or None if no order was
placed.
Notes
amount > 0 :: Buy/Cover
amount < 0 :: Sell/Short
Market order:    order(asset, amount)
Limit order:     order(asset, amount, style=LimitOrder(limit_price))
Stop order:      order(asset, amount, style=StopOrder(stop_price))
StopLimit order: order(asset, amount, style=StopLimitOrder(limit_price,
stop_price))'

@expect_types(asset=Asset)
def order(self, asset, amount, style, order_id=None):

    if (amount == 0):
        return None
    elif (amount > self.max_shares):
        raise OverflowError(("Can't    order    more    than    %d    shares" % self.max_shares))
    is_buy = (amount > 0)
    order = Order(dt=self.current_dt, asset=asset, amount=amount, stop=style.get_stop_price(is_buy), limit=style.get_limit_price(is_buy), id=order_id)
    self.open_orders[order.asset].append(order)
    self.orders[order.id] = order
    self.new_orders.append(order)
    return order.id
