
Se trata de una estrategia que utiliza la línea de equilibrio y el canal de Brin para juzgar la tendencia, y se combina con el filtro de ruptura y el principio de parada. Se puede capturar la señal en el momento en que la tendencia cambia, reducir la señal errónea a través de la doble línea de equilibrio de filtración, y establecer paradas para controlar el riesgo.
La estrategia se compone principalmente de las siguientes partes:
Determinación de tendencias: utiliza el MACD para determinar las tendencias de precios, distinguiendo entre las tendencias de más y las de menos.
Filtración de rango: utiliza el canal de Brin para determinar el rango de fluctuación de los precios y filtra las señales que no superan el rango.
Confirmación de doble línea media: doble línea media compuesta por EMA rápido y EMA lento, para confirmar la señal de tendencia. La señal de compra solo se genera cuando EMA rápido> EMA lento.
Mecanismo de stop loss: establece un punto de stop loss, que se cierra cuando el precio rompe el punto de stop loss hacia la dirección negativa.
La lógica de juicio de las señales entrantes es:
Cuando se cumplen las tres condiciones anteriores, se genera una señal de compra.
La lógica de la posición de equilibrio se divide en dos tipos, la posición de parada y la posición de parada. El punto de parada es el precio de entrada multiplicado por una cierta proporción, y el punto de parada es el precio de entrada multiplicado por una cierta proporción.
Esta estrategia tiene las siguientes ventajas:
La estrategia también tiene sus riesgos:
Para estos riesgos, se puede optimizar y mejorar mediante la optimización de los parámetros, el ajuste de la posición de parada, etc.
La estrategia puede ser optimizada en las siguientes direcciones:
Se puede encontrar el estado óptimo de la estrategia probando diferentes configuraciones de parámetros para evaluar la rentabilidad y el Sharpe ratio.
Es una estrategia cuantitativa que utiliza el juicio de tendencias, el filtrado de rangos, la confirmación de doble equilátero y el pensamiento de parada de pérdidas. Puede determinar la dirección de la tendencia de manera efectiva y encontrar el equilibrio entre la maximización de las ganancias y el control del riesgo.
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)
// Original Script > @DonovanWall
// Adapted Version > @guikroth
//
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////
SS = input.bool(false,"Percentage Take Profit Stop Loss")
longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01
shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01
longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01
shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01
// Color variables
upColor = color.white
midColor = #90bff9
downColor = color.blue
// Source
src = input(defval=close, title="Source")
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")
// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")
// Smooth Average Range
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)
// Range Filter
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)
// Filter Direction
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])
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
src > filt and src < src[1] and upward > 0 ? upColor :
src < filt and src < src[1] and downward > 0 ? downColor :
src < filt and src > src[1] and downward > 0 ? downColor : midColor
filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")
// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")
// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")
// Bar Color
barcolor(barcolor)
// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or
src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or
src < filt and src > src[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1
// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")
////////////// 副
sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')
DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7
calc_macd(source, fastLength, slowLength) =>
fastMA = ta.ema(source, fastLength)
slowMA = ta.ema(source, slowLength)
fastMA - slowMA
calc_BBUpper(source, length, multt) =>
basis = ta.sma(source, length)
dev = multt * ta.stdev(source, length)
basis + dev
calc_BBLower(source, length, multt) =>
basis = ta.sma(source, length)
dev = multt * ta.stdev(source, length)
basis - dev
t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity
e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)
trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0
duoad = trendUp > 0 and trendUp > e1
kongad = trendDown > 0 and trendDown > e1
duo = longCondition and duoad
kong = shortCondition and kongad
//Alerts
plotshape(longCondition and trendUp > e1 and trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition and trendDown > e1 and trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))
if longCondition and trendUp > e1 and trendUp > 0
strategy.entry('Long',strategy.long, comment = "buy" )
if shortCondition and trendDown > e1 and trendDown > 0
strategy.entry('Short',strategy.short, comment = "sell" )
longlimtPrice = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)
if (strategy.position_size > 0) and SS == true
strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
if (strategy.position_size < 0) and SS == true
strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)