A estratégia de rastreamento da tendência de preços de momento utiliza múltiplos indicadores de momento para identificar as tendências de preços, estabelece posições no início das tendências e bloqueia os lucros através de configurações de stop profit e stop loss para rastrear as tendências de preços.
A estratégia de acompanhamento da tendência dos preços de impulso aplica-se principalmente aos seguintes indicadores técnicos:
Indicador de ROC: Este indicador calcula a taxa percentual de mudança de preço durante um determinado período para determinar o ímpeto do preço. Quando o ROC é positivo, significa que os preços estão subindo. Quando o ROC é negativo, significa que os preços estão caindo. A estratégia usa o indicador ROC para determinar a direção da tendência de preços.
Indicador de poder de touros e ursos: Este indicador reflete a comparação de poder entre touros e ursos.
Divergência: Este indicador identifica a inversão da tendência através do cálculo da divergência de preço e volume.
Canal de Donchian: Este indicador constrói um canal usando os preços mais altos e mais baixos, e os limites do canal podem servir como suporte e resistência.
Média Móvel: Este indicador suaviza as flutuações de preços para identificar a direção geral da tendência.
A estratégia determina tendências de preços e pontos de reversão com base nos indicadores acima, e estabelece posições longas ou curtas de acordo com os sinais do indicador no início das tendências.
As vantagens desta estratégia incluem:
O uso de múltiplos indicadores para determinar tendências reduz a probabilidade de erro de julgamento.
A utilização de divergências de indicadores permite captar com precisão os pontos de inversão da tendência.
A combinação de canais e médias móveis ajuda a determinar a tendência geral.
A definição de stop profit e stop loss assegura os lucros em tempo hábil e evita a expansão dos drawdowns.
Os parâmetros ajustáveis tornam a estratégia adaptável a diferentes períodos e produtos.
A lógica clara facilita a otimização.
Os riscos potenciais desta estratégia incluem:
Os múltiplos indicadores podem aumentar a probabilidade de sinal errôneo.
Pontos de stop loss definidos muito pequenos podem aumentar a probabilidade de stop loss, enquanto pontos muito amplos podem expandir os drawdowns.
A aplicação cega em períodos de mercado variados pode conduzir a uma inadaptabilidade.
É necessário um capital suficiente para sustentar unidades de posição elevada para alcançar retornos excessivos.
Os riscos de excesso de adaptação ao backtest existem, o desempenho das negociações reais é incerto.
A estratégia pode ser otimizada nos seguintes aspectos:
Otimizar os parâmetros dos indicadores para encontrar as combinações ideais para diferentes períodos e produtos.
Introduzir algoritmos de aprendizagem de máquina para encontrar automaticamente os parâmetros ideais.
Construir mecanismos de stop loss adaptativos com base nas condições do mercado.
Incorporar fatores de alta frequência e fundamentos para melhorar o alfa.
Desenvolver enquadramentos de ensaios automatizados para otimização de parâmetros e verificação de desempenho.
Introduzir módulos de gestão de riscos para controlar o dimensionamento das posições e reduzir os drawdowns.
Adicionar negociação e testes simulados e ao vivo para melhorar a estabilidade.
Esta estratégia combina múltiplos indicadores de momento para determinar as tendências de preços e usa stop profit/loss para bloquear os lucros. Pode efetivamente capturar tendências com forte estabilidade.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-09 00:00:00 period: 1m basePeriod: 1m 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/ // © mbagheri746 //@version=4 strategy("Bagheri IG Ether v2", overlay=true, margin_long=100, margin_short=100) TP = input(3000, minval = 1 , title ="Take Profit") SL = input(2200, minval = 1 , title ="Stop Loss") //_________________ RoC Definition _________________ rocLength = input(title="ROC Length", type=input.integer, minval=1, defval=186) smoothingLength = input(title="Smoothing Length", type=input.integer, minval=1, defval=50) src = input(title="Source", type=input.source, defval=close) ma = ema(src, smoothingLength) mom = change(ma, rocLength) sroc = nz(ma[rocLength]) == 0 ? 100 : mom == 0 ? 0 : 100 * mom / ma[rocLength] //srocColor = sroc >= 0 ? #0ebb23 : color.red //plot(sroc, title="SROC", linewidth=2, color=srocColor, transp=0) //hline(0, title="Zero Level", linestyle=hline.style_dotted, color=#989898) //_________________ Donchian Channel _________________ length1 = input(53, minval=1, title="Upper Channel") length2 = input(53, minval=1, title="Lower Channel") offset_bar = input(91,minval=0, title ="Offset Bars") upper = highest(length1) lower = lowest(length2) basis = avg(upper, lower) DC_UP_Band = upper[offset_bar] DC_LW_Band = lower[offset_bar] l = plot(DC_LW_Band, style=plot.style_line, linewidth=1, color=color.red) u = plot(DC_UP_Band, style=plot.style_line, linewidth=1, color=color.aqua) fill(l,u,color = color.new(color.aqua,transp = 90)) //_________________ Bears Power _________________ wmaBP_period = input(65,minval=1,title="BearsP WMA Period") line_wma = ema(close, wmaBP_period) BP = low - line_wma //_________________ Balance of Power _________________ ES_BoP=input(15, title="BoP Exponential Smoothing") BOP=(close - open) / (high - low) SBOP = rma(BOP, ES_BoP) //_________________ Alligator _________________ //_________________ CCI _________________ //_________________ Moving Average _________________ sma_period = input(74, minval = 1 , title = "SMA Period") sma_shift = input(37, minval = 1 , title = "SMA Shift") sma_primary = sma(close,sma_period) SMA_sh = sma_primary[sma_shift] plot(SMA_sh, style=plot.style_line, linewidth=2, color=color.yellow) //_________________ Long Entry Conditions _________________// MA_Lcnd = SMA_sh > low and SMA_sh < high ROC_Lcnd = sroc < 0 DC_Lcnd = open < DC_LW_Band BP_Lcnd = BP[1] < BP[0] and BP[1] < BP[2] BOP_Lcnd = SBOP[1] < SBOP[0] //_________________ Short Entry Conditions _________________// MA_Scnd = SMA_sh > low and SMA_sh < high ROC_Scnd = sroc > 0 DC_Scnd = open > DC_UP_Band BP_Scnd = BP[1] > BP[0] and BP[1] > BP[2] BOP_Scnd = SBOP[1] > SBOP[0] //_________________ OPEN POSITION __________________// if strategy.position_size == 0 strategy.entry(id = "BUY", long = true , when = MA_Lcnd and ROC_Lcnd and DC_Lcnd and BP_Lcnd and BOP_Lcnd) strategy.entry(id = "SELL", long = false , when = MA_Scnd and ROC_Scnd and DC_Scnd and BP_Scnd and BOP_Scnd) //_________________ CLOSE POSITION __________________// strategy.exit(id = "CLOSE BUY", from_entry = "BUY", profit = TP , loss = SL) strategy.exit(id = "CLOSE SELL", from_entry = "SELL" , profit = TP , loss = SL) //_________________ TP and SL Plot __________________// currentPL= strategy.openprofit pos_price = strategy.position_avg_price open_pos = strategy.position_size TP_line = (strategy.position_size > 0) ? (pos_price + TP/100) : strategy.position_size < 0 ? (pos_price - TP/100) : 0.0 SL_line = (strategy.position_size > 0) ? (pos_price - SL/100) : strategy.position_size < 0 ? (pos_price + SL/100) : 0.0 // hline(TP_line, title = "Take Profit", color = color.green , linestyle = hline.style_dotted, editable = false) // hline(SL_line, title = "Stop Loss", color = color.red , linestyle = hline.style_dotted, editable = false) Tline = plot(TP_line != 0.0 ? TP_line : na , title="Take Profit", color=color.green, trackprice = true, show_last = 1) Sline = plot(SL_line != 0.0 ? SL_line : na, title="Stop Loss", color=color.red, trackprice = true, show_last = 1) Pline = plot(pos_price != 0.0 ? pos_price : na, title="Stop Loss", color=color.gray, trackprice = true, show_last = 1) fill(Tline , Pline, color = color.new(color.green,transp = 90)) fill(Sline , Pline, color = color.new(color.red,transp = 90)) //_________________ Alert __________________// //alertcondition(condition = , title = "Position Alerts", message = "Bagheri IG Ether\n Symbol: {{ticker}}\n Type: {{strategy.order.id}}") //_________________ Label __________________// inMyPrice = input(title="My Price", type=input.float, defval=0) inLabelStyle = input(title="Label Style", options=["Upper Right", "Lower Right"], defval="Lower Right") posColor = color.new(color.green, 25) negColor = color.new(color.red, 25) dftColor = color.new(color.aqua, 25) posPnL = (strategy.position_size != 0) ? (close * 100 / strategy.position_avg_price - 100) : 0.0 posDir = (strategy.position_size > 0) ? "long" : strategy.position_size < 0 ? "short" : "flat" posCol = (strategy.openprofit > 0) ? posColor : (strategy.openprofit < 0) ? negColor : dftColor myPnL = (inMyPrice != 0) ? (close * 100 / inMyPrice - 100) : 0.0 var label lb = na label.delete(lb) lb := label.new(bar_index, close, color=posCol, style=inLabelStyle=="Lower Right"?label.style_label_upper_left:label.style_label_lower_left, text= "╔═══════╗" +"\n" + "Pos: " +posDir +"\n" + "Pos Price: "+tostring(strategy.position_avg_price) +"\n" + "Pos PnL: " +tostring(posPnL, "0.00") + "%" +"\n" + "Profit: " +tostring(strategy.openprofit, "0.00") + "$" +"\n" + "TP: " +tostring(TP_line, "0.00") +"\n" + "SL: " +tostring(SL_line, "0.00") +"\n" + "╚═══════╝")