docstr: 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))
docstr_tok: ["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",")",")"]
code: def order(self, asset, amount, style, order_id=None):
      """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))
      """
      # something could be done with amount to further divide
      # between buy by share count OR buy shares up to a dollar amount
      # numeric == share count  AND  "$dollar.cents" == cost amount
  
      if amount == 0:
          # Don't bother placing orders for 0 shares.
          return None
      elif amount > self.max_shares:
          # Arbitrary limit of 100 billion (US) shares will never be
          # exceeded except by a buggy algorithm.
          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
  
imports: from logbook import Logger
  from collections import defaultdict
  from copy import copy
  from six import iteritems
  from zipline.assets import Equity, Future, Asset
  from .blotter import Blotter
  from zipline.extensions import register
  from zipline.finance.order import Order
  from zipline.finance.slippage import DEFAULT_FUTURE_VOLUME_SLIPPAGE_BAR_LIMIT, VolatilityVolumeShare, FixedBasisPointsSlippage
  from zipline.finance.commission import DEFAULT_PER_CONTRACT_COST, FUTURE_EXCHANGE_FEES_BY_SYMBOL, PerContract, PerShare
  from zipline.utils.input_validation import expect_types
label_desc: Use image node_id 3 for calling the SimulationBlotter obj's underlying member method code with example usage: obj.order(asset, amount, style, order_id) and returns: order, None