code: def execute_transaction(self, txn):
      # Update Position
      # ----------------
      asset = txn.asset
  
      if asset not in self.positions:
          position = Position(asset)
          self.positions[asset] = position
      else:
          position = self.positions[asset]
  
      position.update(txn)
  
      if position.amount == 0:
          del self.positions[asset]
  
          try:
              # if this position exists in our user-facing dictionary,
              # remove it as well.
              del self._positions_store[asset]
          except KeyError:
              pass
  
imports: from __future__ import division
  import logbook
  import numpy
  from collections import namedtuple
  from math import isnan
  from six import iteritems, itervalues
  from catalyst.finance.performance.position import Position
  from catalyst.finance.transaction import Transaction
  from catalyst.utils.input_validation import expect_types
  import catalyst.protocol
  from catalyst.assets import Future, Asset
  from .position import positiondict
  from catalyst.constants import LOG_LEVEL
label_desc: Use image node_id 3 for calling the PositionTracker obj's underlying member method code with example usage: obj.execute_transaction(txn) without return types