# Path: zipline/finance/slippage.py
# class Transaction(object):
# 
#     def __init__(self, sid, amount, dt, price, order_id, commission=None):
#         self.sid = sid
#         self.amount = amount
#         self.dt = dt
#         self.price = price
#         self.order_id = order_id
#         self.commission = commission
#         self.type = DATASOURCE_TYPE.TRANSACTION
# 
#     def __getitem__(self, name):
#         return self.__dict__[name]
# 
#     def to_dict(self):
#         py = copy(self.__dict__)
#         del py['type']
#         return py
# 
# def create_transaction(event, order, price, amount):
# 
#     # floor the amount to protect against non-whole number orders
#     # TODO: Investigate whether we can add a robust check in blotter
#     # and/or tradesimulation, as well.
#     amount_magnitude = int(abs(amount))
# 
#     if amount_magnitude < 1:
#         raise Exception("Transaction magnitude must be at least 1.")
# 
#     transaction = Transaction(
#         sid=event.sid,
#         amount=int(amount),
#         dt=event.dt,
#         price=price,
#         order_id=order.id
#     )
# 
#     return transaction


import collections
import heapq
import logging
import operator
import unittest
import datetime
import pytz
import itertools
import zipline.utils.factory as factory
import zipline.finance.performance as perf
import zipline.utils.math_utils as zp_math
import zipline.protocol
from nose_parameterized import parameterized
from zipline.finance.slippage import Transaction, create_transaction
from zipline.gens.composites import date_sorted_sources
from zipline.finance.trading import SimulationParameters
from zipline.finance.blotter import Order
from zipline.finance import trading
from zipline.protocol import DATASOURCE_TYPE
from zipline.utils.factory import create_random_simulation_parameters
from zipline.protocol import Event
            exp=trades[-1]['price'],
            act=pp.positions[1].last_sale_price)
        )

        self.assertEqual(
            pp.ending_value,
            1100,
            "ending value should be price of last trade times number of \
            shares in position"
        )

        self.assertEqual(pp.pnl, 100, "gain of 1 on 100 shares should be 100")

    def test_short_position(self):
        """verify that the performance period calculates properly for a \
single short-sale transaction"""
        trades = factory.create_trade_history(
            1,
            [10, 10, 10, 11, 10, 9],
            [100, 100, 100, 100, 100, 100],
            onesec,
            self.sim_params
        )

        trades_1 = trades[:-2]

        txn = create_txn(trades[1], 10.0, -100)
        pp = perf.PerformancePeriod(1000.0)

        pp.execute_transaction(txn)

# Path: zipline/finance/slippage.py
# class Transaction(object):
# 
#     def __init__(self, sid, amount, dt, price, order_id, commission=None):
#         self.sid = sid
#         self.amount = amount
#         self.dt = dt
#         self.price = price
#         self.order_id = order_id
#         self.commission = commission
#         self.type = DATASOURCE_TYPE.TRANSACTION
# 
#     def __getitem__(self, name):
#         return self.__dict__[name]
# 
#     def to_dict(self):
#         py = copy(self.__dict__)
#         del py['type']
#         return py
# 
# def create_transaction(event, order, price, amount):
# 
#     # floor the amount to protect against non-whole number orders
#     # TODO: Investigate whether we can add a robust check in blotter
#     # and/or tradesimulation, as well.
#     amount_magnitude = int(abs(amount))
# 
#     if amount_magnitude < 1:
#         raise Exception("Transaction magnitude must be at least 1.")
# 
#     transaction = Transaction(
#         sid=event.sid,
#         amount=int(amount),
#         dt=event.dt,
#         price=price,
#         order_id=order.id
#     )
# 
#     return transaction


# Path: tests/test_perf_tracking.py
import collections
import heapq
import logging
import operator
import unittest
import datetime
import pytz
import itertools
import zipline.utils.factory as factory
import zipline.finance.performance as perf
import zipline.utils.math_utils as zp_math
import zipline.protocol
from nose_parameterized import parameterized
from zipline.finance.slippage import Transaction, create_transaction
from zipline.gens.composites import date_sorted_sources
from zipline.finance.trading import SimulationParameters
from zipline.finance.blotter import Order
from zipline.finance import trading
from zipline.protocol import DATASOURCE_TYPE
from zipline.utils.factory import create_random_simulation_parameters
from zipline.protocol import Event

            exp=trades[-1]['price'],
            act=pp.positions[1].last_sale_price)
        )

        self.assertEqual(
            pp.ending_value,
            1100,
            "ending value should be price of last trade times number of \
            shares in position"
        )

        self.assertEqual(pp.pnl, 100, "gain of 1 on 100 shares should be 100")

    def test_short_position(self):
        """verify that the performance period calculates properly for a \
single short-sale transaction"""
        trades = factory.create_trade_history(
            1,
            [10, 10, 10, 11, 10, 9],
            [100, 100, 100, 100, 100, 100],
            onesec,
            self.sim_params
        )

        trades_1 = trades[:-2]

        txn = create_txn(trades[1], 10.0, -100)
        pp = perf.PerformancePeriod(1000.0)

        pp.execute_transaction(txn)

        for trade in trades_1: