docstr: Place an order.
  
  Parameters
  ----------
  asset : catalyst.assets.Asset
      The asset that this order is for.
  amount : int
      The amount of assets to order. If ``amount`` is positive, this is
      the number of assets to buy or cover. If ``amount`` is negative,
      this is the number of assets to sell.
  style : catalyst.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",":","catalyst.assets.Asset","The","asset","that","this","order","is","for",".","amount",":","int","The","amount","of","assets","to","order",".","If","``","amount","``","is","positive",",","this","is","the","number","of","assets","to","buy","or","cover",".","If","``","amount","``","is","negative",",","this","is","the","number","of","assets","to","sell",".","style",":","catalyst.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 : catalyst.assets.Asset
          The asset that this order is for.
      amount : int
          The amount of assets to order. If ``amount`` is positive, this is
          the number of assets to buy or cover. If ``amount`` is negative,
          this is the number of assets to sell.
      style : catalyst.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 catalyst.assets import Equity, Future, Asset
  from catalyst.finance.order import Order
  from catalyst.finance.slippage import DEFAULT_FUTURE_VOLUME_SLIPPAGE_BAR_LIMIT, VolatilityVolumeShare, VolumeShareSlippage
  from catalyst.finance.commission import DEFAULT_PER_CONTRACT_COST, FUTURE_EXCHANGE_FEES_BY_SYMBOL, PerContract, PerShare
  from catalyst.finance.cancel_policy import NeverCancel
  from catalyst.utils.input_validation import expect_types
  from catalyst.constants import LOG_LEVEL
label_desc: Use image node_id 4 for calling the Blotter obj's underlying member method code with example usage: obj.order(asset, amount, style, order_id) and returns: order, None