utils.risk_to_qty() function calculates fee_rate twice
This is my code
""" balance = 10000 available_funds = balance * 5 # leverage risk_percentage = 0.10 # open a position each time with 10%
entry_price = 100 # current price stop_loss_price = entry_price - 10 take_profit_price = entry_price + 20
risk_qty = utils.risk_to_qty(balance, risk_percentage * 100, entry_price, stop_loss_price, fee_rate=0.005) print(risk_qty)
self.buy = qty, entry_price self.stop_loss = qty, stop_loss_price self.take_profit = qty, take_profit_price """
it print 97.0225
I read the code: "" def risk_to_qty(capital: float, risk_per_capital: float, entry_price: float, stop_loss_price: float, precision: int = 8, fee_rate: float = 0) -> float: """ a risk management tool to quickly get the qty based on risk percentage
:param capital:
:param risk_per_capital:
:param entry_price:
:param stop_loss_price:
:param precision:
:param fee_rate:
:return: float
"""
risk_per_qty = abs(entry_price - stop_loss_price)
size = risk_to_size(capital, risk_per_capital, risk_per_qty, entry_price)
if fee_rate != 0:
size = size * (1 - fee_rate * 3)
return size_to_qty(size, entry_price, precision=precision, fee_rate=fee_rate)def risk_to_size(capital_size: float, risk_percentage: float, risk_per_qty: float, entry_price: float) -> float: """ calculates the size of the position based on the amount of risk percentage you're willing to take example: round(risk_to_size(10000, 1, 0.7, 8.6)) == 1229
:param capital_size:
:param risk_percentage:
:param risk_per_qty:
:param entry_price:
:return: float
"""
if risk_per_qty == 0:
raise ValueError('risk cannot be zero')
risk_percentage /= 100
temp_size = ((risk_percentage * capital_size) / risk_per_qty) * entry_price
return min(temp_size, capital_size)def size_to_qty(position_size: float, entry_price: float, precision: int = 3, fee_rate: float = 0) -> float: """ converts position-size to quantity example: requesting $100 at the entry_price of $50 would return 2 :param position_size: float :param entry_price: float :param precision: int :param fee_rate: :return: float """ # make sure entry_price is not None if entry_price is None: raise TypeError(f"entry_price is None")
if math.isnan(position_size) or math.isnan(entry_price):
raise TypeError(f"position_size: {position_size}, entry_price: {entry_price}")
if fee_rate != 0:
position_size *= 1 - fee_rate * 3
return jh.floor_with_precision(position_size / entry_price, precision)
"""
when fee_rate > 0, this fee_rate calculate twice.
Source: jesse-ai/jesse