Sowelo,
Итог заранее: вы не правы. Баланс нигде не обнуляется.
1. Про self.balance += pnl_change
Это прибавление дельты, а не присваивание. На входе в позицию pnl_change = -fee, баланс становится balance = balance — fee. Ноль тут взять неоткуда.
2. Про “объём всегда ноль”
В коде при закрытии используется:
volume = self.balance / self.entry_price
После входа баланс положительный (чуть меньше из-за комиссии).
Значит, volume > 0.
Заявление “всегда ноль” — ошибка чтения.
3. Про “реворды не поступают”
Награда считается так:
reward = (pnl_change / initial_balance) — inaction_penalty
pnl_change появляется при списании комиссии и при закрытии позиции (прибыль/убыток минус комиссия). Следовательно, реворды не нулевые по определению.
Мини-калькуляция (чтобы закрыть вопрос окончательно)
initial_balance = 10_000, fee = 0.04%.
Вход LONG по 10:
volume_open = 10_000 / 10 = 1_000
fee_open = 10 * 1_000 * 0.0004 = 4
balance = 10_000 — 4 = 9_996 (не ноль!)
Закрытие по 11:
volume_close = balance / entry_price = 9_996 / 10 = 999.6
trade_pnl = (11 — 10) * 999.6 = 999.6
fee_close = 11 * 999.6 * 0.0004 ≈ 4.39824
pnl_change ≈ 999.6 — 4.39824 = 995.20176
balance_new ≈ 9_996 + 995.20176 = 10_991.20176
reward ≈ 995.20176 / 10_000 ≈ 0.0995 (точно не 0)
Вывод: в указанных строках нет описанной вами ошибки. Баланс не обнуляется, объём при закрытии не равен нулю, реворды есть. Ваше замечание — результат неправильной интерпретации кода.

