HEMA - A Fast And Efficient Estimate Of The Hull Moving AverageIntroduction
The Hull moving average (HMA) developed by Alan Hull is one of the many moving averages that aim to reduce lag while providing effective smoothing. The HMA make use of 3 linearly weighted (WMA) moving averages, with respective periods p/2 , p and √p , this involve three convolutions, which affect computation time, a more efficient version exist under the name of exponential Hull moving average (EHMA), this version make use of exponential moving averages instead of linearly weighted ones, which dramatically decrease the computation time, however the difference with the original version is clearly noticeable.
In this post an efficient and simple estimate is proposed, the estimation process will be fully described and some comparison with the original HMA will be presented.
This post and indicator is dedicated to LucF
Estimation Process
Estimating a moving average is easier when we look at its weights (represented by the impulse response), we basically want to find a similar set of weights via more efficient calculations, the estimation process is therefore based on fully understanding the weighting architecture of the moving average we want to estimate.
The impulse response of an HMA of period 20 is as follows :
We can see that the first weights increases a bit before decaying, the weights then decay, cross under 0 and increase again. More recent closing price values benefits of the highest weights, while the oldest values have negatives ones, negative weighting is what allow to drastically reduce the lag of the HMA. Based on this information we know that our estimate will be a linear combination of two moving averages with unknown coefficients :
a × MA1 + b × MA2
With a > 0 and b < 0 , the lag of MA1 is lower than the lag of MA2 . We first need to capture the general envelope of the weights, which has an overall non-linearly decaying shape, therefore the use of an exponential moving average might seem appropriate.
In orange the impulse response of an exponential moving average of period p/2 , that is 10. We can see that such impulse response is not a bad estimate of the overall shape of the HMA impulse response, based on this information we might perform our linear combination with a simple moving average :
2EMA(p/2) + -1SMA(p)
this gives the following impulse response :
As we can see there is a clear lack of accuracy, but because the impulse response of a simple moving is a constant we can't have the short increasing weights of the HMA, we therefore need a non-constant impulse response for our linear combination, a WMA might be appropriate. Therefore we will use :
2WMA(p/2) + -1EMA(p/2)
Note that the lag a WMA is inferior to the lag of an EMA of same period, this is why the period of the WMA is p/2 . We obtain :
The shape has improved, but the fit is poor, which mean we should change our coefficients, more precisely increasing the coefficient of the WMA (thus decreasing the one of the EMA). We will try :
3WMA(p/2) + -2EMA(p/2)
We then obtain :
This estimate seems to have a decent fit, and this linear combination is therefore used.
Comparison
HMA in blue and the estimate in fuchsia with both period 50, the difference can be noted, however the estimate is relatively accurate.
In the image above the period has been set to 200.
Conclusion
In this post an efficient estimate of the HMA has been proposed, we have seen that the HMA can be estimated via the linear combinations of a WMA and an EMA of each period p/2 , this isn't important for the EMA who is based on recursion but is however a big deal for the WMA who use recursion, and therefore p indicate the number of data points to be used in the convolution, knowing that we use only convolution and that this convolution use twice less data points then one of the WMA used in the HMA is a pretty great thing.
Subtle tweaking of the coefficients/moving averages length's might help have an even more accurate estimate, the fact that the WMA make use of a period of √p is certainly the most disturbing aspect when it comes to estimating the HMA. I also described more in depth the process of estimating a moving average.
I hope you learned something in this post, it took me quite a lot of time to prepare, maybe 2 hours, some pinescripters pass an enormous amount of time providing content and helping the community, one of them being LucF, without him i don't think you'll be seeing this indicator as well as many ones i previously posted, I encourage you to thank him and check his work for Pinecoders as well as following him.
Thanks for reading !
Hull
GODMODE Hull MASimple hull ma trading script
B = buy / long
S = sell / short
Confirm on barclose
Band colors indicates the trend
Aqua = bullish channel
Red =bearish channel
MasterMAThis study demonstrates 15 different common moving averages.
SMA, Double SMA, Triple SMA
EMA, Double EMA, Triple EMA
WMA, Double WMA, Triple WMA
VWMA, Double VWMA, Triple VWMA
Hull, Double Hull, Triple Hull
Buy/Sell alerts are given for crossover/under conditions.
Triangles at the bottom, pointing up are buy signals. Triangles at the top, pointing down, are sell signals
Hull 2xPlots 2 Hull MA's, 1 Fast and 1 Slow
Can Paint Bars according to Hull MA Cross
Buy / Sell Alerts for MA Crossing
Vol%MAThis study finds buying/selling opportunities on the basis of candlestick and volume percentage changes, prequalified by momentum.
Candlestick percentage changes that are equal to or greater the desired percentage with the momentum range are marked by blue diamonds.
Volume percentage changes that are equal to or greater the desired percentage with the momentum range are marked by red circles.
When candlestick and volume percentage changes aligned with user configurations are under momentum, a buy signal is triggered with BUY ASSET and a black triangle is placed at the bottom of the chart.
When candlestick and volume percentage changes aligned with user configurations are above momentum, a sell signal is triggered with SELL ASSET and a black triangle is placed at the top of the chart.
TSI CCI HullThis is TSI and CCI combined. The CCI is customized and is using HullMA, but the TSI is default TSI
For use with the HMAv420 indicator, to form trading strategy based on the 3 indicators.
Best as all 3 indicators used on 3 timeframes at once, ie 1m 5m 1H
Triple Hull Moving AverageCalculates and plots 3 Hull Moving Averages. Color of plot changes to indicate positive or negative slope. Original Hull MA code written by mohamed982.
Hull SuiteHull is its extremely responsive and smooth moving average created by Alan Hull in 2005.
Minimal lag and smooth curves made HMA extremely popular TA tool.
alanhull.com
Script was made to regroup multiple hull variants in one indicator,maintaining flexible customization and intuitive visualization
Option to chose between 3 Hull variations
Option to chose between 2 visualization modes ( Bands or single line)
Option to Paint hull and/or candlesticks according to hulls trend
Shortcut for personalizing Line/band thickness,instead of changing every object manually ,there is global option in inputs
HMA
THMA ( 3HMA)
EHMA
HMA:
Alan Hull
EHMA:
Slower than hull by default.
Raudys, Aistis & Lenčiauskas, Vaidotas & Malčius, Edmundas. (2013). Moving Averages for Financial Data Smoothing ( 403. 34-45. 10.1007/978-3-642-41947-8_4.) Vilnius University, Faculty of Mathematics and Informatics
3HMA (THMA) :
Documentation on link below
alexgrover
Compact Profitable Moving Average CrossoverHello friends,
I'm pleased to introduce this advanced evolution of the original Profitable Moving Average Crossover tool. This version offers complete control over the analysis range and delivers detailed real-time profitability metrics for every moving average crossover type directly on your chart.
🛠 How It Works
The script evaluates 61 moving average crossover systems across a customizable date range , allowing you to focus on specific historical windows for optimization or validation. It calculates each crossover's net profit performance and automatically ranks all results, displaying the top 5 performers in a summary table. Results are visualized through a color-coded column chart, making it easy to identify which crossover types have historically delivered the strongest outcomes.
🔥 Key Features
Pine Script V6 — built on the latest and most efficient version
Tests 61 moving average types , including those developed by Jurik, Kaufman, Ehlers, Apirine, and others
Custom Backtest Window — analyze any date range with start and end parameters
Automatic Results Table — displays the top 5 crossovers ranked by profit
Color-Coded Chart — quick visual identification of performance by crossover type
Sorted column chart for clear visual comparison of profit metrics
Fully compatible with all symbols, timeframes, and market types
NOTE: Results will vary across different tickers and timeframes. Seeing strong performance in one preview does not imply similar profitability elsewhere — this variability is normal due to differing market structures.
NOTE 2: You can experiment with the tool independently or request a full study, in which case I'll share a spreadsheet of all backtest results with you.
👋 Good luck and happy trading!
Script a pagamento
SnakeWhile moving averages are a good way to visualize price action, they are, in general, very poor indicators to trade against. Usually, the lowest prices occur before the cross over of multiple moving averages, while the best profits occur just before the crossunders of the moving averages.
This study captures the buy signals before the cross overs and sells just prior to the cross unders, when prices are lowest and highest respectively.
This is accomplished by treating the moving average as a "snake", specifically looking for the "head" of the snake to turn upwards when buying is most opportunistic. Note the the body must still be trending downward.
For selling, the "snake's head" must be turning down while the body is trending up.
This script uses blue arrows, pointing up, at the bottom, to indicate a buy signal, sending an alert of BUY ASSET.
Blue arrows, point down, at the top, represent sell signals with an alert of SELL ASSET.
The gray bar or strip is momentum. The snake's head must be above momentum for a sell, and below for a buy. This study does NOT work well with stable coins.
The longer the momentum, the more likely weak signals will be weeded out, but also presents less opportunities for buys.
The longer the length of the snake, the more likely cascading down turns will be ignored, but requires a longer trend to identify buy signals.
Multiple HMA - bgeraghtyTo save space on a chart's maximum indicator count, this single indicator includes:
- Three Hull Moving Averages, Defaulted to 13, 26, and 55 Periods.
- Customizable Time-Frame for Each HMA.
- Customizable Triple Weighted MA Smoothing for Jagged Lines from Higher Time-Frame
- Alert Conditions for Price Cross Over/Under the HMAs.
Double RSI StudyHere is the study version of our recent Double RSI strategy based on a Hull RSI and ALMA RSI.
The study version includes alerts for signals generated by both RSI's. It also includes an option to allow repeat signals, as well as tons of plotting options, etc.
If interested in a 3 day trial, feel free to send a message and check out our website ProfitProgrammers.com !
Hull RSI
This is an RSI that is smoothed with a faster Hull Moving Average. The upper pink and bottom teal lines represent the 95th and 5th percentiles of Hull RSI values over a window of user-defined length.
The two percentile bands function identically to the traditional upper and lower bounds used in the standard RSI setup. Buy signals are plotted as the vertical green background highlights and sell signals are the red highlights. Buy signal is generated when RSI is below the lower teal line and then crosses above it. Sell signals occur when Hull RSI was previously above the upper pink line and then crosses back under.
Hull Trend with KahlmanThis is an update to the idea of
The Kahlman smoother makes the signal more precise (by one candle).
Hull TrendHere we are using Hull Moving Average crossovers as an experiment in trend detection.
The Hull Moving Average (HMA) is an extremely fast and smooth moving average.
Credit to alexgrover & RicardoSantos:
Keltner Channels around Hull MAKeltner Channels around Hull Moving Average
Script shared upon request. No guarantees on accuracy.
Parabolic Hull MA [wm]
Based on Everget's Parabolic WMA and Mladen MT5 Hull MA.
Power = 1 behaves the same as a standard HMA , > 1 speeds it up, < 1 slows it down
HMA ColoredThis is a typical hull moving average that is colored based on if the average is increasing or decreasing.
Hull MAThis Hull MA uses the default settings of the built-in MA. The basic idea is that we are in a buy setup when hull is below price, and a sell setup when hull is above price. The indicator is extended with slightly change in contrast when moving average is declining and it plot the ma/price crossovers: green dot when a buy setup is appearing, and red dot when a sell setup is forming. It is possible to hide crossovers in the option panel.
Three alert conditions is added "Hull MA cross", "Hull MA sell" and "Hull MA buy". I use "Hull MA cross" on slow frames (2w, M) and "Hull MA buy/sell" on faster frames.
ATR smoothed by Hull MAThis is Average True Range indicator, but it is smoothed with Hull MA ( not WMA etc )
It is set to overlay the candles so looks different from normal ATR but i assure you it is ATR
Script open so you can see for yourself.
perhaps different settings are better,
Help me test it, and suggest improvements thankyou
Multi SMA EMA WMA HMA BB (5x8 MAs Bollinger Bands) MAX MTF - RRBMulti SMA EMA WMA HMA 4x7 Moving Averages with Bollinger Bands MAX MTF by RagingRocketBull 2019
Version 1.0
All available MAX MTF versions are listed below (They are very similar and I don't want to publish them as separate indicators):
ver 1.0: 4x7 = 28 MTF MAs + 28 Levels + 3 BB = 59 < 64
ver 2.0: 5x6 = 30 MTF MAs + 30 Levels + 3 BB = 63 < 64
ver 3.0: 3x10 = 30 MTF MAs + 30 Levels + 3 BB = 63 < 64
ver 4.0: 5(4+1)x8 = 8 CurTF MAs + 32 MTF MAs + 20 Levels + 3 BB = 63 < 64
ver 5.0: 6(5+1)x6 = 6 CurTF MAs + 30 MTF MAs + 24 Levels + 3 BB = 63 < 64
ver 6.0: 4(3+1)x10 = 10 CurTF MAs + 30 MTF MAs + 20 Levels + 3 BB = 63 < 64
Fib numbers: 8, 13, 21, 34, 55, 89, 144, 233, 377
This indicator shows multiple MAs of any type SMA EMA WMA HMA etc with BB and MTF support, can show MAs as dynamically moving levels.
There are 4 MA groups + 1 BB group, a total of 4 TFs * 7 MAs = 28 MAs. You can assign any type/timeframe combo to a group, for example:
- EMAs 9,12,26,50,100,200,400 x H1, H4, D1, W1 (4 TFs x 7 MAs x 1 type)
- EMAs 8,13,21,30,34,50,55,89,100,144,200,233,377,400 x M15, H1 (2 TFs x 14 MAs x 1 type)
- D1 EMAs and SMAs 8,13,21,30,34,50,55,89,100,144,200,233,377,400 (1 TF x 14 MAs x 2 types)
- H1 WMAs 13,21,34,55,89,144,233; H4 HMAs 9,12,26,50,100,200,400; D1 EMAs 12,26,89,144,169,233,377; W1 SMAs 9,12,26,50,100,200,400 (4 TFs x 7 MAs x 4 types)
- +1 extra MA type/timeframe for BB
There are several versions: Simple, MTF, Pro MTF, Advanced MTF, MAX MTF and Ultimate MTF. This is the MAX MTF version. The Differences are listed below. All versions have BB
- Simple: you have 2 groups of MAs that can be assigned any type (5+5)
- MTF: +2 custom Timeframes for each group (2x5 MTF) +1 TF for BB, TF XY smoothing
- Pro MTF: 4 custom Timeframes for each group (4x3 MTF), 1 TF for BB, MA levels and show max bars back options
- Advanced MTF: +4 extra MAs/group (4x7 MTF), custom Ticker/Symbols, Timeframe <>= filter, Remove Duplicates Option
- MAX MTF: +2 subtypes/group, packed to the limit with max possible MAs/TFs: 4x7, 5x6, 3x10, 4(3+1)x10, 5(4+1)x8, 6(5+1)x6
- Ultimate MTF: +individual settings for each MA, custom Ticker/Symbols
MAX MTF version tests the limits of Pinescript trying to squeeze as many MAs/TFs as possible into a single indicator.
It's basically a maxed out Advanced version with subtypes allowing for mixed types within a group (i.e. both emas and smas in a single group/TF)
Pinescript has the following limits:
- max 40 security calls (6 calls are reserved for dupe checks and smoothing, 2 are used for BB, so only 32 calls are available)
- max 64 plot outputs (BB uses 3 outputs, so only 61 plot outputs are available)
- max 50000 (50kb) size of the compiled code
Based on those limits, you can only have the following MAs/TFs combos in a single script:
1. 4x7, 5x6, 3x10 - total number of MTF MAs must always be <= 32, and you can still have BB and Num Levels = total MAs, without any compromises
2. 5(4+1)x8, 6(5+1)x6, 4(3+1)x10 - you can use the Current Symbol/Timeframe as an extra (+1) fixed TF with the same number of MTF MAs
- you don't need to call security to display MAs on the Current Symbol/Timeframe, so the total number of MTF MAs remains the same and is still <= 32
- to fit that many MAs into the max 64 plot outputs limit you need to reduce the number of levels (not every MA Group will have corresponding levels)
Features:
- 4x7 = 28 MAs of any type
- 4x MTF groups with XY step line smoothing
- +1 extra TF/type for BB MAs
- 2 MA subtypes within each group/TF
- 4x7 = 28 MA levels with adjustable group offsets, indents and shift
- supports any existing type of MA: SMA, EMA, WMA, Hull Moving Average (HMA)
- custom tickers/symbols for each group
- show max bars back option
- show/hide both groups of MAs/levels/BB and individual MAs
- timeframe filter: show only MAs/Levels with TFs <>= Current TF
- hide MAs/Levels with duplicate TFs
- support for custom TFs that are not available in free accounts: 2D, 3D etc
- support for timeframes in H: H, 2H, 4H etc
Notes:
- Uses timeframe textbox instead of input resolution dropdown to allow for 240 120 and other custom TFs
- Uses symbol textbox instead of input symbol to avoid establishing multiple dummy security connections to the current ticker - otherwise empty symbols will prevent script from running
- Possible reasons for missing MAs on a chart:
- there may not be enough bars in history to start plotting it. For example, W1 EMA200 needs at least 200 bars on a weekly chart.
- for charts with low/fractional prices i.e. 0.00002 << 0.001 (default Y smoothing step) decrease Y smoothing as needed (set Y = 0.0000001) or disable it completely (set X,Y to 0,0)
- for charts with high price values i.e. 20000 >> 0.001 increase Y smoothing as needed (set Y = 10-20). Higher values exceeding MAs point density will cause it to disappear as there will be no points to plot. Different TFs may require diff adjustments
- TradingView Replay Mode UI and Pinescript security calls are limited to TFs >= D (D,2D,W,MN...) for free accounts
- attempting to plot any TF < D1 in Replay Mode will only result in straight lines, but all TFs will work properly in history and real-time modes. This is not a bug.
- Max Bars Back (num_bars) is limited to 5000 for free accounts (10000 for paid), will show error when exceeded. To plot on all available history set to 0 (default)
- Slow load/redraw times. This indicator becomes slower, its UI less responsive when:
- Pinescript Node.js graphics library is too slow and inefficient at plotting bars/objects in a browser window. Code optimization doesn't help much - the graphics engine is the main reason for general slowness.
- the chart has a long history (10000+ bars) in a browser's cache (you have scrolled back a couple of screens in a max zoom mode).
- Reload the page/Load a fresh chart and then apply the indicator or
- Switch to another Timeframe (old TF history will still remain in cache and that TF will be slow)
- in max possible zoom mode around 4500 bars can fit on 1 screen - this also slows down responsiveness. Reset Zoom level
- initial load and redraw times after a param change in UI also depend on TF. For example: D1/W1 - 2 sec, H1/H4 - 5-6 sec, M30 - 10 sec, M15/M5 - 4 sec, M1 - 5 sec. M30 usually has the longest history (up to 16000 bars) and W1 - the shortest (1000 bars).
- when indicator uses more MAs (plots) and timeframes it will redraw slower. Seems that up to 5 Timeframes is acceptable, but 6+ Timeframes can become very slow.
- show_last=last_bars plot limit doesn't affect load/redraw times, so it was removed from MA plot
- Max Bars Back (num_bars) default/custom set UI value doesn't seem to affect load/redraw times
- In max zoom mode all dynamic levels disappear (they behave like text)
- Dupe check includes symbol: symbol, tf, both subtypes - all must match for a duplicate group
- For the dupe check to work correctly a custom symbol must always include an exchange prefix. BB is not checked for dupes
Good Luck! Feel free to learn from/reuse the code to build your own indicators.






















