Volume Profile


Staff member

A picture says more than a 1000 words - example of Volume Profile on TradingView for Bitfinex BTC_USD on 1h candles on October 10th, 2018:

Getting started:

Go to the "Configuration" page of your WolfBot instance and select the configuration named "VolumeProfiler".
This is an example configuration which you can fine-tune now.

Switch to the "Trading" tab of the "Configuration" page and adjust your parameters (remember to read all parameter explanations on this page carefully):
  • your exchange(s) (used for Backtesting as well as live trading)
  • the coin pairs you want to apply the Volume Profile to
  • the most important thing when using volume profile is your candle size and the 'interval' parameter (how many candles shall be used to compute the volume profile). For candles from 30min to 2h an interval of 48 is a very good choice. If you trade on 6h+ candles this value depends heavily on your particular coin, as there might have been a strong price move related to some news/development of that coin (pushing it into a completely different price range, making the old volume profile obsolete).
  • set the tradeMode parameter to "breakout", "resistance" or "both":
    With its default settings WolfBot will assume a breakout when hitting a high-volume range. This works very well for scalp trading (positions open for 1+ days) together with an execution strategy such as RSIScalper or RSIScalpOrderer on a smaller candle size (5-30min) to ensure the trend actually continues.
    If you are daytrading (positions open only a few hours up to 1 day) you could set this to "resistance".
    If you set this to "both", WolfBot will look at the average volume of the current candle. If it's higher than "minVolumeSpikeBreakout" it will trade the breakout, otherwise the bounce back from resistance.
  • The "minVolumeSpike" parameter defines the min volume the current candle must have to open a position. A decisive market move will always have a higher-than-average volume. Values of 1.1x to 2.0x work very well in most cases. Beware of setting this to high in tradeMode "breakout" or you might be too late to trade on the current trend.
  • volumeRows defines the number of equally-sized price-ranges your "interval" candles shall be divided into. This reflects the number of volume bars on the y-axis.The default 24 works great in most cases. If you are not using this strategy as a main strategy, instead you just have other strategies looking at its data (for example PlanRunner) you might want to reduce this number to get a simpler view of the current market.
All config options for the VolumeProfiler strategy in WolfBot:


  • VolumeProfile works best on high-volume pairs such as USD_BTC, USD_LTC, BTC_ETH,...
  • VolumeProfile is a nice way to algorithmically get support and resistance lines - that means without having to do any "drawing" on the chart. Even if you don't want to trade on this information, viewing its data in live mode can be very useful and can be incorporated into many other trading strategies.

The trading idea behind it:

Volume Profile is very powerful and can be used for daytrading on 30min candles as well as swing trading on 4h candles (or daily candles) when keeping your positions open for many days. It identifies likely support and resistance levels and can be used to enter the market as well as to set stops when the price goes beyond a certain high-volume - indicating that it will likely go much further in the same direction, possibly all the way up/down to the next high-volume price-range.

For Developers:

VolumeProfile is a built-in indicator in WolfBot. You can use this in every strategy by just writing in the constructor:
this.addIndicator("VolumeProfile", "VolumeProfile", this.action);
To access the data (anywhere in your strategy):
const volumeProfile = this.getVolumeProfile("VolumeProfile");
let profileBars = volumeProfile.getVolumeProfile();
// profieBars is an array of volume profile bars (bars on the y-axis) sorted by volume from highest to lowest
if (profileBars[0].isBelowPrice(6500.0) === true) { // check the bar with the highest volume
    // do something...
    this.emitBuy(this.defaultWeight, "moon lambo lambo now!");
Last edited: