order status handled in case of IOC and FOK
This commit is contained in:
parent
866b7aee8e
commit
6018f2d252
@ -370,12 +370,12 @@ class FreqtradeBot(object):
|
|||||||
time_in_force = self.strategy.order_time_in_force['buy']
|
time_in_force = self.strategy.order_time_in_force['buy']
|
||||||
|
|
||||||
if price:
|
if price:
|
||||||
buy_limit = price
|
buy_limit_requested = price
|
||||||
else:
|
else:
|
||||||
# Calculate amount
|
# Calculate amount
|
||||||
buy_limit = self.get_target_bid(pair, self.exchange.get_ticker(pair))
|
buy_limit_requested = self.get_target_bid(pair, self.exchange.get_ticker(pair))
|
||||||
|
|
||||||
min_stake_amount = self._get_min_pair_stake_amount(pair_s, buy_limit)
|
min_stake_amount = self._get_min_pair_stake_amount(pair_s, buy_limit_requested)
|
||||||
if min_stake_amount is not None and min_stake_amount > stake_amount:
|
if min_stake_amount is not None and min_stake_amount > stake_amount:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f'Can\'t open a new trade for {pair_s}: stake amount'
|
f'Can\'t open a new trade for {pair_s}: stake amount'
|
||||||
@ -383,16 +383,17 @@ class FreqtradeBot(object):
|
|||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
amount = stake_amount / buy_limit
|
amount = stake_amount / buy_limit_requested
|
||||||
|
|
||||||
order = self.exchange.buy(pair=pair, ordertype=self.strategy.order_types['buy'],
|
order = self.exchange.buy(pair=pair, ordertype=self.strategy.order_types['buy'],
|
||||||
amount=amount, rate=buy_limit,
|
amount=amount, rate=buy_limit_requested,
|
||||||
time_in_force=time_in_force)
|
time_in_force=time_in_force)
|
||||||
order_id = order['id']
|
order_id = order['id']
|
||||||
order_status = order.get('status', None)
|
order_status = order.get('status', None)
|
||||||
|
|
||||||
# in case of FOK or IOC orders we can check immediately
|
# we assume the order is executed at the price requested
|
||||||
# if the order is fulfilled fully or partially
|
buy_limit_filled_price = buy_limit_requested
|
||||||
|
|
||||||
if order_status == 'expired' or order_status == 'rejected':
|
if order_status == 'expired' or order_status == 'rejected':
|
||||||
order_type = self.strategy.order_types['buy']
|
order_type = self.strategy.order_types['buy']
|
||||||
order_tif = self.strategy.order_time_in_force['buy']
|
order_tif = self.strategy.order_time_in_force['buy']
|
||||||
@ -403,20 +404,33 @@ class FreqtradeBot(object):
|
|||||||
' zero amount is fulfilled.',
|
' zero amount is fulfilled.',
|
||||||
order_tif, order_type, pair_s, order_status, self.exchange.name)
|
order_tif, order_type, pair_s, order_status, self.exchange.name)
|
||||||
return False
|
return False
|
||||||
else: # the order is partially fulfilled
|
else:
|
||||||
|
# the order is partially fulfilled
|
||||||
|
# in case of IOC orders we can check immediately
|
||||||
|
# if the order is fulfilled fully or partially
|
||||||
logger.warning('Buy %s order with time in force %s for %s is %s by %s.'
|
logger.warning('Buy %s order with time in force %s for %s is %s by %s.'
|
||||||
' %s amount fulfilled out of %s (%s remaining which is canceled).',
|
' %s amount fulfilled out of %s (%s remaining which is canceled).',
|
||||||
order_tif, order_type, pair_s, order_status, self.exchange.name,
|
order_tif, order_type, pair_s, order_status, self.exchange.name,
|
||||||
order['filled'], order['amount'], order['remaining']
|
order['filled'], order['amount'], order['remaining']
|
||||||
)
|
)
|
||||||
return False
|
stake_amount = order['price']
|
||||||
|
amount = order['amount']
|
||||||
|
buy_limit_filled_price = order['average']
|
||||||
|
order_id = None
|
||||||
|
|
||||||
|
# in case of FOK the order may be filled immediately and fully
|
||||||
|
elif order_status == 'filled':
|
||||||
|
stake_amount = order['price']
|
||||||
|
amount = order['amount']
|
||||||
|
buy_limit_filled_price = order['average']
|
||||||
|
order_id = None
|
||||||
|
|
||||||
self.rpc.send_msg({
|
self.rpc.send_msg({
|
||||||
'type': RPCMessageType.BUY_NOTIFICATION,
|
'type': RPCMessageType.BUY_NOTIFICATION,
|
||||||
'exchange': self.exchange.name.capitalize(),
|
'exchange': self.exchange.name.capitalize(),
|
||||||
'pair': pair_s,
|
'pair': pair_s,
|
||||||
'market_url': pair_url,
|
'market_url': pair_url,
|
||||||
'limit': buy_limit,
|
'limit': buy_limit_requested,
|
||||||
'stake_amount': stake_amount,
|
'stake_amount': stake_amount,
|
||||||
'stake_currency': stake_currency,
|
'stake_currency': stake_currency,
|
||||||
'fiat_currency': fiat_currency
|
'fiat_currency': fiat_currency
|
||||||
@ -430,8 +444,8 @@ class FreqtradeBot(object):
|
|||||||
amount=amount,
|
amount=amount,
|
||||||
fee_open=fee,
|
fee_open=fee,
|
||||||
fee_close=fee,
|
fee_close=fee,
|
||||||
open_rate=buy_limit,
|
open_rate=buy_limit_filled_price,
|
||||||
open_rate_requested=buy_limit,
|
open_rate_requested=buy_limit_requested,
|
||||||
open_date=datetime.utcnow(),
|
open_date=datetime.utcnow(),
|
||||||
exchange=self.exchange.id,
|
exchange=self.exchange.id,
|
||||||
open_order_id=order_id,
|
open_order_id=order_id,
|
||||||
|
Loading…
Reference in New Issue
Block a user