coinbasepro-python icon indicating copy to clipboard operation
coinbasepro-python copied to clipboard

Activating stop orders before it hits the limit price

Open atakanokan opened this issue 4 years ago • 1 comments

Hi, Especially in volatile situations, I have seen some of my stop orders were run past because the limit price and stop price are the same thus there is a chance that it will not be put on the order book as fast as needed.

Current code:

self.auth_client.place_stop_order(
                product_id = ticker,
                stop_type = stop_type,
                price = price,
                size = size
            )

Looks like place_stop_order doesn't allow to specify different limit_price and price arguments. However place_order method does. How should I specify the side, price and stop_type and stop_price arguments for the following to make sure they are activated a little bit before to ensure execution (assuming I want the stop to be activated 5$ before the stop price)?

  1. Long position & Stop Loss
  2. Long position & Take Profit
  3. Short position & stop loss
  4. short position & take profit

Any help would be appreciated!

atakanokan avatar Jan 09 '22 12:01 atakanokan

I wonder why it's not included, but you can create your own class adding the stop_price argument into the place_stop_order method, here is an example. Be aware that I didn't test it.

from cbpro import AuthenticatedClient


class MyAuthenticatedClient(AuthenticatedClient):
    def place_stop_order(self, product_id, stop_type, price, size=None, funds=None,
                         client_oid=None,
                         stp=None,
                         overdraft_enabled=None,
                         funding_amount=None,
                         stop_price=None):
        """ Place stop order.
        Args:
            product_id (str): Product to order (eg. 'BTC-USD')
            stop_type(str): Stop type ('entry' or 'loss')
                      loss: Triggers when the last trade price changes to a value at or below the stop_price.
                      entry: Triggers when the last trade price changes to a value at or above the stop_price
            price (Decimal): Desired price at which the stop order triggers.
            size (Optional[Decimal]): Desired amount in crypto. Specify this or
                `funds`.
            funds (Optional[Decimal]): Desired amount of quote currency to use.
                Specify this or `size`.
            client_oid (Optional[str]): User-specified Order ID
            stp (Optional[str]): Self-trade prevention flag. See `place_order`
                for details.
            overdraft_enabled (Optional[bool]): If true funding above and
                beyond the account balance will be provided by margin, as
                necessary.
            funding_amount (Optional[Decimal]): Amount of margin funding to be
                provided for the order. Mutually exclusive with
                `overdraft_enabled`.
        Returns:
            dict: Order details. See `place_order` for example.
        """

        if stop_type == 'loss':
            side = 'sell'
        elif stop_type == 'entry':
            side = 'buy'
        else:
            raise ValueError('Invalid stop_type for stop order: ' + stop_type)

        # If not receive the stop_price use price
        if not bool(stop_price):
            stop_price = price

        params = {'product_id': product_id,
                  'side': side,
                  'price': price,
                  'order_type': None,
                  'stop': stop_type,
                  'stop_price': stop_price,
                  'size': size,
                  'funds': funds,
                  'client_oid': client_oid,
                  'stp': stp,
                  'overdraft_enabled': overdraft_enabled,
                  'funding_amount': funding_amount}
        params = dict((k, v) for k, v in params.items() if v is not None)

        return self.place_order(**params)

ramosmarco avatar Feb 26 '22 04:02 ramosmarco