Esta estrategia combina indicadores de rango, impulso y tendencia para captar las tendencias a corto plazo.
Calcular el rango de precios durante un período (alto menos bajo) y suavizarlo para obtener un indicador de rango suave.
Calcular un indicador de impulso como la curva de Hull durante un período de tiempo.
Cuando el indicador de rango suavizado cambia de color (por ejemplo, de rojo a verde), indica un rango en expansión, y se toma una entrada larga si la curva del casco se alinea (por ejemplo, apuntando hacia arriba).
Cuando el rango suavizado cambia de color (por ejemplo, verde a rojo), indica un rango de contracción, y una entrada corta si se toma si la curva del casco se alinea (por ejemplo, apuntando hacia abajo).
Añadir un mecanismo de stop-loss de tendencia, como salir de largos si la curva de Hull se vuelve hacia abajo.
La expansión de los rangos con impulso direccional permite capturar rápidamente las tendencias a corto plazo.
Esta estrategia utiliza múltiples indicadores técnicos para capitalizar rápidamente las tendencias a corto plazo. En comparación con las estrategias a largo plazo, se negocia con más frecuencia para capturar los cambios de precios. Se requieren paradas estrictas para controlar los riesgos.
/*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] )