Hello all, I am giving Jesse a spin for the first time. I have successfully written some strategies and jupyter indicators, but I can not figure out why I am getting the following error messages when I run. All the strategies used here are from git@github.com:jesse-ai/example-strategies.git
jesse backtest 2021-01-01 2021-02-22 --json
Question 1)
It looks like Jesse is trying to sell before it buys? Is that the case? My config files defines that I have 10000 USDT and 0 BTC
'Binance': {
'fee': 0.001,
# backtest mode only: accepted are 'spot' and 'futures'
'type': 'spot',
# futures mode only
'settlement_currency': 'USDT',
# accepted values are: 'cross' and 'isolated'
'futures_leverage_mode': 'cross',
# 1x, 2x, 10x, 50x, etc. Enter as integers
'futures_leverage': 1,
# used for spot exchange only
'assets': [
{'asset': 'USDT', 'balance': 10_000},
{'asset': 'BTC', 'balance': 0.0},
],
},
CANDLES |
----------------------+--------------------------
period | 52 days (1.73 months)
starting-ending date | 2021-01-01 => 2021-02-22
exchange | symbol | timeframe | strategy | DNA
------------+----------+-------------+--------------+-------
Binance | BTC-USDT | 1m | SMACrossover |
============================== EXCEPTION TRACEBACK:
File "/usr/sbin/jesse", line 33, in <module>
sys.exit(load_entry_point('jesse==0.19.2', 'console_scripts', 'jesse')())
File "/usr/lib/python3.9/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/__init__.py", line 316, in backtest
backtest_mode.run(start_date, finish_date, chart=chart, tradingview=tradingview, csv=csv,
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 62, in run
simulator(candles)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 276, in simulator
store.orders.execute_pending_market_orders()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/store/state_orders.py", line 68, in execute_pending_market_orders
o.execute()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/Order.py", line 167, in execute
e.on_order_execution(self)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/SpotExchange.py", line 91, in on_order_execution
self.on_order_submission(order, skip_market_order=False)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/SpotExchange.py", line 61, in on_order_submission
raise NegativeBalance(
=========================================================================
Uncaught Exception: NegativeBalance: Balance cannot go below zero in spot market. Available capital at Binance for BTC is 0.0 but you're trying to sell 0.344
Question 2) Same config/strategy as above, but "futures" instead of "spot". Why is Jesse a) trying to spend more money than I have, and b) why do I have a negative margin balance?
CANDLES |
----------------------+--------------------------
period | 52 days (1.73 months)
starting-ending date | 2021-01-01 => 2021-02-22
exchange | symbol | timeframe | strategy | DNA
------------+----------+-------------+--------------+-------
Binance | BTC-USDT | 1m | SMACrossover |
============================== EXCEPTION TRACEBACK:
File "/usr/sbin/jesse", line 33, in <module>
sys.exit(load_entry_point('jesse==0.19.2', 'console_scripts', 'jesse')())
File "/usr/lib/python3.9/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/__init__.py", line 316, in backtest
backtest_mode.run(start_date, finish_date, chart=chart, tradingview=tradingview, csv=csv,
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 62, in run
simulator(candles)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 267, in simulator
r.strategy._execute()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/strategies/Strategy.py", line 865, in _execute
self._check()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/strategies/Strategy.py", line 647, in _check
self._update_position()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/strategies/Strategy.py", line 430, in _update_position
self._detect_and_handle_entry_and_exit_modifications()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/strategies/Strategy.py", line 584, in _detect_and_handle_entry_and_exit_modifications
self.broker.buy_at_market(o[0], role=order_roles.CLOSE_POSITION)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/services/broker.py", line 61, in buy_at_market
return self.api.market_order(
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/services/api.py", line 28, in market_order
return self.drivers[exchange].market_order(symbol, qty, current_price, side, role, flags)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/exchanges/sandbox/Sandbox.py", line 27, in market_order
order = Order({
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/Order.py", line 64, in __init__
e.on_order_submission(self)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/FuturesExchange.py", line 121, in on_order_submission
raise InsufficientMargin('You cannot submit an order for ${} when your margin balance is ${}'.format(
=========================================================================
Uncaught Exception: InsufficientMargin: You cannot submit an order for
$10080 when your margin balance is $-207
I also get this message if I have a large balance on both side (BTC and USDT)
Question 3)
If I add some BTC to my balance and switch to 'spot', The backtest actually makes to 100%, but then dumps with the message
CANDLES |
----------------------+--------------------------
period | 52 days (1.73 months)
starting-ending date | 2021-01-01 => 2021-02-22
exchange | symbol | timeframe | strategy | DNA
------------+----------+-------------+--------------+-------
Binance | BTC-USDT | 1m | SMACrossover |
Executing simulation... [####################################] 100%
Executed backtest simulation in: 7.06 seconds
============================== EXCEPTION TRACEBACK:
File "/usr/sbin/jesse", line 33, in <module>
sys.exit(load_entry_point('jesse==0.19.2', 'console_scripts', 'jesse')())
File "/usr/lib/python3.9/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/__init__.py", line 316, in backtest
backtest_mode.run(start_date, finish_date, chart=chart, tradingview=tradingview, csv=csv,
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 62, in run
simulator(candles)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 290, in simulator
r.strategy._terminate()
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/strategies/Strategy.py", line 898, in _terminate
round(self.position.pnl_percentage, 2)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/Position.py", line 72, in pnl_percentage
return self.roi
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/Position.py", line 80, in roi
return self.pnl / self.total_cost * 100
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/models/Position.py", line 90, in total_cost
return self.entry_price * abs(self.qty) / self.exchange.futures_leverage
=========================================================================
Uncaught Exception: AttributeError: 'SpotExchange' object has no attribute 'futures_leverage'
But this appears not to be so, as seen in the config below, but why does the spot want a "futures mode only" attribute?
'Binance': {
'fee': 0.001,
# backtest mode only: accepted are 'spot' and 'futures'
'type': 'spot',
# futures mode only
'settlement_currency': 'USDT',
# accepted values are: 'cross' and 'isolated'
'futures_leverage_mode': 'cross',
# 1x, 2x, 10x, 50x, etc. Enter as integers
'futures_leverage': 1,
# used for spot exchange only
'assets': [
{'asset': 'USDT', 'balance': 10_000},
{'asset': 'BTC', 'balance': 100.0},
],
},
However, if I switch to another strategy, such as RSI2, I get a totally different error message. Unfortunately, none of these error messages give any clues as to where the problem actually lies.
CANDLES |
----------------------+--------------------------
period | 52 days (1.73 months)
starting-ending date | 2021-01-01 => 2021-02-22
exchange | symbol | timeframe | strategy | DNA
------------+----------+-------------+------------+-------
Binance | BTC-USDT | 4h | RSI2 |
Executing simulation... [####################################] 100%
Executed backtest simulation in: 4.25 seconds
METRICS |
---------------------------------+----------------------------------------
Total Closed Trades | 11
Total Net Profit | 1,082.3069 (10.82%)
Starting => Finishing Balance | 10,000 => 11,082.31
Total Open Trades | 0
Open PL | 0
Total Paid Fees | 227.6
Max Drawdown | -104.3%
Annual Return | 102.94%
Expectancy | 98.39 (0.98%)
Avg Win | Avg Loss | 242.86 | 286.85
Ratio Avg Win / Avg Loss | 0.85
Percent Profitable | 73%
Longs | Shorts | 82% | 18%
Avg Holding Time | 14.0 hours, 10.0 minutes, 54.0 seconds
Winning Trades Avg Holding Time | 12.0 hours
Losing Trades Avg Holding Time | 20.0 hours
Sharpe Ratio | -2.63
Market Change | 98.22%
============================== EXCEPTION TRACEBACK:
File "/usr/sbin/jesse", line 33, in <module>
sys.exit(load_entry_point('jesse==0.19.2', 'console_scripts', 'jesse')())
File "/usr/lib/python3.9/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/__init__.py", line 316, in backtest
backtest_mode.run(start_date, finish_date, chart=chart, tradingview=tradingview, csv=csv,
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/modes/backtest_mode/__init__.py", line 98, in run
store_logs(json, tradingview, csv)
File "/usr/lib/python3.9/site-packages/jesse-0.19.2-py3.9.egg/jesse/services/file.py", line 26, in store_logs
json.dump(trades_json, outfile)
File "/usr/lib/python3.9/json/__init__.py", line 179, in dump
for chunk in iterable:
File "/usr/lib/python3.9/json/encoder.py", line 431, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/usr/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.9/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.9/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.9/json/encoder.py", line 438, in _iterencode
o = _default(o)
File "/usr/lib/python3.9/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
=========================================================================
Uncaught Exception: TypeError: Object of type set is not JSON serializable
Question 4)
Does Jesse actually submit an order to my exchange? Because I can't see where to add my API keys.
Thank for any feedback