Skip to content

Commit

Permalink
BUG: Fix transactions property in alpaca_broker (#109)
Browse files Browse the repository at this point in the history
  • Loading branch information
umitanuki authored and tibkiss committed Jun 19, 2018
1 parent 954c69d commit f8a0866
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 5 deletions.
8 changes: 8 additions & 0 deletions tests/test_live.py
Expand Up @@ -1109,6 +1109,7 @@ def test_orders(self, tradeapi, symbol_lookup):
'filled_at': '2017-06-01T10:05:00-0400',
'submitted_at': '2017-06-01T10:04:30-0400',
'filled_qty': '10',
'filled_avg_price': '210.05',
'failed_at': None,
'canceled_at': None,
'limit_price': '210.32',
Expand All @@ -1125,6 +1126,7 @@ def test_orders(self, tradeapi, symbol_lookup):
'filled_at': None,
'submitted_at': '2017-06-01T10:04:30-0400',
'filled_qty': None,
'filled_avg_price': None,
'failed_at': None,
'canceled_at': None,
'limit_price': '210.32',
Expand All @@ -1141,6 +1143,7 @@ def test_orders(self, tradeapi, symbol_lookup):
'filled_at': None,
'submitted_at': '2017-06-01T10:04:30-0400',
'filled_qty': None,
'filled_avg_price': None,
'failed_at': None,
'canceled_at': '2017-06-01T10:04:31-0400',
'limit_price': '210.32',
Expand All @@ -1157,6 +1160,7 @@ def test_orders(self, tradeapi, symbol_lookup):
'filled_at': None,
'submitted_at': '2017-06-01T10:04:30-0400',
'filled_qty': None,
'filled_avg_price': None,
'failed_at': '2017-06-01T10:04:31-0400',
'canceled_at': None,
'limit_price': '210.32',
Expand All @@ -1182,6 +1186,10 @@ def test_orders(self, tradeapi, symbol_lookup):
trans = broker.orders
assert len(trans) == 4

trans = broker.transactions
assert len(trans) == 1
assert trans[id1].amount == 10

@patch('zipline.gens.brokers.alpaca_broker.symbol_lookup')
@patch('zipline.gens.brokers.alpaca_broker.tradeapi')
def test_portfolio(self, tradeapi, symbol_lookup):
Expand Down
33 changes: 28 additions & 5 deletions zipline/gens/brokers/alpaca_broker.py
Expand Up @@ -20,9 +20,11 @@
LimitOrder,
StopOrder,
StopLimitOrder)
from zipline.finance.transaction import Transaction
from zipline.api import symbol as symbol_lookup
from zipline.errors import SymbolNotFound
import pandas as pd
import numpy as np
import uuid

from logbook import Logger
Expand Down Expand Up @@ -94,6 +96,7 @@ def portfolio(self):
z_portfolio.positions = self.positions
z_portfolio.positions_value = float(
account.portfolio_value) - float(account.cash)
z_portfolio.portfolio_value = float(account.portfolio_value)
return z_portfolio

@property
Expand Down Expand Up @@ -184,15 +187,26 @@ def order(self, asset, amount, style):
def orders(self):
return {
o.client_order_id: self._order2zp(o)
for o in self._api.list_orders()
for o in self._api.list_orders('all')
}

@property
def transactions(self):
return {
o.client_order_id: self._order2zp(o)
for o in self._api.list_orders(status='all')
}
orders = self._api.list_orders(status='closed')
results = {}
for order in orders:
if order.filled_at is None:
continue
tx = Transaction(
asset=symbol_lookup(order.symbol),
amount=int(order.filled_qty),
dt=order.filled_at,
price=float(order.filled_avg_price),
order_id=order.client_order_id,
commission=0.0,
)
results[order.client_order_id] = tx
return results

def cancel_order(self, zp_order_id):
try:
Expand All @@ -218,8 +232,12 @@ def get_spot_value(self, assets, field, dt, data_frequency):
quotes = self._api.list_quotes(symbols)
if assets_is_scalar:
if field == 'price':
if len(quotes) == 0:
return np.nan
return quotes[-1].last
else:
if len(quotes) == 0:
return pd.NaT
return quotes[-1].last_timestamp
else:
return [
Expand All @@ -229,6 +247,8 @@ def get_spot_value(self, assets, field, dt, data_frequency):

bars_list = self._api.list_bars(symbols, '1Min', limit=1)
if assets_is_scalar:
if len(bars_list) == 0:
return np.nan
return bars_list[0].bars[-1]._raw[field]
bars_map = {a.symbol: a for a in bars_list}
return [
Expand All @@ -254,6 +274,9 @@ def get_realtime_bars(self, assets, data_frequency):
for asset in assets if not assets_is_scalar else [assets]:
symbol = asset.symbol
df = bars_map[symbol].df.copy()
if df.index.tz is None:
df.index = df.index.tz_localize(
'utc').tz_convert('America/New_York')
df.columns = pd.MultiIndex.from_product([[asset, ], df.columns])
dfs.append(df)
return pd.concat(dfs, axis=1)

0 comments on commit f8a0866

Please sign in to comment.