New releases: v0.26.0 of the main framework and v0.0.10 of the live trade plugin

Today I released version 0.26.0 of the main framework and version 0.0.10 of the live trade plugin.

0.26.0 of the main framework

This update brings below items:

  • [NEW FEATURE] Add combinations_without_repeat utility to create unique combinations. Useful for optimize mode.
  • [NEW FEATURE] New indicators: Arnaud Legoux Moving Average, Holt-Winter Moving Average, Natural Moving Average, Ehlers Distance Coefficient Filter, Moving Average Bands, Ulcer Index, Moving Average Adaptive Q, MWDX Average, Variable Length Moving Average, Square Root Weighted Moving Average, Squared Weighted Moving Average, Variable Power Weighted Moving Average, Cubed Weighted Moving Average, JSA Moving Average, End Point Moving Average, Ehlers Predictive Moving Average, Wavetrend, Hurst Exponent
  • [NEW FEATURE] - New Moving Averages added to the ma indicator.
  • [Improvement] Minor code optimizations.
  • [Improvement] Packages updated - Update websocket-client from 1.1.0 to 1.1.1, Update scipy from 1.7.0 to 1.7.1, Update pandas from 1.3.0 to 1.3.1, Update numpy from 1.20.3 to 1.21.1, Update pydash from 5.0.1 to 5.0.2, Update requests from 2.25.1 to 2.26.0, Update ta-lib from 0.4.20 to 0.4.21
  • [FIX] The ma indicator now better handles volume which is needed for vwap and vwma.
  • [FIX] The kaufmanstop now uses the correct formula for long and now supports the matype parameter.

0.0.10 of the live trade

This update brings below items:

  • Fixes the {'code': -4014, 'msg': 'Price not increased by tick size.'} that sometimes happens on Binance Futures for a few symbols.
  • Adds new watch_list() method in strategies which helps with monitoring strategies in live mode.


The watch_list isn't actually an addition, just a really cool feature of live trade mode of Jesse that I forgot to document 😄.

Sometimes you might want to monitor your running strategy constantly. Sure you could keep printing few values but it won't be the prettiest solution. You can now do that by defining the watch_list() method in your strategy which returns a list of tuples containing keys and values. You can fill it with anything you want; indicator values, entry/exit signals, etc.

Here's a good example:


def short_ema(self):
    return ta.ema(self.candles, 50)
def long_ema(self):
    return ta.ema(self.candles, 100)
def watch_list(self):
    return [
        ('Short EMA', self.short_ema),
        ('Long EMA', self.long_ema),
        ('Trend', 1 if self.short_ema > self.long_ema else -1),

Then, when you run the live session, you will see a new table like:

 Short EMA    | 45990.9
 Long EMA     |   45911
 Trend        |       1

Needless to say, this feature has no use in backtest mode. For debugging in backtest mode, it's best to use the self.log() method to log the values, and then run the backtest using --debug flag to printing them all including details of how the simulation is being executed.