Author Message:
RedK TrendBeads is a super simple 3 x Moving Average Crossover Signal (Long/Short/Break) script that provides a simple and effective way for traders to identify potential trading opportunities. By combining three moving averages and only exposing a simple signal, the script helps filter out noise and focus on the trend and the trade execution.
Background
===========
A 3 x Moving Average Crossover strategy is a popular trading method in technical analysis . It uses the relationship between a fast, medium, and slow moving averages to generate buy or sell signals.
The approach usually utilizes three moving averages to track the average price of a financial instrument over different time periods. By comparing the fast, medium, and slow moving averages, we can generates a signal to trade long or short
If the fast moving average crosses above the medium moving average and the medium moving average is above the slow moving average, we have a probability of an up-trend forming, and we generate a signal to go long. Conversely, if the fast moving average crosses below the medium moving average and the medium moving average is below the slow moving average, we have a probability of a down-trend forming, and we generate a signal to go short. When the moving averages are not in the right order (above or below each other), we have a trend break, usually on consolidation or base forming.
in TrendBeads, the fastest MA is called "Price Proxy MA" and will be used with a relatively short length to represent the price itself - then there are the Fast MA, Slow MA and a Filter MA (usually with the longest/slowest length) which is the main line that will be used to plot the TrendBeads - So the TrendBeads will represent the state of the other 3 Moving Average lines (Proxy, Fast and Slow) and how they are aligned - and it will also be common to use the Filter / Beads line itself as a main filter, i.e., take long positions only when the price action is above the Filter MA, and short positions only when the price is below the Filter MA.
So what is different with TrendBeads:
=====================================
Simplicity, No Clutter: I put this together to provide a super simple mechanism to track trend on the price chart without so much noise as i also wanted to have other top-chart indicators (like LadderTrader) - so TrendBeads only shows the "beads" on the chart - they act like "traffic lights" with little distracting information - Simplicity here was deliberately part if the idea
Presets, What others are Watching: The other feature I needed was the ability to track price action against "different sets" of Moving Averages quickly - for example, when executing short-term trades, I needed to use Moving Averages with shorter length and want to utilize my RSS_WMA MA type - but when assessing big breakout opportunities, I need to analyze price action against a different set of MA's with (usually) longer length and mainly SMA's (hint, The Minervini template) - This is where the built-in Preset Templates become very useful.
Having these preset templates quickly available (thru the dropdown in indicator settings) provides time saving, convenience and the confidence that we're looking at what other traders are using in their analysis - so not missing out on key-level breakouts or reversals
TrendBeads v1.0 includes the following 5 preset MA templates
======================================================
Preset 1 : RedK_1: 8RSS / 15RSS / 21RSS / 30SMA
Preset 2 : RedK_2: 5WMA / 10SMA / 20SMA / 40SMA
Preset 3 : SWNG_1: 7EMA / 21EMA / 30EMA / 50SMA
Preset 4 : SWNG_2: 10EMA / 21EMA / 50SMA / 100SMA
Preset 5 : SWNG_3: 10EMA / 21EMA / 100SMA / 200SMA
CODE:
CSS:
#// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
#// © RedKTrader
#indicator('RedK TrendBeads', shorttitle='K-TrendBeads v1.0', overlay=true, timeframe='', timeframe_gaps=false)
#// 3 MA-Line Ribbon on a slow MA filter line.. just a super simple set-up
#// updated this version of LazyLine() to reflect a regular WMA for length < 5
# Converted and mode by Sam4Cok@Samer800 - 02/2023
input BarColor = no;
input ShowTrendCloud = no;
input UsePresets = no;#(false, title = "Use Presets?", inline = 'presets', group = grp_p)
input PresetOptions = {Default "8RSS / 15RSS / 21RSS / 30SMA",
"5WMA / 10SMA / 20SMA / 40SMA",
"7EMA / 21EMA / 30EMA / 50SMA",
"10EMA / 21EMA / 50SMA / 100SMA",
"10EMA / 21EMA / 100SMA / 200SMA"};
input Proxy_Src = close; # 'Proxy Source'
input Proxy_Type = {Default RSS_WMA, WMA, EMA, SMA, HMA};
input Proxy_Length = 8; # 'Length'
input FastMa_Src = close; # 'Fast MA Source'
input FastMa_Type = {Default RSS_WMA, WMA, EMA, SMA, HMA};
input FastMa_Length = 15; # 'Length'
input SlowMa_Src = close; # 'Slow MA Source'
input SlowMa_Type = {Default RSS_WMA, WMA, EMA, SMA, HMA};
input SlowMa_Length = 21; # 'Length'
input Filter_Src = close; # 'Filter Source'
input Filter_Type = {RSS_WMA, WMA, EMA, Default SMA, HMA};
input Filter_Length = 40; # 'Length'
def na = Double.NaN;
#f_LazyLine(_data, _length) =>
script f_LazyLine {
input _data = close;
input _length = 10;
def w1;
def w2;
def w3;
def L1;
def L2;
def L3;
def na = Double.NaN;
def w = _length / 3;
if _length > 4 {
w2 = Round(w, 0);
w1 = Round((_length - w2) / 2, 0);
w3 = Floor((_length - w2) / 2);
L1 = WMA(_data, w1);
L2 = WMA(L1, w2);
L3 = WMA(L2, w3);
} else {
w2 = na;
w1 = na;
w3 = na;
L1 = na;
L2 = na;
L3 = WMA(_data, _length);
}
plot return = L3;
}
#f_getMA(source, length, type) =>
script f_getMA {
input source = close;
input length = 10;
input type = 5;
def ma = if type == 1 then Average(source, length) else
if type == 2 then ExpAverage(source, length) else
if type == 3 then wma(source, length) else
if type == 4 then HullMovingAvg(source, length) else f_LazyLine(source, length);
plot return = ma;
}
#//f_UsePreset() => //function
def pset = if PresetOptions==PresetOptions."8RSS / 15RSS / 21RSS / 30SMA" then 1 else
if PresetOptions==PresetOptions."5WMA / 10SMA / 20SMA / 40SMA" then 2 else
if PresetOptions==PresetOptions."7EMA / 21EMA / 30EMA / 50SMA" then 3 else
if PresetOptions==PresetOptions."10EMA / 21EMA / 50SMA / 100SMA" then 4 else 5;
def ProxyType = if Proxy_Type == Proxy_Type.SMA then 1 else
if Proxy_Type == Proxy_Type.EMA then 2 else
if Proxy_Type == Proxy_Type.WMA then 3 else
if Proxy_Type == Proxy_Type.HMA then 4 else 5;
def FastType = if FastMa_Type == FastMa_Type.SMA then 1 else
if FastMa_Type == FastMa_Type.EMA then 2 else
if FastMa_Type == FastMa_Type.WMA then 3 else
if FastMa_Type == FastMa_Type.HMA then 4 else 5;
def SlowType = if SlowMa_Type == SlowMa_Type.SMA then 1 else
if SlowMa_Type == SlowMa_Type.EMA then 2 else
if SlowMA_Type == SlowMa_Type.WMA then 3 else
if SlowMA_Type == SlowMa_Type.HMA then 4 else 5;
def FilType = if Filter_Type == Filter_Type.SMA then 1 else
if Filter_Type == Filter_Type.EMA then 2 else
if Filter_Type == Filter_Type.WMA then 3 else
if Filter_Type == Filter_Type.HMA then 4 else 5;
def iProxy_Src;
def iProxy_Length;
def iProxy_Type;
def iFast_Src;
def iFast_Length;
def iFast_Type;
def iSlow_Src;
def iSlow_Length;
def iSlow_Type;
def iFil_Src;
def iFil_Length;
def iFil_Type;
if UsePresets {
if pset == 1 {
iProxy_Src = close;
iProxy_Length = 8;
iProxy_Type = 5;
iFast_Src = close;
iFast_Length = 15;
iFast_Type = 5;
iSlow_Src = close;
iSlow_Length = 21;
iSlow_Type = 5;
iFil_Src = close;
iFil_Length = 30;
iFil_Type = 1;
} else if pset == 2 {
iProxy_Src = close;
iProxy_Length = 5 ;
iProxy_Type = 3;
iFast_Src = close;
iFast_Length = 10;
iFast_Type = 1;
iSlow_Src = close;
iSlow_Length = 20;
iSlow_Type = 1;
iFil_Src = close;
iFil_Length = 40;
iFil_Type = 1;
} else if pset == 3 {
iProxy_Src = close;
iProxy_Length = 7;
iProxy_Type = 2;
iFast_Src = close;
iFast_Length = 21;
iFast_Type = 2;
iSlow_Src = close;
iSlow_Length = 30;
iSlow_Type = 2;
iFil_Src = close;
iFil_Length = 50;
iFil_Type = 1;
} else if pset == 4 {
iProxy_Src = close;
iProxy_Length = 10;
iProxy_Type = 2;
iFast_Src = close;
iFast_Length = 21;
iFast_Type = 2;
iSlow_Src = close;
iSlow_Length = 50;
iSlow_Type = 1;
iFil_Src = close;
iFil_Length = 100;
iFil_Type = 1;
} else {
iProxy_Src = close;
iProxy_Length = 10;
iProxy_Type = 2;
iFast_Src = close;
iFast_Length = 21;
iFast_Type = 2;
iSlow_Src = close;
iSlow_Length = 100;
iSlow_Type = 1;
iFil_Src = close;
iFil_Length = 200;
iFil_Type = 1;}
} else {
iProxy_Src = Proxy_Src;
iProxy_Length= Proxy_Length;
iProxy_Type = ProxyType;
iFast_Src = FastMa_Src;
iFast_Length = FastMa_Length;
iFast_Type = FastType;
iSlow_Src = SlowMa_Src;
iSlow_Length = SlowMa_Length;
iSlow_Type = SlowType;
iFil_Src = Filter_Src;
iFil_Length = Filter_Length;
iFil_Type = FilType;
}
#// Calculation
def LL1 = f_getMA(iProxy_Src, iProxy_Length, iProxy_Type);
def LL2 = f_getMA(iFast_Src, iFast_Length, iFast_Type);
def LL3 = f_getMA(iSlow_Src, iSlow_Length, iSlow_Type);
def Filter = f_getMA(iFil_Src, iFil_Length, iFil_Type);
def ProxyLine = LL1; # "Proxy Line"
def FastMA = LL2; # "Fast MA"
def SlowMA = LL3; # "Slow MA",
def Mode_Long = LL1 > LL2 and LL2 > LL3;
def Mode_Short = LL1 < LL2 and LL2 < LL3;
def c_Filter = if Mode_Long then 1 else
if Mode_Short then -1 else 0;
plot FilterMA = Filter; # "Filter MA"
FilterMA.SetStyle(Curve.POINTS);
FilterMA.AssignValueColor(if Mode_Long then CreateColor(0,188,212) else
if Mode_Short then CreateColor(255,152,0) else Color.GRAY);
AddCloud(if ShowTrendCloud then ProxyLine else na,SlowMA, Color.DARK_GREEN, Color.DARK_RED);
AddCloud(if ShowTrendCloud then ProxyLine else na,FastMA, Color.DARK_GREEN, Color.DARK_RED);
def ExtUp = Mode_Long and LL1>Filter;
def Up = LL1>Filter and LL1>SlowMA;
def ExtDn = Mode_Short and LL1<Filter;
def Dn = LL1<Filter and LL1<SlowMA;
AssignPriceColor(if !BarColor then Color.CURRENT else
if ExtUp then Color.GREEN else
if Up then Color.DARK_GREEN else
if ExtDn then Color.RED else
if Dn then Color.DARK_RED else Color.GRAY);
#--- END CODE
Last edited by a moderator: