feat: set precision_mode_price when creating trade objects

This commit is contained in:
Matthias
2024-08-13 09:11:44 +02:00
parent 54bc60b08f
commit ac1ac0debe
3 changed files with 13 additions and 2 deletions

View File

@@ -419,6 +419,11 @@ class Exchange:
"""exchange ccxt precisionMode""" """exchange ccxt precisionMode"""
return self._api.precisionMode return self._api.precisionMode
@property
def precision_mode_price(self) -> int:
"""exchange ccxt precisionMode"""
return self._api.precisionMode
def additional_exchange_init(self) -> None: def additional_exchange_init(self) -> None:
""" """
Additional exchange initialization logic. Additional exchange initialization logic.

View File

@@ -374,6 +374,7 @@ class FreqtradeBot(LoggingMixin):
if trade.exchange != self.exchange.id: if trade.exchange != self.exchange.id:
continue continue
trade.precision_mode = self.exchange.precisionMode trade.precision_mode = self.exchange.precisionMode
trade.precision_mode_price = self.exchange.precision_mode_price
trade.amount_precision = self.exchange.get_precision_amount(trade.pair) trade.amount_precision = self.exchange.get_precision_amount(trade.pair)
trade.price_precision = self.exchange.get_precision_price(trade.pair) trade.price_precision = self.exchange.get_precision_price(trade.pair)
trade.contract_size = self.exchange.get_contract_size(trade.pair) trade.contract_size = self.exchange.get_contract_size(trade.pair)
@@ -992,6 +993,7 @@ class FreqtradeBot(LoggingMixin):
amount_precision=self.exchange.get_precision_amount(pair), amount_precision=self.exchange.get_precision_amount(pair),
price_precision=self.exchange.get_precision_price(pair), price_precision=self.exchange.get_precision_price(pair),
precision_mode=self.exchange.precisionMode, precision_mode=self.exchange.precisionMode,
precision_mode_price=self.exchange.precision_mode_price,
contract_size=self.exchange.get_contract_size(pair), contract_size=self.exchange.get_contract_size(pair),
) )
stoploss = self.strategy.stoploss if not self.edge else self.edge.get_stoploss(pair) stoploss = self.strategy.stoploss if not self.edge else self.edge.get_stoploss(pair)

View File

@@ -181,6 +181,7 @@ class Backtesting:
self.fee = max(fee for fee in fees if fee is not None) self.fee = max(fee for fee in fees if fee is not None)
logger.info(f"Using fee {self.fee:.4%} - worst case fee from exchange (lowest tier).") logger.info(f"Using fee {self.fee:.4%} - worst case fee from exchange (lowest tier).")
self.precision_mode = self.exchange.precisionMode self.precision_mode = self.exchange.precisionMode
self.precision_mode_price = self.exchange.precision_mode_price
if self.config.get("freqai_backtest_live_models", False): if self.config.get("freqai_backtest_live_models", False):
from freqtrade.freqai.utils import get_timerange_backtest_live_models from freqtrade.freqai.utils import get_timerange_backtest_live_models
@@ -785,7 +786,7 @@ class Backtesting:
) )
if rate is not None and rate != close_rate: if rate is not None and rate != close_rate:
close_rate = price_to_precision( close_rate = price_to_precision(
rate, trade.price_precision, self.precision_mode rate, trade.price_precision, self.precision_mode_price
) )
# We can't place orders lower than current low. # We can't place orders lower than current low.
# freqtrade does not support this in live, and the order would fill immediately # freqtrade does not support this in live, and the order would fill immediately
@@ -929,7 +930,9 @@ class Backtesting:
# We can't place orders higher than current high (otherwise it'd be a stop limit entry) # We can't place orders higher than current high (otherwise it'd be a stop limit entry)
# which freqtrade does not support in live. # which freqtrade does not support in live.
if new_rate is not None and new_rate != propose_rate: if new_rate is not None and new_rate != propose_rate:
propose_rate = price_to_precision(new_rate, price_precision, self.precision_mode) propose_rate = price_to_precision(
new_rate, price_precision, self.precision_mode_price
)
if direction == "short": if direction == "short":
propose_rate = max(propose_rate, row[LOW_IDX]) propose_rate = max(propose_rate, row[LOW_IDX])
else: else:
@@ -1109,6 +1112,7 @@ class Backtesting:
amount_precision=precision_amount, amount_precision=precision_amount,
price_precision=precision_price, price_precision=precision_price,
precision_mode=self.precision_mode, precision_mode=self.precision_mode,
precision_mode_price=self.precision_mode_price,
contract_size=contract_size, contract_size=contract_size,
orders=[], orders=[],
) )