code: def handle_execution(self, txn):
      self.cash_flow += self._calculate_execution_cash_flow(txn)
  
      asset = txn.asset
      if isinstance(asset, Future):
          try:
              old_price = self._payout_last_sale_prices[asset]
              pos = self.position_tracker.positions[asset]
              amount = pos.amount
              price = txn.price
              cash_adj = calc_payout(
                  asset.multiplier, amount, old_price, price
              )
              self.adjust_cash(cash_adj)
              if amount + txn.amount == 0:
                  del self._payout_last_sale_prices[asset]
              else:
                  self._payout_last_sale_prices[asset] = price
          except KeyError:
              self._payout_last_sale_prices[asset] = txn.price
  
      if self.keep_transactions:
          try:
              self.processed_transactions[txn.dt].append(txn)
          except KeyError:
              self.processed_transactions[txn.dt] = [txn]
  
imports: from __future__ import division
  import logbook
  import numpy
  from collections import namedtuple
  from catalyst.assets import Future
  from six import itervalues, iteritems
  import catalyst.protocol
  from catalyst.constants import LOG_LEVEL
label_desc: Use image node_id 17 for calling the PerformancePeriod obj's underlying member method code with example usage: obj.handle_execution(txn) without return types