OPEN-SOURCE SCRIPT

EMA bands + leledc + bollinger bands trend following strategy v2

Updated
The basics:
In its simplest form, this strategy is a positional trend following strategy which enters long when price breaks out above "middle" EMA bands and closes or flips short when price breaks down below "middle" EMA bands. The top and bottom of the middle EMA bands are calculated from the EMA of candle highs and lows, respectively.

The idea is that entering trades on breakouts of the high EMAs and low EMAs rather than the typical EMA based on candle closes gives a bit more confirmation of trend strength and minimizes getting chopped up. To further reduce getting chopped up, the strategy defaults to close on crossing the opposite EMA band (ie. long on break above high EMA middle band and close below low EMA middle band).

This strategy works on all markets on all timeframes, but as a trend following strategy it works best on markets prone to trending such as crypto and tech stocks. On lower timeframes, longer EMAs tend to work best (I've found good results on EMA lengths even has high up to 1000), while 4H charts and above tend to work better with EMA lengths 21 and below.

As an added filter to confirm the trend, a second EMA can be used. Inputting a slower EMA filter can ensure trades are entered in accordance with longer term trends, inputting a faster EMA filter can act as confirmation of breakout strength.

Bar coloring can be enabled to quickly visually identify a trend's direction for confluence with other indicators or strategies.


The goods:
Waiting for the trend to flip before closing a trade (especially when a longer base EMA is used) often leaves money on the table. This script combines a number of ways to identify when a trend is exhausted for backtesting the best early exits.

"Delayed bars inside middle bands" - When a number of candle's in a row open and close between the middle EMA bands, it could be a sign the trend is weak, or that the breakout was not the start of a new trend. Selecting this will close out positions after a number of bars has passed

"Leledc bars" - Originally introduced by glaz, this is a price action indicator that highlights a candle after a number of bars in a row close the same direction and result in greatest high/low over a period. It often triggers when a strong trend has paused before further continuation, or it marks the end of a trend. To mitigate closing on false Leledc signals, this strategy has two options: 1. Introducing requirement for increased volume on the Leledc bars can help filter out Leledc signals that happen mid trend. 2. Closing after a number of Leledc bars appear after position opens. These two options work great in isolation but don't perform well together in my testing.

"Bollinger Bands exhaustion bars" - These bars are highlighted when price closes back inside the Bollinger Bands and RSI is within specified overbought/sold zones. The idea is that a trend is overextended when price trades beyond the Bollinger Bands. When price closes back inside the bands it's likely due for mean reversion back to the base EMA in which this strategy will ideally re-enter a position. Since the added RSI requirements often make this indicator too strict to trigger a large enough sample size to backtest, I've found it best to use "non-standard" settings for both the bands and the RSI as seen in the default settings.

"Buy/Sell zones" - Similar to the idea behind using Bollinger Bands exhaustion bars as a closing signal. Instead of calculating off of standard deviations, the Buy/Sell zones are calculated off multiples of the middle EMA bands. When trading beyond these zones and subsequently failing back inside, price may be due for mean reversion back to the base EMA. No RSI filter is used for Buy/Sell zones.

If any early close conditions are selected, it's often worth enabling trade re-entry on "middle EMA band bounce". Instead of waiting for a candle to close back inside the middle EMA bands, this feature will re-enter position on only a wick back into the middle bands as will sometimes happen when the trend is strong.

Any and all of the early close conditions can be combined. Experimenting with these, I've found can result in less net profit but higher win-rates and sharpe ratios as less time is spent in trades.


The deadly:
The trend is your friend. But wouldn't it be nice to catch the trends early? In ranging markets (or when using slower base EMAs in this strategy), waiting for confirmation of a breakout of the EMA bands at best will cause you to miss half the move, at worst will result in getting consistently chopped up. Enabling "counter-trend" trades on this strategy will allow the strategy to enter positions on the opposite side of the EMA bands on either a Leledc bar or Bollinger Bands exhaustion bar. There is a filter requiring either a high/low (for Leledc) or open (for BB bars) outside the selected inner or outer Buy/Sell zone. There are also a number of different close conditions for the counter-trend trades to experiment with and backtest.

There are two ways I've found best to use counter-trend trades
1. Mean reverting scalp trades when a trend is clearly overextended. Selecting from the first 5 counter-trend closing conditions on the dropdown list will usually close the trades out quickly, with less profit but less risk.
2. Trying to catch trends early. Selecting any of the close conditions below the first 5 can cause the strategy to behave as if it's entering into a new trend (from the wrong side).

This feature can be deadly effective in profiting from every move price makes, or deadly to the strategy's PnL if not set correctly. Since counter-trend trades open opposite the middle bands, a stop-loss is recommended to reduce risk. If stop-losses for counter-trend trades are disabled, the strategy will hold a position open often until liquidation in a trending market if th trade is offsides. Note that using a slower base EMA makes counter-trend stop-losses even more necessary as it can reduce the effectiveness of the Buy/Sell zone filter for opening the trades as price can spend a long time trending outside the zones. If faster EMAs (34 and below) are used with "Inner" Buy/Zone filter selected, the first few closing conditions will often trigger almost immediately closing the trade at a loss.


The niche:
I've added a feature to default into longs or shorts. Enabling these with other features (aside from the basic long/short on EMA middle band breakout) tends to break the strategy one way or another. Enabling default long works to simulate trying to acquire more of the asset rather than the base currency. Enabling default short can have positive results for those high FDV, high inflation coins that go down-only for months at a time. Otherwise, I use default short as a hedge for coins that I hold and stake spot. I gain the utility and APR of staking while reducing the risk of holding the underlying asset by maintaining a net neutral position *most* of the time.


Disclaimer:
This script is intended for experimenting and backtesting different strategies around EMA bands. Use this script for your live trading at your own risk. I am a rookie coder, as such there may be errors in the code that cause the strategy to behave not as intended. As far as I can tell it doesn't repaint, but I cannot guarantee that it does not. That being said if there's any question, improvements, or errors you've found, drop a comment below!
Release Notes
-Corrected some erroneous tooltips on which features do not work well together.
-Added a user input to customize middle band width
> Can drastically change results with small adjustments, 1 is default calculation but I've found good results with multipliers anywhere from 0.5-2. Entering 0 will behave as a simple EMA breakout
-Added an option for different calculation of buy/sell zones using Keltner Channels
> Default calculations for buy/sell zones are still multiples off the EMA band highs and lows which will now be affected by changing middle band width. User's can opt to calculate buy/sell zones using
multiples of keltner channels. Adding a slightly smoother appearance and the ability to adjust independently from the middle bands
-Added volatility squeeze filter as defined by Bollinger Bands channels falling inside Keltner Channels
> As with most EMA strategies, the biggest drawdowns come from being chopped up in low volatility. Adjusting the middle band width can help reduce the amount of breakout trades taken but it can also
cause bigger losses on failed trades. This filter aims to reduce the amount of trades taken by ignoring signals during low volatility times
> Backtesting on some of my existing setups I've cut the number of trades in half with roughly equal net profit
> Doesn't filter out "Default Positioning" trades, so it may be less useful with strategies enabling those
> The Bollinger Bands and Keltner channels are not plotted, instead, background is highlighted when the squeeze is on
> Seems to work best when pulled from higher timeframes eg trading the 30min chart try setting the volatility squeeze to calculate off the 12H chart
> Credits to juanc2316 for the code
-Added options to remove more visual elements to help with backtesting efficiency/tradingview load times
-Edited for readability and took out some redundant calculations

Per request, I've also thrown together an indicator only version with alerts that can be found here:
pastebin.com/RvYMpv9V

As usual always looking for feedback, if you've found any errors or bugs, have some ideas on how to improve the script or strategy, or simply enjoying it please let me know.
Release Notes
Got some feedback from another user on the script so I've pushed a minor update (thank you!)
  • Added strategy.close commands before every new entry. ie. previously if the strategy had an open long, it would flip short by selling double the position size. Now, the script will close close the long, then open the short. This allows for more realistic backtesting results when adding for slippage and fees and also makes it simpler to plug into bot trading (disclaimer: automate this script at your own risk, I do it but I am never away from the computer)
    - strategy.close commands were not added before "default positioning" entries because those already have a conditional to ensure position is flat before opening
  • Organized the code for easier readability
Bands and ChannelsBollinger Bands (BB)counter-trendleledcMoving Averagestrendfollowing

Open-source script

In true TradingView spirit, the author of this script has published it open-source, so traders can understand and verify it. Cheers to the author! You may use it for free, but reuse of this code in publication is governed by House rules. You can favorite it to use it on a chart.

Want to use this script on a chart?


Also on:

Disclaimer