Skip to content

Commit

Permalink
Merge pull request #88 from r0fls/rd/broker-id
Browse files Browse the repository at this point in the history
use broker id for order management
  • Loading branch information
r0fls authored Nov 27, 2024
2 parents 05ee06f + f3d535e commit 2e43bdb
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 2 deletions.
4 changes: 4 additions & 0 deletions brokers/base_broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -403,13 +403,16 @@ async def _place_order_generic(
response = broker_order_func(
symbol, quantity, side, price, order_type)

broker_id = response.get('order_id', None)

logger.info(
'Order placed successfully',
extra={
'response': response,
'symbol': symbol,
'quantity': quantity,
'side': side,
'broker_id': broker_id,
'strategy': strategy})

# Extract price if not given
Expand All @@ -423,6 +426,7 @@ async def _place_order_generic(
executed_price=price,
side=side,
status='open',
broker_id=broker_id,
timestamp=datetime.now(),
broker=self.broker_name,
strategy=strategy,
Expand Down
10 changes: 9 additions & 1 deletion brokers/tastytrade_broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,9 @@ async def _place_option_order(self, symbol, quantity, side, price=None, order_ty
return {'filled_price': None}

response = account.place_order(self.session, order, dry_run=False)
# TODO: refactor as part of introducing generic order method
if hasattr(response, 'order'):
return response.order
return response

async def _place_order(self, symbol, quantity, side, price=None, order_type='limit'):
Expand Down Expand Up @@ -317,7 +320,12 @@ async def _place_order(self, symbol, quantity, side, price=None, order_type='lim
else:
logger.info('Order likely still open', extra={
'order_data': response, 'symbol': symbol, 'quantity': quantity, 'side': side, 'price': price, 'order_type': order_type})
return {'filled_price': price, 'order_id': getattr(response, 'id', 0)}
if hasattr(response, 'order'):
return {'filled_price': price, 'order_id': response.order.id}
else:
logger.error('Order placement failed', extra={'response': str(
response), 'symbol': symbol, 'quantity': quantity, 'side': side, 'price': price, 'order_type': order_type})
return response

except Exception as e:
logger.error('Failed to place order', extra={'error': str(e)})
Expand Down
1 change: 1 addition & 0 deletions brokers/tradier_broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ def _place_order(self, symbol, quantity, side, price=None, order_type='limit'):
data = order_json or {}
if data.get('filled_price') is None:
data['filled_price'] = price
data['order_id'] = order_id
logger.info('Order execution complete', extra={'order_data': data})
return data
except Exception as e:
Expand Down
2 changes: 2 additions & 0 deletions database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class Trade(Base):
__tablename__ = 'trades'

id = Column(Integer, primary_key=True)
# TODO: make non-nullable
broker_id = Column(Integer, nullable=True)
symbol = Column(String, nullable=False)
quantity = Column(Integer, nullable=False)
price = Column(Float, nullable=False)
Expand Down
7 changes: 6 additions & 1 deletion order_manager/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ async def reconcile_orders(self, orders):
async def reconcile_order(self, order):
logger.info(f'Reconciling order {order.id}', extra={
'order_id': order.id,
'broker_id': order.broker_id,
'broker': order.broker,
'symbol': order.symbol,
'quantity': order.quantity,
Expand All @@ -43,7 +44,11 @@ async def reconcile_order(self, order):

# If the order is not stale, reconcile it
broker = self.brokers[order.broker]
filled = await broker.is_order_filled(order.id)
if order.broker_id is None:
# If the order has no broker_id, mark it as stale
logger.info(f'Marking order {order.id} as stale, missing broker_id', extra={'order_id': order.id})
await self.db_manager.update_trade_status(order.id, 'stale')
filled = await broker.is_order_filled(order.broker_id)
if filled:
try:
await self.db_manager.set_trade_filled(order.id)
Expand Down

0 comments on commit 2e43bdb

Please sign in to comment.