// This Pine Script™ code is subject to the terms of the Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) [URL]https://creativecommons.org/licenses/by-nc-sa/4.0/[/URL]
// © UAlgo
//@version=5
indicator("Fear/Greed Zone Reversals [UAlgo]", overlay=true, shorttitle="Fear/Greed Zone Reversals [UAlgo]")
// Grouped Settings
group_general = "General Settings"
group_fear = "Fear Zone Settings"
group_greed = "Greed Zone Settings"
group_colors = "Colors"
// Moving Average Type Selection
ma_type_fear = input.string("SMA", title="Moving Average Type for Fear", options=["SMA", "EMA", "WMA", "VWMA", "HMA"], group=group_fear)
ma_type_greed = input.string("SMA", title="Moving Average Type for Greed", options=["SMA", "EMA", "WMA", "VWMA", "HMA"], group=group_greed)
// FearZone Settings
src_fear = input.source(close, title="Fear Source", group=group_fear)
len_high_fear = input.int(50, title="Fear Period", group=group_fear)
stdev_len_fear = input.int(50, title="Fear Stdev Period", group=group_fear)
// GreedZone Settings
src_greed = input.source(close, title="Greed Source", group=group_greed)
len_low_greed = input.int(50, title="Greed Period", group=group_greed)
stdev_len_greed = input.int(50, title="Greed Stdev Period", group=group_greed)
// Color Settings
color_fear_label = input.color(color.teal, title="Fear Label Color", group=group_colors)
color_greed_label = input.color(color.red, title="Greed Label Color", group=group_colors)
text_color = input.color(color.white, title="Label Text Color", group=group_colors)
// Function to calculate the selected moving average
f_moving_average(ma_type, src, length) =>
ma = switch ma_type
"SMA" => ta.sma(src, length)
"EMA" => ta.ema(src, length)
"WMA" => ta.wma(src, length)
"VWMA" => ta.vwma(src, length)
"HMA" => ta.hma(src, length)
=> ta.sma(src, length) // Default to SMA if something goes wrong
ma
// Function to calculate the first zone condition and limit
f_zone_condition_1(src, len_high, stdev_len, ma_type, is_fear) =>
cond_1 = is_fear ? (ta.highest(src, len_high) - src) / ta.highest(src, len_high) : (ta.lowest(src, len_high) - src) / ta.lowest(src, len_high)
avg_1 = f_moving_average(ma_type, cond_1, stdev_len)
stdev_1 = ta.stdev(cond_1, stdev_len)
limit_1 = is_fear ? avg_1 + stdev_1 : avg_1 - stdev_1
[cond_1, limit_1]
// Function to calculate the second zone condition and limit
f_zone_condition_2(src, len_high, stdev_len, ma_type, is_fear) =>
cond_2 = f_moving_average(ma_type, src, len_high)
avg_2 = f_moving_average(ma_type, cond_2, stdev_len)
stdev_2 = ta.stdev(cond_2, stdev_len)
limit_2 = is_fear ? avg_2 - stdev_2 : avg_2 + stdev_2
[cond_2, limit_2]
// Function to check zone activity
f_zone_active(cond_1, cond_2, limit_1, limit_2, is_fear) =>
is_fear ? (cond_1 > limit_1 and cond_2 < limit_2) : (cond_1 < limit_1 and cond_2 > limit_2)
// FearZone Calculations
[fear_cond_1, fear_limit_1] = f_zone_condition_1(src_fear, len_high_fear, stdev_len_fear, ma_type_fear, true)
[fear_cond_2, fear_limit_2] = f_zone_condition_2(src_fear, len_high_fear, stdev_len_fear, ma_type_fear, true)
fear_zone_active = f_zone_active(fear_cond_1, fear_cond_2, fear_limit_1, fear_limit_2, true)
// GreedZone Calculations
[greed_cond_1, greed_limit_1] = f_zone_condition_1(src_greed, len_low_greed, stdev_len_greed, ma_type_greed, false)
[greed_cond_2, greed_limit_2] = f_zone_condition_2(src_greed, len_low_greed, stdev_len_greed, ma_type_greed, false)
greed_zone_active = f_zone_active(greed_cond_1, greed_cond_2, greed_limit_1, greed_limit_2, false)
// Buy/Sell Signals
if greed_zone_active[1] and not greed_zone_active
label.new(bar_index, high+ta.atr(14)*0.5, "▼", style=label.style_label_down, color=color_greed_label, textcolor=text_color, size=size.small)
if fear_zone_active[1] and not fear_zone_active
label.new(bar_index, low-ta.atr(14)*0.5, "▲", style=label.style_label_up, color=color_fear_label, textcolor=text_color, size=size.small)
// Alert Conditions
alertcondition(greed_zone_active[1] and not greed_zone_active, title="Greed Zone Reversal", message="Greed Zone Reversal detected")
alertcondition(fear_zone_active[1] and not fear_zone_active, title="Fear Zone Reversal", message="Fear Zone Reversal detected")