La estrategia combina indicadores de rango, indicadores de dinámica y seguimiento de tendencias para capturar movimientos a corto plazo. Las reglas específicas de la estrategia son las siguientes:
Calcula el rango de precios en un determinado período (la diferencia entre los puntos altos y bajos) y el proceso de suavización, obteniendo un indicador de rango de suavización. Este indicador puede determinar la expansión y contracción de la tendencia de los precios.
Calcular indicadores de la dinámica en un determinado período, como la curva de Hull. La curva de Hull tiene un buen efecto en el juicio de la dirección de la tendencia a corto plazo y la fuerza.
Cuando el color del indicador del rango de la plancha cambia (por ejemplo, de rojo a verde), indica que el rango comienza a ampliarse y se complementa con la curva de Hull isotrópica (por ejemplo, la curva de Hull hacia arriba), se hace más entrada.
Cuando el color del indicador del rango de nivelación cambia (por ejemplo, de verde a rojo), indica que el rango comienza a contraerse, y se combina con la curva de Hull paralelo (por ejemplo, la curva de Hull hacia abajo), se hace una entrada en blanco.
Añade un mecanismo de seguimiento de la tendencia para detener los pérdidas, por ejemplo, el retroceso de la curva de Hull para detener la salida.
El indicador de rango determina la expansión de la tendencia y el indicador de dinámica determina la dirección, lo que permite capturar rápidamente las oportunidades de tendencia a corto plazo.
La estrategia utiliza un conjunto de indicadores técnicos para aprovechar rápidamente las oportunidades de tendencia en las líneas cortas. Su frecuencia de operación es más alta que la de las estrategias de línea larga, lo que permite capturar las fluctuaciones de precios a corto plazo. Sin embargo, se requiere un estricto mecanismo de suspensión de pérdidas para controlar el riesgo.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-30 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © flygalaxies
// Strategy based on the Follow Line Indicator by Dreadblitz, Hull Suite by InSilico and Range Filter Buy and Sell 5 min by guikroth
// Designed for the purpose of back testing
// Strategy:
// - When the Range Filter Color Changes, And the HULL Suite is in that direction, Enter In that direction
// - e.g Range Filter Changes color from red to green, and Hull Suite is in Green. Enter Long
// - e.g Range Filter Changes color from green to red, and Hull Suite is in red. Enter Short
//
// Credits:
// Hull Suite by InSilico https://www.tradingview.com/u/InSilico/
// Range Filter Buy and Sell 5 min https://www.tradingview.com/u/guikroth/
// Follow Line Indicator by Dreadblitz https://www.tradingview.com/u/Dreadblitz/
// Follow line not used at this moment
//@version=5
strategy("Follow The Ranging Hull", overlay=true, initial_capital = 50000)
////////////////////
// COLOR INPUTS ///
//////////////////
rngFilterColorUp = input.color(title="Range Filter Color Up", defval = color.green, group="Color")
rngFilterColorDown = input.color(title="Range Filter Color Up", defval = color.red, group="Color")
hullColorUp = input.color(title="Hull Color Up", defval = color.green, group="Color")
hullColorDown = input.color(title="Hull Color Up", defval = color.red, group="Color")
fliColorUp = input.color(title="Follow Line Color Up", defval = color.green, group="Color")
fliColorDown = input.color(title="Follow Line Color Up", defval = color.red, group="Color")
///////////////////////////
// Range Filter INPUTS ///
/////////////////////////
src = input(defval=ohlc4, title="Source", group="Range Filter")
per = input.int(defval=33, minval=1, title="Sampling Period", group="Range Filter")
mult = input.float(defval=2.1, minval=0.1, title="Range Multiplier", group="Range Filter", step=0.1)
/////////////////////////
// Hull Suite INPUTS ///
///////////////////////
srcHull = input(close, title="Source", group="Hull Suite")
modeSwitch = input("Ehma", title="Hull Variation", options=["Hma", "Thma", "Ehma"], group="Hull Suite")
length = input(55, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?", group="Hull Suite")
visualSwitch = input(true, title="Show as a Band?", group="Hull Suite")
thicknesSwitch = input(1, title="Line Thickness", group="Hull Suite")
transpSwitch = input.int(40, title="Band Transparency",step=5, group="Hull Suite")
//////////////////////////
// FOLLOW LINE INPUTS ///
////////////////////////
BBperiod = input.int(defval = 21, title = "BB Period", minval = 1)
BBdeviations = input.float(defval = 1.00, title = "BB Deviations", minval = 0.1, step=0.05)
UseATRfilter = input.bool(defval = true, title = "ATR Filter")
ATRperiod = input.int(defval = 5, title = "ATR Period", minval = 1)
hl = input.bool(defval = false, title = "Hide Labels")
//////////////////////////
// Range Filter Logic ///
////////////////////////
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), t)
smoothrng = ta.ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r :
x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
rngfilt
filt = rngfilt(src, smrng)
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
filtcolor = upward > 0 ? rngFilterColorUp : downward > 0 ? rngFilterColorDown : color.orange
filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")
////////////////////////
// Hull Suite Logic ///
//////////////////////
HMA(_srcHull, _length) => ta.wma(2 * ta.wma(_srcHull, _length / 2) - ta.wma(_srcHull, _length), math.round(math.sqrt(_length)))
EHMA(_srcHull, _length) => ta.ema(2 * ta.ema(_srcHull, _length / 2) - ta.ema(_srcHull, _length), math.round(math.sqrt(_length)))
THMA(_srcHull, _length) => ta.wma(ta.wma(_srcHull,_length / 3) * 3 - ta.wma(_srcHull, _length / 2) - ta.wma(_srcHull, _length), _length)
Mode(modeSwitch, src, len) =>
modeSwitch == "Hma" ? HMA(src, len) :
modeSwitch == "Ehma" ? EHMA(src, len) :
modeSwitch == "Thma" ? THMA(src, len/2) : na
_hull = Mode(modeSwitch, src, int(length))
HULL = _hull
MHULL = HULL[0]
SHULL = HULL[2]
hullColor = switchColor ? (HULL > HULL[2] ? hullColorUp : hullColorDown) : #ff9800
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
/////////////////////////
// Follow Line Logic ///
///////////////////////
BBUpper=ta.sma (close,BBperiod)+ta.stdev(close, BBperiod)*BBdeviations
BBLower=ta.sma (close,BBperiod)-ta.stdev(close, BBperiod)*BBdeviations
TrendLine = 0.0
iTrend = 0.0
buy = 0.0
sell = 0.0
BBSignal = close>BBUpper? 1 : close<BBLower? -1 : 0
if BBSignal == 1 and UseATRfilter == 1
TrendLine:=low-ta.atr(ATRperiod)
if TrendLine<TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == -1 and UseATRfilter == 1
TrendLine:=high+ta.atr(ATRperiod)
if TrendLine>TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == 0 and UseATRfilter == 1
TrendLine:=TrendLine[1]
//
if BBSignal == 1 and UseATRfilter == 0
TrendLine:=low
if TrendLine<TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == -1 and UseATRfilter == 0
TrendLine:=high
if TrendLine>TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == 0 and UseATRfilter == 0
TrendLine:=TrendLine[1]
//
iTrend:=iTrend[1]
if TrendLine>TrendLine[1]
iTrend:=1
if TrendLine<TrendLine[1]
iTrend:=-1
//
buy:=iTrend[1]==-1 and iTrend==1 ? 1 : na
sell:=iTrend[1]==1 and iTrend==-1? 1 : na
//
plot(TrendLine, color=iTrend > 0? fliColorUp : fliColorDown ,style=plot.style_line,linewidth=2,transp=0,title="Trend Line")
plotshape(buy == 1 and hl == false? TrendLine-ta.atr(8) :na, text='💣', style= shape.labelup, location=location.absolute, color=color.blue, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 and hl == false ?TrendLine+ta.atr(8):na, text='🔨', style=shape.labeldown, location=location.absolute, color=color.red, textcolor=color.white, offset=0, transp=0,size=size.auto)
if(true)
// RANGE FILTER ENTRY LONG WITH HULL
// if(filtcolor[1] == rngFilterColorDown and filtcolor == rngFilterColorUp)
strategy.entry("rngFiltLong", strategy.long, when = buy == 1 and hl == false)
// RANGE FILTER ENTRY SHORT WITH HULL
// if(filtcolor[1] == rngFilterColorUp and filtcolor == rngFilterColorDown)
strategy.entry("rngFiltShort", strategy.short, when = sell == 1 and hl == false)
// strategy.close("rngFiltLong", when = HULL < HULL[2] )
// strategy.close("rngFiltShort", when = HULL > HULL[2] )