From 4f52ce99c7e3553ba294cffd9f0078472163f3e3 Mon Sep 17 00:00:00 2001 From: Chihiro Hio Date: Thu, 19 Dec 2024 22:36:14 +0900 Subject: [PATCH] feat: add position_intent into order model --- alpaca/trading/models.py | 3 +++ tests/broker/broker_client/test_trading_routes.py | 5 +++++ tests/common/factories/trading.py | 2 ++ tests/common/test_common_models.py | 2 ++ tests/trading/trading_client/test_order_routes.py | 13 ++++++++++--- .../trading/trading_client/test_position_routes.py | 5 +++++ 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/alpaca/trading/models.py b/alpaca/trading/models.py index c2d28ec3..d32883c5 100644 --- a/alpaca/trading/models.py +++ b/alpaca/trading/models.py @@ -13,6 +13,7 @@ OrderType, OrderClass, PDTCheck, + PositionIntent, TimeInForce, OrderSide, PositionSide, @@ -204,6 +205,7 @@ class Order(ModelWithID): trail_percent (Optional[str]): The percent value away from the high water mark for trailing stop orders. trail_price (Optional[str]): The dollar value away from the high water mark for trailing stop orders. hwm (Optional[str]): The highest (lowest) market price seen since the trailing stop order was submitted. + position_intent (PositionIntent): Represents the desired position strategy. """ client_order_id: str @@ -237,6 +239,7 @@ class Order(ModelWithID): trail_percent: Optional[str] = None trail_price: Optional[str] = None hwm: Optional[str] = None + position_intent: PositionIntent def __init__(self, **data: Any) -> None: if "order_class" not in data or data["order_class"] == "": diff --git a/tests/broker/broker_client/test_trading_routes.py b/tests/broker/broker_client/test_trading_routes.py index 94ec2867..ae3acf8c 100644 --- a/tests/broker/broker_client/test_trading_routes.py +++ b/tests/broker/broker_client/test_trading_routes.py @@ -260,6 +260,7 @@ def test_close_all_positions_for_account(reqmock, client: BrokerClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "subtag": null, "source": null } @@ -336,6 +337,7 @@ def test_close_position_for_account_with_id(reqmock, client: BrokerClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 }} """, @@ -389,6 +391,7 @@ def test_close_position_for_account_with_symbol(reqmock, client: BrokerClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 }} """, @@ -442,6 +445,7 @@ def test_close_position_for_account_with_qty(reqmock, client: BrokerClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -495,6 +499,7 @@ def test_close_position_for_account_with_percentage(reqmock, client: BrokerClien "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, diff --git a/tests/common/factories/trading.py b/tests/common/factories/trading.py index b19b4e1f..c6c22732 100644 --- a/tests/common/factories/trading.py +++ b/tests/common/factories/trading.py @@ -4,6 +4,7 @@ OrderClass, OrderSide, OrderType, + PositionIntent, TimeInForce, ) @@ -72,4 +73,5 @@ def create_dummy_order() -> Order: trail_percent=None, trail_price=None, hwm=None, + position_intent=PositionIntent.BUY_TO_OPEN, ) diff --git a/tests/common/test_common_models.py b/tests/common/test_common_models.py index fbe2cafd..f6613989 100644 --- a/tests/common/test_common_models.py +++ b/tests/common/test_common_models.py @@ -15,6 +15,7 @@ AssetExchange, OrderType, OrderClass, + PositionIntent, TimeInForce, OrderSide, PositionSide, @@ -173,6 +174,7 @@ def test_order_legs(): trail_percent=None, trail_price=None, hwm=None, + position_intent=PositionIntent.BUY_TO_OPEN, ) assert isinstance(order_with_legs.legs, list) diff --git a/tests/trading/trading_client/test_order_routes.py b/tests/trading/trading_client/test_order_routes.py index 39476842..7b369344 100644 --- a/tests/trading/trading_client/test_order_routes.py +++ b/tests/trading/trading_client/test_order_routes.py @@ -61,6 +61,7 @@ def test_market_order(reqmock, trading_client): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -115,7 +116,8 @@ def test_get_orders(reqmock, trading_client: TradingClient): "extended_hours": true, "trail_percent": null, "trail_price": null, - "hwm": "string" + "hwm": "string", + "position_intent": "buy_to_open" } ] """, @@ -168,6 +170,7 @@ def test_get_order_by_id(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -219,6 +222,7 @@ def test_get_order_by_client_id(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -268,6 +272,7 @@ def test_replace_order(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -423,6 +428,7 @@ def test_limit_order(reqmock, trading_client): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -540,8 +546,8 @@ def test_order_position_intent(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, - "commission": 1.25, - "position_intent": "buy_to_open" + "position_intent": "buy_to_open", + "commission": 1.25 } """, ) @@ -597,6 +603,7 @@ def test_order_position_intent(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "sell_to_open", "commission": 1.25 } """, diff --git a/tests/trading/trading_client/test_position_routes.py b/tests/trading/trading_client/test_position_routes.py index 918ba1b6..0999c198 100644 --- a/tests/trading/trading_client/test_position_routes.py +++ b/tests/trading/trading_client/test_position_routes.py @@ -188,6 +188,7 @@ def test_close_all_positions(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "sell_to_close", "subtag": null, "source": null } @@ -263,6 +264,7 @@ def test_close_position_with_id(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 }} """, @@ -315,6 +317,7 @@ def test_close_position_with_symbol(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 }} """, @@ -367,6 +370,7 @@ def test_close_position_with_qty(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """, @@ -419,6 +423,7 @@ def test_close_position_with_percentage(reqmock, trading_client: TradingClient): "trail_percent": null, "trail_price": null, "hwm": null, + "position_intent": "buy_to_open", "commission": 1.25 } """,