Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Activating stop orders before it hits the limit price #463

Open
atakanokan opened this issue Jan 9, 2022 · 1 comment
Open

Activating stop orders before it hits the limit price #463

atakanokan opened this issue Jan 9, 2022 · 1 comment

Comments

@atakanokan
Copy link

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!

@ramosmarco
Copy link

ramosmarco commented Feb 26, 2022

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants