Skip to content

Commit 320e1f1

Browse files
authored
Merge pull request #145 from alpacahq/feature/advanced-order-types-2
Add support for advanced order types
2 parents f4c59eb + 3ef66d0 commit 320e1f1

File tree

3 files changed

+46
-9
lines changed

3 files changed

+46
-9
lines changed

README.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,32 @@ You can access the following information through this object.
104104
### REST.get_account()
105105
Calls `GET /account` and returns an `Account` entity.
106106

107-
### REST.list_orders(status=None, limit=None, after=None, until=None, direction=None)
107+
### REST.list_orders(status=None, limit=None, after=None, until=None, direction=None, nested=None)
108108
Calls `GET /orders` and returns a list of `Order` entities.
109109
`after` and `until` need to be string format, which you can obtain by `pd.Timestamp().isoformat()`
110110

111-
### REST.submit_order(symbol, qty, side, type, time_in_force, limit_price=None, stop_price=None, client_order_id=None)
111+
### REST.submit_order(symbol, qty, side, type, time_in_force, limit_price=None, stop_price=None, client_order_id=None, order_class=None, take_profit=None, stop_loss=None)
112112
Calls `POST /orders` and returns an `Order` entity.
113113

114+
Below is an example of submitting a bracket order.
115+
```py
116+
api.submit_order(
117+
symbol='SPY',
118+
side='buy',
119+
type='market',
120+
qty='100',
121+
time_in_force='day',
122+
order_class='bracket',
123+
take_profit=dict(
124+
limit_price='305.0',
125+
),
126+
stop_loss=dict(
127+
stop_price='295.5',
128+
limit_price='295.5',
129+
)
130+
)
131+
```
132+
114133
### REST.get_order_by_client_order_id(client_order_id)
115134
Calls `GET /orders` with client_order_id and returns an `Order` entity.
116135

alpaca_trade_api/entity.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,13 @@ class Asset(Entity):
4848

4949

5050
class Order(Entity):
51-
pass
51+
def __init__(self, raw):
52+
super().__init__(raw)
53+
try:
54+
self.legs = [Order(o) for o in self.legs]
55+
except Exception:
56+
# No order legs existed
57+
pass
5258

5359

5460
class Position(Entity):

alpaca_trade_api/rest.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def update_account_configurations(
197197
return AccountConfigurations(resp)
198198

199199
def list_orders(self, status=None, limit=None, after=None, until=None,
200-
direction=None, params=None):
200+
direction=None, params=None, nested=None):
201201
'''
202202
Get a list of orders
203203
https://docs.alpaca.markets/web-api/orders/#get-a-list-of-orders
@@ -214,12 +214,16 @@ def list_orders(self, status=None, limit=None, after=None, until=None,
214214
params['direction'] = direction
215215
if status is not None:
216216
params['status'] = status
217-
resp = self.get('/orders', params)
217+
if nested is not None:
218+
params['nested'] = nested
219+
url = '/orders'
220+
resp = self.get(url, params)
218221
return [Order(o) for o in resp]
219222

220223
def submit_order(self, symbol, qty, side, type, time_in_force,
221224
limit_price=None, stop_price=None, client_order_id=None,
222-
extended_hours=None):
225+
extended_hours=None, order_class=None,
226+
take_profit=None, stop_loss=None):
223227
'''Request a new order'''
224228
params = {
225229
'symbol': symbol,
@@ -236,19 +240,27 @@ def submit_order(self, symbol, qty, side, type, time_in_force,
236240
params['client_order_id'] = client_order_id
237241
if extended_hours is not None:
238242
params['extended_hours'] = extended_hours
243+
if order_class is not None:
244+
params['order_class'] = order_class
245+
if take_profit is not None:
246+
params['take_profit'] = take_profit
247+
if stop_loss is not None:
248+
params['stop_loss'] = stop_loss
239249
resp = self.post('/orders', params)
240250
return Order(resp)
241251

242252
def get_order_by_client_order_id(self, client_order_id):
243253
'''Get an order by client order id'''
244-
resp = self.get('/orders:by_client_order_id', {
254+
params = {
245255
'client_order_id': client_order_id,
246-
})
256+
}
257+
resp = self.get('/orders:by_client_order_id', params)
247258
return Order(resp)
248259

249260
def get_order(self, order_id):
250261
'''Get an order'''
251-
resp = self.get('/orders/{}'.format(order_id))
262+
params = {}
263+
resp = self.get('/orders/{}'.format(order_id), params)
252264
return Order(resp)
253265

254266
def replace_order(

0 commit comments

Comments
 (0)