Estratégia de acompanhamento da tendência de preços do momento

Autora:ChaoZhang, Data: 2023-11-13 16:44:58
Tags:

img

Resumo

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.

Estratégia lógica

A estratégia de acompanhamento da tendência dos preços de impulso aplica-se principalmente aos seguintes indicadores técnicos:

  1. 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.

  2. Indicador de poder de touros e ursos: Este indicador reflete a comparação de poder entre touros e ursos.

  3. Divergência: Este indicador identifica a inversão da tendência através do cálculo da divergência de preço e volume.

  4. 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.

  5. 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.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. O uso de múltiplos indicadores para determinar tendências reduz a probabilidade de erro de julgamento.

  2. A utilização de divergências de indicadores permite captar com precisão os pontos de inversão da tendência.

  3. A combinação de canais e médias móveis ajuda a determinar a tendência geral.

  4. A definição de stop profit e stop loss assegura os lucros em tempo hábil e evita a expansão dos drawdowns.

  5. Os parâmetros ajustáveis tornam a estratégia adaptável a diferentes períodos e produtos.

  6. A lógica clara facilita a otimização.

Análise de riscos

Os riscos potenciais desta estratégia incluem:

  1. Os múltiplos indicadores podem aumentar a probabilidade de sinal errôneo.

  2. Pontos de stop loss definidos muito pequenos podem aumentar a probabilidade de stop loss, enquanto pontos muito amplos podem expandir os drawdowns.

  3. A aplicação cega em períodos de mercado variados pode conduzir a uma inadaptabilidade.

  4. É necessário um capital suficiente para sustentar unidades de posição elevada para alcançar retornos excessivos.

  5. Os riscos de excesso de adaptação ao backtest existem, o desempenho das negociações reais é incerto.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Otimizar os parâmetros dos indicadores para encontrar as combinações ideais para diferentes períodos e produtos.

  2. Introduzir algoritmos de aprendizagem de máquina para encontrar automaticamente os parâmetros ideais.

  3. Construir mecanismos de stop loss adaptativos com base nas condições do mercado.

  4. Incorporar fatores de alta frequência e fundamentos para melhorar o alfa.

  5. Desenvolver enquadramentos de ensaios automatizados para otimização de parâmetros e verificação de desempenho.

  6. Introduzir módulos de gestão de riscos para controlar o dimensionamento das posições e reduzir os drawdowns.

  7. Adicionar negociação e testes simulados e ao vivo para melhorar a estabilidade.

Conclusão

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" +
      "╚═══════╝")






Mais.