
A estratégia é uma estratégia de acompanhamento de tendências baseada em um duplo cruzamento de 10 EMAs e 50 EMAs. Combina a linha horária de 10 EMAs como um julgamento auxiliar para encontrar a direção da tendência de forma dinâmica em mercados alternados por altos e baixos, permitindo o acompanhamento automático de um stop loss.
A lógica central da estratégia é baseada em 10 EMA e 50 EMA. Concretamente, quando 10 EMA atravessa 50 EMA de cima para baixo, o mercado entra em uma tendência ascendente; quando 10 EMA atravessa 50 EMA de cima para baixo, o mercado entra em uma tendência descendente.
Além disso, a estratégia também introduz o 10EMA da linha horária como um julgamento auxiliar, só quando a linha horária 10EMA está em uma tendência ascendente para abrir uma posição a mais atrás da forca de ouro, só quando a linha horária 10EMA está em uma tendência descendente para abrir uma posição vazia após a forca de morte, para filtrar parte dos falsos sinais.
Após a abertura da posição, a estratégia usa o método de saída de tracking stop loss + stop loss. O tracking stop loss permite bloquear os lucros e maximizar a rentabilidade da negociação; o stop loss garante que o fechamento da posição seja lucrativo quando o preço atinge o ponto de meta.
A maior vantagem da estratégia é que, ao mesmo tempo em que utiliza o cruzamento EMA para determinar a direção da tendência principal, também introduz o sinal de filtragem de indicadores auxiliares, que pode filtrar efetivamente o cruzamento falso e, assim, aumentar a confiabilidade do sinal. Além disso, o cruzamento EMA duplo, combinado com o traçado de parada de perda e o limite de parada de preço, pode maximizar os ganhos do traçado de tendência e, ao mesmo tempo, controlar eficazmente o risco de negociação.
A estratégia usa uma tecnologia de stop loss mais avançada que o stop loss tradicional, e é mais capaz de traçar lucros.
A estratégia enfrenta principalmente o risco de whipsaw intermitente e reversão de tendência. Quando ocorrem falsos sinais de cruzamento consecutivos, isso pode levar à estratégia de arbitragem. Além disso, a reversão de preço após a abertura de posição também pode causar perdas.
Para reduzir o risco de whipsaw, a estratégia de incluir indicadores auxiliares para filtragem de sinais. Para controlar o risco de uma reversão da tendência, a estratégia de usar um intervalo de parada mais tolerante, ao mesmo tempo, o limite de preço de parada de configuração também pode ajudar a reduzir esse risco. Quando a parada é acionado, também pode considerar a reentrada na direção da tendência.
A estratégia também pode ser otimizada em várias direções: primeiro, você pode testar diferentes combinações de parâmetros, como o ciclo EMA, a raiz de atraso de abertura da posição, etc., para encontrar o melhor parâmetro; segundo, você pode introduzir mais indicadores auxiliares, como MACD, BOLL, etc., para filtrar o sinal e melhorar a qualidade do sinal; terceiro, você pode otimizar a lógica de parada de perda, como o uso de outros métodos de parada, como parada de tempo, parada de oscilação e assim por diante; quarto, você pode combinar mais condições de abertura de negociação com a estratégia de abertura, como o sinal de disparo apenas em certos períodos de tempo ou queda.
A estratégia de acompanhamento de tendências de dupla cruz 10 EMA, que determina a direção da tendência atual através da cruz de ouro EMA e cruz de morte, configura um stop loss e um stop limit para bloquear os lucros e controlar os riscos, e combina sinais de filtragem de indicadores auxiliares para melhorar a qualidade do sinal, é uma estratégia de negociação de tendências mais completa. Em comparação com o indicador único e o stop loss tradicional, a estratégia tem a vantagem de julgar com precisão, o stop loss e a otimização do stop loss, além de controlar o risco ao mesmo tempo, que é capaz de obter efetivamente o ganho da tendência.
/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("10ema Strat 9", overlay=true, format=format.price)
//#region // inputs for candles
//time
t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading
// candle status
bullish = close > open and barstate.isconfirmed
bearish = open > close and barstate.isconfirmed
bullcandle = ta.valuewhen(bullish, close, 0)
bearcandle = ta.valuewhen(bearish, close, 0)
ema1 = input.int(10, minval=1, title="short ema")
ema2 = input.int(50, minval=1, title="long ema")
ema3 = input.int(200, minval=1, title="hourly 10 ema")
//@variable Input for source
src = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
sema = ta.ema(src, ema1)//@variable Input for smaller ema1
lema = ta.ema(src, ema2)//@variable Input for longer ema2
hema = ta.ema(src, ema3)// @variable Input for hourly ema3
bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher
bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower
ideallong = bullcrosscount <= 5 //number of candles after the cross
idealshort = bearcrosscount <= 5 //number of candles after the cross
emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed
xemabull = ta.barssince(emabull)
dbullema = emabull and emabull[1] and xemabull <=1
bullentry = if dbullema
ta.valuewhen(emabull[1], high + 0.05, 0)
else
ta.valuewhen(emabull, high + 0.05, 0)
bullentryh = dbullema ? bullentry[1] : bullentry
bullentrylow = ta.valuewhen(emabull, low - 0.05, 0)
bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na
bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh
// bear setup
emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed
xemabear = ta.barssince(emabear)
dbearema = emabear and emabear [1] and xemabear <=1
bearentry = if dbearema
ta.valuewhen(emabear[1], low - 0.05, 0)
else
ta.valuewhen(emabear, low - 0.05, 0)
bearentryh = dbearema ? bearentry[1] : bearentry
bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0)
bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na
beartarget = bearentryh - (bearstop-bearentryh) * 1.62
bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above
bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below
buyzone = ta.barssince(bullclose)
shortzone = ta.barssince(bearclose)
idealbuy = close >= bullentryh and bullclose and (buyzone<=7)
idealsell = close <= bearentryh and bearclose and (shortzone<=7)
// // bull setup on chart
// if sema > lema and xemabull < 50
// var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bullentry, x=bar_index, y=bullentryh)
// line.set_xy2(line_bullentry, x=bar_index, y=bullentryh)
// alert("EMA-bullish", alert.freq_once_per_bar_close)
// line.set_x2(line_bullentry, x=bar_index)
// var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bullstop, x=bar_index, y=bullstop)
// line.set_xy2(line_bullstop, x=bar_index, y=bullstop)
// line.set_x2(line_bullstop, x=bar_index)
// var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget)
// line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget)
// line.set_x2(line_bulltarget, x=bar_index)
// //bear setup on chart
// if sema < lema and xemabear < 50
// var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_bearentry, x=bar_index, y=bearentryh)
// line.set_xy2(line_bearentry, x=bar_index, y=bearentryh)
// alert("EMA-bearish", alert.freq_once_per_bar_close)
// line.set_x2(line_bearentry, x=bar_index)
// var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_bearstop, x=bar_index, y=bearstop)
// line.set_xy2(line_bearstop, x=bar_index, y=bearstop)
// line.set_x2(line_bearstop, x=bar_index)
// var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_beartarget, x=bar_index, y=beartarget)
// line.set_xy2(line_beartarget, x=bar_index, y=beartarget)
// line.set_x2(line_beartarget, x=bar_index)
//#endregion
//execution
if idealbuy
strategy.close("sell", comment=na)
strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy")
strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop)
if idealsell
strategy.close("buy",comment=na)
strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell")
strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop)
// strategy.close_all(time == close_day)
//#region // graphical analysis
//Plots
plotshape(emabull, location=location.belowbar, title='emabull')
plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close")
plotshape(emabear, title='emabear')
plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close")
// //Dashboard
// var label id = na
// label.delete(id) // Delete last label
// i_offsetLabel = input(15, "Data Dashboard Offset")
// offset = i_offsetLabel * (time - time[1])
// dynamicText = "= Bull Setup ="
// id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal)
// label.set_textcolor(id, color.rgb(0, 0, 0))
// label.set_text(id=id, text=dynamicText)
// label.set_textalign(id, text.align_left)
// label.set_text(id=id, text=dynamicText)
// f_round( _val, _decimals) =>
// _p = math.pow(10, _decimals)
// math.round(math.abs(_val) * _p) / _p * math.sign(_val)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + " :Target"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + " :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + " :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + "= Bear Setup ="
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + " :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + " :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + " :Target"
// label.set_text(id=id, text=dynamicText)
// //#endregion