Activating stop orders before it hits the limit price
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)?
- Long position & Stop Loss
- Long position & Take Profit
- Short position & stop loss
- short position & take profit
Any help would be appreciated!
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)