Modjoy-Volatility Gaussian Bands [BigBeluga]
Introduction to Modjoy-Volatility Gaussian Bands
The Modjoy-Volatility Gaussian Bands, also known as BigBeluga, is a trading strategy that combines the principles of volatility and Gaussian bands to provide traders with a comprehensive view of market trends and fluctuations. This strategy is designed to help traders identify potential trading opportunities and make informed decisions based on market volatility and Gaussian principles.
Core Logic of Modjoy-Volatility Gaussian Bands
The core logic of the Modjoy-Volatility Gaussian Bands strategy is based on the concept of volatility and Gaussian distribution. Volatility refers to the degree of uncertainty or risk associated with the price movements of a security. Gaussian distribution, on the other hand, is a statistical concept that describes the distribution of data points in a normal curve, where the majority of data points are clustered around the mean value.
The Modjoy-Volatility Gaussian Bands strategy uses a combination of volatility and Gaussian principles to create a set of bands that surround the price action of a security. These bands are designed to capture the majority of price movements, with the outer bands representing the most extreme price movements and the inner bands representing the most common price movements.
Components of Modjoy-Volatility Gaussian Bands
- Volatility Component: The volatility component of the Modjoy-Volatility Gaussian Bands strategy uses a measure of historical volatility to determine the width of the bands. The most common measure of volatility used is the Average True Range (ATR), which takes into account the average range of price movements over a given period of time.
- Gaussian Component: The Gaussian component of the Modjoy-Volatility Gaussian Bands strategy uses a Gaussian distribution to determine the shape and position of the bands. The Gaussian distribution is used to calculate the probability of price movements within a given range, with the majority of price movements expected to occur within the inner bands.
Trading Strategy using Modjoy-Volatility Gaussian Bands
The Modjoy-Volatility Gaussian Bands strategy can be used in a variety of trading scenarios, including trend following, mean reversion, and breakout trading. Here are some general guidelines for using the Modjoy-Volatility Gaussian Bands strategy:
- Trend Following: When the price action is trending upwards or downwards, the Modjoy-Volatility Gaussian Bands can be used to identify potential areas of support and resistance. The outer bands can be used as a target for trend following trades, while the inner bands can be used as a stop-loss level.
- Mean Reversion: When the price action is mean-reverting, the Modjoy-Volatility Gaussian Bands can be used to identify potential areas of overbought and oversold conditions. The outer bands can be used as a target for mean reversion trades, while the inner bands can be used as a stop-loss level.
- Breakout Trading: When the price action is breaking out of a range, the Modjoy-Volatility Gaussian Bands can be used to identify potential areas of support and resistance. The outer bands can be used as a target for breakout trades, while the inner bands can be used as a stop-loss level.
Conclusion
The Modjoy-Volatility Gaussian Bands strategy is a comprehensive trading approach that combines the principles of volatility and Gaussian bands to provide traders with a unique view of market trends and fluctuations. By using the Modjoy-Volatility Gaussian Bands strategy, traders can identify potential trading opportunities and make informed decisions based on market volatility and Gaussian principles.
It's worth noting that the Modjoy-Volatility Gaussian Bands strategy is a complex approach that requires a deep understanding of volatility and Gaussian principles. Traders should thoroughly backtest and validate the strategy before using it in live markets.
References
Modjoy Exclusive Source Code:
//@version=5
indicator("Modjoy-Volatility Gaussian Bands [BigBeluga]", overlay = true, max_labels_count = 500)
// INPUTS ========================================================================================================{
//@variable len Length of the Gaussian filter for smoothing (minimum value: 5)
int len = input.int(20, "Length", minval = 5)
//@variable mode Select the mode of aggregation to be used: AVG (average), MEADIAN (median), or MODE (mode)
string mode = input.string("AVG", "Type", ["AVG", "MEADIAN", "MODE"])
//@variable distance Multiplier for calculating the distance between the Gaussian filter and the volatility bands
float distance = input.float(1, step = 0.1)
//@variable show_retest Boolean input to determine if retest signals should be displayed
bool show_retest = input.bool(false, "Retest Signals")
//@variable up Color for upward trends and visual signals, represented in RGB
color up = input.color(color.rgb(40, 218, 150), group = "Color")
//@variable dn Color for downward trends and visual signals, represented in hex code
color dn = input.color(#287bda, group = "Color")
// }
// CALCULATIONS ============================================================================================={
//@function Calculates a Gaussian filter for smoothing the data
//@param src (series float) Source price series
//@param length (int) Length of the filter
//@param sigma (float) Standard deviation for the Gaussian function
//@returns (float) Smoothed value for the current bar
gaussian_filter(src, length, sigma) =>
var float[] weights = array.new_float(100) // Create an array to store weights for Gaussian filter
float total = 0.0 // Sum of all weights, used for normalization
float pi = math.pi // Define Pi constant
// Calculate weights for Gaussian filter
for i = 0 to length - 1
float weight = math.exp(-0.5 * math.pow((i - length / 2) / sigma, 2.0)) / math.sqrt(sigma * 2.0 * pi)
weights.set(i, weight)
total := total + weight
// Normalize weights
for i = 0 to length - 1
weights.set(i, weights.get(i) / total)
// Apply Gaussian filter to the source series
float sum = 0.0
for i = 0 to length - 1
sum := sum + src[i] * weights.get(i)
sum
//@function Multi-trend calculation using Gaussian filter
//@param src (series float) Source price series
//@param period (int) Lookback period for trend calculation
//@returns (float[]) Returns score, value, color, trend line, and trend status
multi_trend(src, period) =>
array g_value = array.new() // Array to store Gaussian filtered values
float volatility = ta.sma(high - low, 100) // Calculate the average true range (ATR) volatility
var float lower_band = 0.0 // Lower band for trend analysis
var float upper_band = 0.0 // Upper band for trend analysis
var float trend_line = 0.0 // Trend line value
var bool trend = na // Trend direction status
// Apply Gaussian filter with a step adjustment to calculate multiple trend lines
for step = 0 to 20 by 1
float gaussian_filter = gaussian_filter(src, (period + step), 10)
g_value.push(gaussian_filter)
float coeff = 0.05
float score = 0.0
// Calculate score based on trend analysis
for i = 0 to g_value.size() - 1
float g_f = g_value.get(i)
if g_f > g_value.first()
score += coeff
// Determine color based on score
color color = score > 0.5
? color.from_gradient(score, 0.5, 1, na, dn)
: color.from_gradient(score, 0, 0.5, up, na)
// Determine value based on user-selected mode (AVG, MEDIAN, MODE)
float value = switch mode
"AVG" => g_value.avg()
"MEADIAN" => g_value.median()
"MODE" => g_value.mode()
lower_band := value - volatility * distance // Calculate lower band based on value and volatility
upper_band := value + volatility * distance // Calculate upper band based on value and volatility
// Check crossover and crossunder of price with bands to determine trend
if ta.crossover(close, upper_band)
trend := true
if ta.crossunder(close, lower_band)
trend := false
// Set trend line based on trend direction
trend_line :=
trend ? lower_band
: not trend ? upper_band : na
// Return values: score, value, color, trend line, and trend status
[score, value, color, trend_line, trend]
// Get the result from the multi-trend function
[score, avg, color, trend_line, trend] = multi_trend(close, len)
// }
// PLOT ============================================================================================================={
// Plot the average line returned from multi_trend function
p2 = plot(avg, color = color, linewidth=1)
// Plot the trend line based on trend status
p1 = plot(ta.change(trend) ? na : trend_line,
color = close > trend_line ? up : dn,
linewidth = 2,
style = plot.style_linebr)
// Plot the trend line again with styling
plot(trend_line, color = close > trend_line ? up : dn, linewidth=1, style = plot.style_linebr)
// Add labels for cross under and crossover events
if ta.crossunder(close, trend_line)
label.new(bar_index, trend_line, score < 0.5 ? "▼+" : "▼",
color = dn,
textcolor = chart.fg_color,
style = label.style_label_lower_right,
size = score < 0.5 ? size.small : size.tiny)
if ta.crossover(close, trend_line)
label.new(bar_index, trend_line, score > 0.5 ? "▲+" : "▲",
color = up,
textcolor = chart.bg_color,
style = label.style_label_upper_right,
size = score > 0.5 ? size.small : size.tiny)
// Determine trend color based on trend direction
color trend_color = trend ? color.new(up, 80) : color.new(dn, 80)
// Fill between trend line and average line to show areas of trend
fill(p1, p2, trend_line, avg, trend_color, na)
fill(p1, p2, trend_line, avg, trend_color, na)
// Add retest labels if the option is enabled
if show_retest
if ta.crossunder(high, avg) and not trend
label.new(bar_index[1], high[1], "▼",
color = color(na),
style = label.style_label_down,
textcolor = chart.fg_color,
size = size.small)
if ta.crossover(close, avg) and trend
label.new(bar_index[1], low[1], "▲",
color = color(na),
style = label.style_label_up,
textcolor = chart.fg_color,
size = size.small)
// Calculate score-up and score-down for trend strength representation
float score_up = (score - 1) * -1
float score_dn = 1 - score_up
// Display trend strength as a table if on the last bar
if barstate.islast
table trend_strength_up = table.new(position.bottom_center, 100, 100)
table trend_strength_dn = table.new(position.top_center, 100, 100)
// Create cells to represent trend strength up
for i = 0 to score_up * 20
trend_strength_up.cell(0 + i, 0, bgcolor = color.new(up, 100 - i * 5), text = i == 0 ? "|" : "", text_color = color.gray)
if i == score_up * 20
trend_strength_up.cell(0 + i, 0,
text = str.tostring(score_up * 100, format.percent) + " ▲",
text_color = chart.fg_color,
height = 2)
// Create cells to represent trend strength down
for i = 0 to score_dn * 20
trend_strength_dn.cell(0 + i, 0, bgcolor = color.new(dn, 100 - i * 5), text = i == 0 ? "|" : "", text_color = color.gray)
if i == score_dn * 20
trend_strength_dn.cell(0 + i, 0,
text = str.tostring(score_dn * 100, format.percent) + " ▼",
text_color = chart.fg_color,
height = 2)
// }
⚠️ High Risk Warning
Trading Forex and Futures involves a very high degree of risk and may not be suitable for all investors. The high degree of leverage can result in the complete loss of your funds. These indicators are educational tools and do not guarantee profits. Please trade responsibly with capital you can afford to lose.