taker or maker passed correctly for buy and sell orders
This commit is contained in:
parent
9029833c8c
commit
2618f3371c
@ -570,6 +570,35 @@ class FreqtradeBot(LoggingMixin):
|
|||||||
logger.info(f"Bids to asks delta for {pair} does not satisfy condition.")
|
logger.info(f"Bids to asks delta for {pair} does not satisfy condition.")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_fee(
|
||||||
|
self,
|
||||||
|
pair: str,
|
||||||
|
side: str,
|
||||||
|
is_short: bool = False,
|
||||||
|
):
|
||||||
|
'''
|
||||||
|
:param pair: Unified CCXT symbol
|
||||||
|
:param side: One of entry, exit or stoploss
|
||||||
|
:param is_short: True for short trades
|
||||||
|
'''
|
||||||
|
order_type = self.config['order_types'][side]
|
||||||
|
if order_type == 'limit':
|
||||||
|
enter_side = 'ask' if is_short else 'bid'
|
||||||
|
exit_side = 'bid' if is_short else 'ask'
|
||||||
|
if (
|
||||||
|
side == 'entry' and self.config['bid_strategy']['price_side'] == enter_side or
|
||||||
|
side == 'exit' and self.config['ask_strategy']['price_side'] == exit_side
|
||||||
|
):
|
||||||
|
taker_or_maker = 'maker'
|
||||||
|
else:
|
||||||
|
taker_or_maker = 'taker'
|
||||||
|
else:
|
||||||
|
taker_or_maker = 'taker'
|
||||||
|
return self.exchange.get_fee(
|
||||||
|
symbol=pair,
|
||||||
|
taker_or_maker=taker_or_maker
|
||||||
|
)
|
||||||
|
|
||||||
def execute_entry(
|
def execute_entry(
|
||||||
self,
|
self,
|
||||||
pair: str,
|
pair: str,
|
||||||
@ -664,12 +693,10 @@ class FreqtradeBot(LoggingMixin):
|
|||||||
enter_limit_filled_price = safe_value_fallback(order, 'average', 'price')
|
enter_limit_filled_price = safe_value_fallback(order, 'average', 'price')
|
||||||
|
|
||||||
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
|
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
|
||||||
fee = self.exchange.get_fee(symbol=pair, taker_or_maker='maker')
|
|
||||||
base_currency = self.exchange.get_pair_base_currency(pair)
|
base_currency = self.exchange.get_pair_base_currency(pair)
|
||||||
open_date = datetime.now(timezone.utc)
|
open_date = datetime.now(timezone.utc)
|
||||||
funding_fees = self.exchange.get_funding_fees(
|
funding_fees = self.exchange.get_funding_fees(
|
||||||
pair=pair, amount=amount, is_short=is_short, open_date=open_date)
|
pair=pair, amount=amount, is_short=is_short, open_date=open_date)
|
||||||
# This is a new trade
|
|
||||||
if trade is None:
|
if trade is None:
|
||||||
trade = Trade(
|
trade = Trade(
|
||||||
pair=pair,
|
pair=pair,
|
||||||
@ -679,8 +706,8 @@ class FreqtradeBot(LoggingMixin):
|
|||||||
amount=amount,
|
amount=amount,
|
||||||
is_open=True,
|
is_open=True,
|
||||||
amount_requested=amount_requested,
|
amount_requested=amount_requested,
|
||||||
fee_open=fee,
|
fee_open=self.get_fee(pair, 'entry'),
|
||||||
fee_close=fee,
|
fee_close=self.get_fee(pair, 'exit'),
|
||||||
open_rate=enter_limit_filled_price,
|
open_rate=enter_limit_filled_price,
|
||||||
open_rate_requested=enter_limit_requested,
|
open_rate_requested=enter_limit_requested,
|
||||||
open_date=open_date,
|
open_date=open_date,
|
||||||
|
@ -769,6 +769,11 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order,
|
|||||||
bid = 0.11
|
bid = 0.11
|
||||||
enter_rate_mock = MagicMock(return_value=bid)
|
enter_rate_mock = MagicMock(return_value=bid)
|
||||||
enter_mm = MagicMock(return_value=open_order)
|
enter_mm = MagicMock(return_value=open_order)
|
||||||
|
default_conf_usdt['order_types'] = {
|
||||||
|
'entry': 'limit',
|
||||||
|
'exit': 'market',
|
||||||
|
'stoploss': 'market',
|
||||||
|
}
|
||||||
mocker.patch.multiple(
|
mocker.patch.multiple(
|
||||||
'freqtrade.exchange.Exchange',
|
'freqtrade.exchange.Exchange',
|
||||||
get_rate=enter_rate_mock,
|
get_rate=enter_rate_mock,
|
||||||
@ -780,15 +785,15 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order,
|
|||||||
create_order=enter_mm,
|
create_order=enter_mm,
|
||||||
get_min_pair_stake_amount=MagicMock(return_value=1),
|
get_min_pair_stake_amount=MagicMock(return_value=1),
|
||||||
get_max_pair_stake_amount=MagicMock(return_value=500000),
|
get_max_pair_stake_amount=MagicMock(return_value=500000),
|
||||||
get_fee=fee,
|
get_fee=MagicMock(side_effect=(
|
||||||
|
lambda symbol, taker_or_maker: fee if taker_or_maker == 'maker' else fee*2
|
||||||
|
)),
|
||||||
get_funding_fees=MagicMock(return_value=0),
|
get_funding_fees=MagicMock(return_value=0),
|
||||||
name=exchange_name,
|
name=exchange_name,
|
||||||
get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)),
|
get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)),
|
||||||
get_max_leverage=MagicMock(return_value=10),
|
get_max_leverage=MagicMock(return_value=10),
|
||||||
)
|
)
|
||||||
mocker.patch.multiple(
|
mocker.patch.multiple(
|
||||||
'freqtrade.exchange.Okx',
|
|
||||||
get_max_pair_stake_amount=MagicMock(return_value=500000),
|
|
||||||
)
|
)
|
||||||
pair = 'ETH/USDT'
|
pair = 'ETH/USDT'
|
||||||
|
|
||||||
@ -816,6 +821,8 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order,
|
|||||||
assert trade
|
assert trade
|
||||||
assert trade.is_open is True
|
assert trade.is_open is True
|
||||||
assert trade.open_order_id == '22'
|
assert trade.open_order_id == '22'
|
||||||
|
assert trade.open_fee == fee
|
||||||
|
assert trade.close_fee == fee*2
|
||||||
|
|
||||||
# Test calling with price
|
# Test calling with price
|
||||||
open_order['id'] = '33'
|
open_order['id'] = '33'
|
||||||
@ -836,6 +843,11 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order,
|
|||||||
order['cost'] = 100
|
order['cost'] = 100
|
||||||
order['id'] = '444'
|
order['id'] = '444'
|
||||||
|
|
||||||
|
default_conf_usdt['order_types'] = {
|
||||||
|
'entry': 'market',
|
||||||
|
'exit': 'limit',
|
||||||
|
'stoploss': 'market',
|
||||||
|
}
|
||||||
mocker.patch('freqtrade.exchange.Exchange.create_order',
|
mocker.patch('freqtrade.exchange.Exchange.create_order',
|
||||||
MagicMock(return_value=order))
|
MagicMock(return_value=order))
|
||||||
assert freqtrade.execute_entry(pair, stake_amount, is_short=is_short)
|
assert freqtrade.execute_entry(pair, stake_amount, is_short=is_short)
|
||||||
@ -846,6 +858,8 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order,
|
|||||||
assert trade.open_rate == 10
|
assert trade.open_rate == 10
|
||||||
assert trade.stake_amount == round(order['price'] * order['filled'] / leverage, 8)
|
assert trade.stake_amount == round(order['price'] * order['filled'] / leverage, 8)
|
||||||
assert pytest.approx(trade.liquidation_price) == liq_price
|
assert pytest.approx(trade.liquidation_price) == liq_price
|
||||||
|
assert trade.open_fee == fee*2
|
||||||
|
assert trade.close_fee == fee
|
||||||
|
|
||||||
# In case of rejected or expired order and partially filled
|
# In case of rejected or expired order and partially filled
|
||||||
order['status'] = 'expired'
|
order['status'] = 'expired'
|
||||||
|
Loading…
Reference in New Issue
Block a user