2121from coinbaseadvanced .models .products import BidAsksPage , ProductBook , ProductsPage , Product , \
2222 CandlesPage , TradesPage , ProductType , Granularity , GRANULARITY_MAP_IN_MINUTES
2323from coinbaseadvanced .models .accounts import AccountsPage , Account
24- from coinbaseadvanced .models .orders import OrderPlacementSource , OrdersPage , Order , OrderEdit , \
24+ from coinbaseadvanced .models .orders import OrderEditPreview , OrderPlacementSource , OrdersPage , Order , OrderEdit , \
2525 OrderBatchCancellation , FillsPage , Side , StopDirection , OrderType
2626
2727
@@ -161,7 +161,8 @@ def get_account(self, account_id: str) -> Account:
161161 def create_buy_market_order (self ,
162162 client_order_id : str ,
163163 product_id : str ,
164- quote_size : float ) -> Order :
164+ quote_size : float ,
165+ retail_portfolio_id : Optional [str ] = None ) -> Order :
165166 """
166167 https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
167168
@@ -179,12 +180,13 @@ def create_buy_market_order(self,
179180 }
180181 }
181182
182- return self .create_order (client_order_id , product_id , Side .BUY , order_configuration )
183+ return self .create_order (client_order_id , product_id , Side .BUY , order_configuration , retail_portfolio_id )
183184
184185 def create_sell_market_order (self ,
185186 client_order_id : str ,
186187 product_id : str ,
187- base_size : float ) -> Order :
188+ base_size : float ,
189+ retail_portfolio_id : Optional [str ] = None ) -> Order :
188190 """
189191 https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
190192
@@ -202,7 +204,7 @@ def create_sell_market_order(self,
202204 }
203205 }
204206
205- return self .create_order (client_order_id , product_id , Side .SELL , order_configuration )
207+ return self .create_order (client_order_id , product_id , Side .SELL , order_configuration , retail_portfolio_id )
206208
207209 def create_limit_order (
208210 self ,
@@ -212,7 +214,8 @@ def create_limit_order(
212214 limit_price : float ,
213215 base_size : float ,
214216 cancel_time : Optional [datetime ] = None ,
215- post_only : Optional [bool ] = None ) -> Order :
217+ post_only : Optional [bool ] = None ,
218+ retail_portfolio_id : Optional [str ] = None ) -> Order :
216219 """
217220 https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
218221
@@ -245,7 +248,7 @@ def create_limit_order(
245248 else :
246249 order_configuration ['limit_limit_gtc' ] = limit_order_configuration
247250
248- return self .create_order (client_order_id , product_id , side , order_configuration )
251+ return self .create_order (client_order_id , product_id , side , order_configuration , retail_portfolio_id )
249252
250253 def create_stop_limit_order (
251254 self ,
@@ -256,7 +259,8 @@ def create_stop_limit_order(
256259 stop_direction : StopDirection ,
257260 limit_price : float ,
258261 base_size : float ,
259- cancel_time : Optional [datetime ] = None ) -> Order :
262+ cancel_time : Optional [datetime ] = None ,
263+ retail_portfolio_id : Optional [str ] = None ) -> Order :
260264 """
261265 https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
262266
@@ -294,12 +298,13 @@ def create_stop_limit_order(
294298 else :
295299 order_configuration ['stop_limit_stop_limit_gtc' ] = stop_limit_order_configuration
296300
297- return self .create_order (client_order_id , product_id , side , order_configuration )
301+ return self .create_order (client_order_id , product_id , side , order_configuration , retail_portfolio_id )
298302
299303 def create_order (self , client_order_id : str ,
300304 product_id : str ,
301305 side : Side ,
302- order_configuration : dict ) -> Order :
306+ order_configuration : dict ,
307+ retail_portfolio_id : Optional [str ] = None ) -> Order :
303308 """
304309 https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_postorder
305310
@@ -318,8 +323,10 @@ def create_order(self, client_order_id: str,
318323 'client_order_id' : client_order_id ,
319324 'product_id' : product_id ,
320325 'side' : side .value ,
321- 'order_configuration' : order_configuration
326+ 'order_configuration' : order_configuration ,
322327 }
328+ if retail_portfolio_id is not None :
329+ payload ['retail_portfolio_id' ] = retail_portfolio_id
323330
324331 headers = self ._build_request_headers (method , request_path , json .dumps (payload )) \
325332 if self ._is_legacy_auth () \
@@ -343,7 +350,39 @@ def edit_order(self, order_id: str, limit_price: float, base_size: float) -> Ord
343350 - base_size: New size for order
344351 """
345352
346- request_path = f"/api/v3/brokerage/orders/edit"
353+ request_path = "/api/v3/brokerage/orders/edit"
354+ method = "POST"
355+
356+ payload = {
357+ 'order_id' : order_id ,
358+ 'price' : str (limit_price ),
359+ 'size' : str (base_size )
360+ }
361+
362+ headers = self ._build_request_headers (method , request_path , json .dumps (payload )) \
363+ if self ._is_legacy_auth () \
364+ else self ._build_request_headers_for_cloud (method , self ._host , request_path )
365+ response = requests .post (self ._base_url + request_path ,
366+ json = payload , headers = headers ,
367+ timeout = self .timeout )
368+
369+ edit_result = OrderEdit .from_response (response )
370+ return edit_result
371+
372+ def edit_order_preview (self , order_id : str , limit_price : float , base_size : float ) -> OrderEditPreview :
373+ """
374+ https://docs.cloud.coinbase.com/advanced-trade-api/reference/retailbrokerageapi_previeweditorder
375+
376+ Simulate an edit order request with a specified new size, or new price, to preview the result of an edit.
377+ Only limit order types, with time in force type of good-till-cancelled can be edited.
378+
379+ Args:
380+ - order_id: ID of order to edit.
381+ - limit_price: New price for order.
382+ - base_size: New size for order
383+ """
384+
385+ request_path = "/api/v3/brokerage/orders/edit_preview"
347386 method = "POST"
348387
349388 payload = {
@@ -359,7 +398,7 @@ def edit_order(self, order_id: str, limit_price: float, base_size: float) -> Ord
359398 json = payload , headers = headers ,
360399 timeout = self .timeout )
361400
362- edit_result = OrderEdit . from_get_edit_response (response )
401+ edit_result = OrderEditPreview . from_response (response )
363402 return edit_result
364403
365404 def cancel_orders (self , order_ids : list ) -> OrderBatchCancellation :
0 commit comments