# 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

        for date, group in grouped_events:
            for event in group:
                perf_tracker.process_event(event)
            msg = perf_tracker.handle_market_close()
            perf_messages.append(msg)

        self.assertEqual(perf_tracker.txn_count, len(txns))
        self.assertEqual(perf_tracker.txn_count, len(orders))

        cumulative_pos = perf_tracker.cumulative_performance.positions[sid]
        expected_size = len(txns) / 2 * -25
        self.assertEqual(cumulative_pos.amount, expected_size)

        self.assertEqual(len(perf_messages),
                         sim_params.days_in_period)

    def trades_with_txns(self, events, no_txn_dt):
        for event in events:

            # create a transaction for all but
            # first trade in each sid, to simulate None transaction
            if event.dt != no_txn_dt:
                order = Order(
                    sid=event.sid,
                    amount=-25,
                    dt=event.dt
                )
                yield order
                yield event

# 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


        for date, group in grouped_events:
            for event in group:
                perf_tracker.process_event(event)
            msg = perf_tracker.handle_market_close()
            perf_messages.append(msg)

        self.assertEqual(perf_tracker.txn_count, len(txns))
        self.assertEqual(perf_tracker.txn_count, len(orders))

        cumulative_pos = perf_tracker.cumulative_performance.positions[sid]
        expected_size = len(txns) / 2 * -25
        self.assertEqual(cumulative_pos.amount, expected_size)

        self.assertEqual(len(perf_messages),
                         sim_params.days_in_period)

    def trades_with_txns(self, events, no_txn_dt):
        for event in events:

            # create a transaction for all but
            # first trade in each sid, to simulate None transaction
            if event.dt != no_txn_dt:
                order = Order(
                    sid=event.sid,
                    amount=-25,
                    dt=event.dt
                )
                yield order
                yield event

                txn = Transaction(