#614·jesse

utils.risk_to_qty() function calculates fee_rate twice

Author: flyerswkCreated Aug 18, 2026Updated Sep 2, 2026
Labelsbug

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.